黑马程序员技术交流社区
标题:
TCP传输图片的问题,来看看吧,大神们
[打印本页]
作者:
qinhaihang
时间:
2015-5-26 23:09
标题:
TCP传输图片的问题,来看看吧,大神们
我使用下面的代码,结果从客户端向服务器端传输的图片少了两个字节,能看看是怎么回事吗?
//客户端:
import java.io.*;
import java.net.*;
public class TextClient {
public static void main(String[] args) throws Exception {
//建立服务
Socket client = new Socket("192.168.1.104", 12233); //可以try
//建立一个数据源,作为拷贝数据源
BufferedInputStream bufi = new BufferedInputStream(new FileInputStream("e:\\微信订阅号图片\\123.png"));
//建立一个字节流,将数据传输出到服务端
BufferedOutputStream bufout = new BufferedOutputStream(client.getOutputStream());
//开始读取文件
int bytes = 0;
while((bytes=bufi.read())!=-1){
//
bufout.write(bytes);
}
client.shutdownOutput();//关闭客户端的输出流,相当于给流中加一个结束标记
//接收服务端反馈回来的信息
BufferedReader bufin = new BufferedReader(new InputStreamReader(client.getInputStream()));
String str = bufin.readLine();
System.out.println(str);
bufi.close();
client.close();
}
}
复制代码
//服务器端
import java.net.*;
import java.io.*;
public class TextServer {
public static void main(String[] args) throws Exception{
//建立服务
ServerSocket server = new ServerSocket(12233);
//接收客户端传来的socket数据
Socket client = server.accept();
//获取客户端IP地址
String ip = client.getInetAddress().getHostAddress();
System.out.println(ip+"connected");
//将数据写入输入流中
BufferedInputStream bufis = new BufferedInputStream(client.getInputStream());
//创建输出流
BufferedOutputStream bufout = new BufferedOutputStream(new FileOutputStream("123_server.png"));
//读取数据
int num = 0;
while((num=bufis.read())!=-1){
bufout.write(num);
}
//反馈数据到客户端
BufferedWriter bufr = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
String str = "服务端接收数据结束!";
bufr.write(str);
bufr.newLine();
bufr.flush();
client.close();
bufis.close();
bufout.close();
bufr.close();
}
}
大神们来看看吧
作者:
王显军
时间:
2015-5-26 23:12
希望 早日成为黑马一员。
作者:
马也keyboard
时间:
2015-5-27 09:52
问题应该是出在客户端,在第19行,缓冲输出流写入后没有及时的刷新(flush()方法),导致数据传输不完整,在使用完缓冲输出后一定要记得刷新数据。同时建议自定义一个缓冲区提高效率,可以把第15到20行修改一下
//开始读取文件
//自定义缓冲区
byte[] buf = new byte[1024];
int bytes = 0;
while((bytes=bufi.read(buf))!=-1){
//将数据写入自定义缓冲区
bufout.write(buf,0,bytes);
//将自定义缓冲数据刷入缓冲区
bufout.flush();
}
复制代码
作者:
qinhaihang
时间:
2015-5-27 12:44
马也keyboard 发表于 2015-5-27 09:52
问题应该是出在客户端,在第19行,缓冲输出流写入后没有及时的刷新(flush()方法),导致数据传输不完整, ...
恩恩,这一点提醒了我,多谢多谢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2