关于Socket通信中的数据流

来源:百度知道 编辑:UC知道 时间:2024/06/07 19:12:04
客户端向服务器传输一个文件, 因为可能是二进制文件, 所以使用的是In/OutputStream, 不是Reader, Writer
服务器的方法是:
public void receive(){
try{
fileWriter = new FileOutputStream(new File("D:\\b.txt"));
byte[] b = new byte[1024];
int i;
while((i = netReader.read(b)) != -1){
//netReader与Socket的输入绑定, -1表示到达文件末尾
fileWriter.write(b, 0, i);
}
fileWriter.close();
}
catch(FileNotFoundException e){
System.out.println("The file is not found.");
}
catch(IOException e){
e.printStackTrace();
}
}
客户机的方法是:
public void upload(){
try{
fileReader = new FileInputStream(new File("d:\\a.txt"));
byte[] b = new byte[1024];
int i;
while((i = fileReader.read(b)) != -1){
System.out.println(i);
System.out.println("send");
netWriter

1 客户端写EOF过去,服务器判断得到EOF就结束死循环。
2 客户端先发送一个文件字节数过去,服务器得到需要的字节数之后退出。

第2种是常用的方法。

服务端为什么还要读出写入字节数组?
直接得到流不是可以来么
比如图片
客户端把图片读出数据写入字节数组
服务端直接把得到的流作为参数传给Image.FromStream()
这是.NET的写法。
JAVA未知。只是说个想法。希望对你有帮助

客户端传输完成后直接关闭流就可以了, 如果客户端关闭了socket会读到-1,所以不需要你显示地调用netWriter.write(end); 这种语句

发送文件前先把文件段数量发过去吧,这样客户端就知道收多少次了