黑马程序员技术交流社区

标题: TCP传输图片的问题,来看看吧,大神们 [打印本页]

作者: qinhaihang    时间: 2015-5-26 23:09
标题: TCP传输图片的问题,来看看吧,大神们
我使用下面的代码,结果从客户端向服务器端传输的图片少了两个字节,能看看是怎么回事吗?
  1. //客户端:
  2. import java.io.*;
  3. import java.net.*;

  4. public class TextClient {

  5.         public static void main(String[] args) throws Exception {
  6.                 //建立服务
  7.                 Socket client = new Socket("192.168.1.104", 12233); //可以try
  8.                 //建立一个数据源,作为拷贝数据源
  9.                 BufferedInputStream bufi = new BufferedInputStream(new FileInputStream("e:\\微信订阅号图片\\123.png"));
  10.                 //建立一个字节流,将数据传输出到服务端
  11.                 BufferedOutputStream bufout = new BufferedOutputStream(client.getOutputStream());
  12.                
  13.                 //开始读取文件
  14.                 int bytes = 0;
  15.                 while((bytes=bufi.read())!=-1){
  16.                         //
  17.                         bufout.write(bytes);
  18.                 }
  19.                
  20.                 client.shutdownOutput();//关闭客户端的输出流,相当于给流中加一个结束标记
  21.                
  22.                 //接收服务端反馈回来的信息
  23.                 BufferedReader bufin = new BufferedReader(new InputStreamReader(client.getInputStream()));
  24.                 String str = bufin.readLine();
  25.                 System.out.println(str);
  26.                
  27.                 bufi.close();
  28.                 client.close();
  29.                
  30.         }

  31. }
复制代码


//服务器端
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行修改一下
  1. //开始读取文件
  2. //自定义缓冲区
  3. byte[] buf = new byte[1024];
  4. int bytes = 0;
  5. while((bytes=bufi.read(buf))!=-1){
  6.     //将数据写入自定义缓冲区
  7.     bufout.write(buf,0,bytes);
  8.     //将自定义缓冲数据刷入缓冲区
  9.     bufout.flush();
  10. }
复制代码


作者: qinhaihang    时间: 2015-5-27 12:44
马也keyboard 发表于 2015-5-27 09:52
问题应该是出在客户端,在第19行,缓冲输出流写入后没有及时的刷新(flush()方法),导致数据传输不完整, ...

恩恩,这一点提醒了我,多谢多谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2