黑马程序员技术交流社区

标题: TCP上传数据时少了4K为什么?见图! [打印本页]

作者: huoxy    时间: 2014-12-14 22:09
标题: TCP上传数据时少了4K为什么?见图!
  1. public class UpLoadServer
  2. {
  3.         public static void main(String[] args) throws Exception
  4.         {
  5.                 //创建服务器端套接字监听指定端口
  6.                 ServerSocket server = new ServerSocket(11111);

  7.                 //获取连接的客户端套接字,并显示连接成功
  8.                 Socket client = server.accept();
  9.                 String ip = client.getInetAddress().getHostAddress();
  10.                 System.out.println(ip+" 连接成功!");

  11.                 //获取客户端套接字输入流,接收客户端上传的数据
  12.                 BufferedInputStream bufIn =
  13.                                 new BufferedInputStream(client.getInputStream());
  14.                
  15.                 //定义缓冲区输出流,向服务器端写数据
  16.                 BufferedOutputStream bufOut =
  17.                                 new BufferedOutputStream(new FileOutputStream("d:\\heima_server.jpg"));

  18.                 //将客户端上传的数据存储在服务器端
  19.                 byte[] buf = new byte[1024];
  20.                 int len = 0;
  21.                 while ((len = bufIn.read(buf))!=-1)
  22.                 {
  23.                         bufOut.write(buf,0,len);
  24.                 }

  25.                 //上传完成后,向客户端反馈传输结果
  26.                 OutputStream out = client.getOutputStream();
  27.                 out.write("上传成功!".getBytes());

  28.                 //关闭资源
  29.                 bufOut.close();
  30.                 client.close();
  31.                 server.close();
  32.         }
  33. }

  34. public class UpLoadClient {

  35.         public static void main(String[] args) throws Exception
  36.         {
  37.                 //在建立客户端套接字连接到指定服务器端
  38.                 Socket client = new Socket("192.168.100.4",11111);

  39.                 //用字节缓冲区对象读取本地的文件
  40.                 BufferedInputStream bufIn =
  41.                                 new BufferedInputStream(new FileInputStream("D:\\heima.jpg"));
  42.                
  43.                 //获取客户端套接字的输出流,向服务器端上传数据
  44.                 BufferedOutputStream bufOut =
  45.                                 new BufferedOutputStream(client.getOutputStream());

  46.                 //将本地文件上传到服务器端
  47.                 byte[] buf = new byte[1024];
  48.                 int len = 0;
  49.                 while ((len = bufIn.read(buf))!=-1)
  50.                 {
  51.                         bufOut.write(buf,0,len);
  52.                 }
  53.                
  54.                 //文件上传完毕,关闭输出流
  55.                 client.shutdownOutput();

  56.                 //获取客户端套接字输入流,接收服务器端反馈信息
  57.                 InputStream in = client.getInputStream();
  58.                 byte[] result = new byte[1024];
  59.                 int num = in.read(result);
  60.                 System.out.println(new String(result,0,num));

  61.                 //关闭资源
  62.                 bufIn.close();
  63.                 client.close();
  64.         }
  65. }
复制代码

少4K数据.JPG (29.98 KB, 下载次数: 19)

少4K数据.JPG

作者: huoxy    时间: 2014-12-14 22:26
另:刚刚试了把所有的缓冲区流对象都去掉时,用基础的字节流可以完整的复制,为什么用了缓冲区会少4K数据呢?求大神指导!
作者: 小小志    时间: 2014-12-14 22:29
肯定你是有 没有刷新的问题,这个问题问的太明显了 哥哥!!
作者: huoxy    时间: 2014-12-14 22:34
小小志 发表于 2014-12-14 22:29
肯定你是有 没有刷新的问题,这个问题问的太明显了 哥哥!!

字节流不用刷新的吧!
作者: huoxy    时间: 2014-12-15 09:29
小小志 发表于 2014-12-14 22:29
肯定你是有 没有刷新的问题,这个问题问的太明显了 哥哥!!

好像是这个问题,把客户端的bufOut.flush();之后就可以完整复制了!但问题来了:不是一直说字节流不需要刷新的吗?能解释一下吗?
作者: Rain2692    时间: 2014-12-15 12:54
huoxy 发表于 2014-12-15 09:29
好像是这个问题,把客户端的bufOut.flush();之后就可以完整复制了!但问题来了:不是一直说字节流不需要 ...

没有人说字节流不需要刷新的,你说的是PrintStream吧,这个内部也有刷新的。。。
作者: 小小志    时间: 2014-12-15 12:55
http://bbs.itheima.com/thread-109546-1-1.html
作者: huoxy    时间: 2014-12-15 13:36
Rain2692 发表于 2014-12-15 12:54
没有人说字节流不需要刷新的,你说的是PrintStream吧,这个内部也有刷新的。。。 ...

老毕视频里第一次将字节流的时候就说了字节流不需要刷新。看了小小志哥们分享的那个链接,有点明白了,只要涉及缓冲区的字节流都需要刷新。




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