A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张然龙   /  2014-6-7 21:33  /  2648 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张然龙 于 2014-6-8 08:38 编辑

这样上传图片会丢数据,请问问题是出在哪里呢???

  1. class  Fasong implements Runnable
  2. {
  3.         public void run()
  4.         {
  5.                 try
  6.                 {
  7.                         Socket s=new Socket ("192.168.1.106",19892);
  8.                         BufferedOutputStream bo=new BufferedOutputStream(s.getOutputStream());
  9.                         BufferedInputStream bi=new BufferedInputStream(new FileInputStream("D:\\截图.bmp"));
  10.                         byte b[]=new byte[1024];
  11.                         int len;
  12.                         while((len=bi.read(b))!=-1)
  13.                         {
  14.                                 bo.write(b,0,len);
  15.                         }
  16.                         s.shutdownOutput();
  17.                         s.close();
  18.                         bi.close();
  19.                         System.out.println("图片发送完成!");
  20.                 } catch (Exception e) {
  21.                         e.printStackTrace();
  22.                 }
  23.         }
  24. }

  25. class Jieshou implements Runnable
  26. {
  27.         public void run()
  28.         {
  29.                 try
  30.                 {
  31.                         ServerSocket ss=new ServerSocket(19892);
  32.                         Socket s=ss.accept();
  33.                         BufferedInputStream bi=new BufferedInputStream(s.getInputStream());
  34.                         BufferedOutputStream bo=new BufferedOutputStream(new FileOutputStream("D:\\截图保存.bmp"));
  35.                         byte b[]=new byte[1024];
  36.                         int len;
  37.                         while((len=bi.read(b))!=-1)
  38.                         {
  39.                                 bo.write(b,0,len);
  40.                         }
  41.                         bo.close();
  42.                         ss.close();
  43.                         System.out.println("上传成功!");
  44.                 } catch (Exception e) {
  45.                         e.printStackTrace();
  46.                 }
  47.         }
  48. }

  49. public class Demo
  50. {
  51.         public static void main(String[] args)throws Exception
  52.         {
  53.                 new Thread(new Jieshou()).start();
  54.                 Thread.sleep(1000);
  55.                 new Thread(new Fasong()).start();
  56.         }
  57. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

6 个回复

倒序浏览
肿么又是你,,,,缓冲流写完数据要flush一下
  1. class  Fasong implements Runnable
  2. {
  3.         public void run()
  4.         {
  5.                 try
  6.                 {
  7.                         Socket s=new Socket ("192.168.1.101",19892);
  8.                         BufferedOutputStream bo=new BufferedOutputStream(s.getOutputStream());
  9.                         BufferedInputStream bi=new BufferedInputStream(new FileInputStream("D:\\截图.bmp"));
  10.                         byte b[]=new byte[1024];
  11.                         int len;
  12.                         while((len=bi.read(b))!=-1)
  13.                         {
  14.                                 bo.write(b,0,len);
  15.                                 bo.flush();//这里加flush
  16.                         }
  17.                         s.shutdownOutput();
  18.                         s.close();
  19.                         bi.close();
  20.                         System.out.println("图片发送完成!");
  21.                 } catch (Exception e) {
  22.                         e.printStackTrace();
  23.                 }
  24.         }
  25. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1 赞一个!

查看全部评分

回复 使用道具 举报
月光海 发表于 2014-6-7 21:42
肿么又是你,,,,缓冲流写完数据要flush一下

老大,刷新之后果然好了!!在指点下呗, 为啥不刷新就丢包呢?
真的是救星啊....为什么以前没刷的都传过来了,却只丢了一部分呢?
3133494 :原来的图片大小
3129344 :上传回本地后的大小
4150相减之后...4150个字节消失了
回复 使用道具 举报
那些地方必须刷新啊
回复 使用道具 举报
张然龙 发表于 2014-6-7 22:10
老大,刷新之后果然好了!!在指点下呗, 为啥不刷新就丢包呢?
真的是救星啊....为什么以前没刷的都传过来了, ...

数据在缓冲区中只有刷新一下里面的数据才会完全到目的地中。之前的一部分没有丢掉是因为之前的数据在缓冲区中,然后输出流从缓冲区中取了部分数据写了出去,不是全都存到缓冲区中之后才一起写的
如果你不刷新也可以这样写:
  1. class  Fasong implements Runnable
  2. {
  3.         public void run()
  4.         {
  5.                 try
  6.                 {
  7.                         Socket s=new Socket ("192.168.1.101",19892);
  8.                         BufferedOutputStream bo=new BufferedOutputStream(s.getOutputStream());
  9.                         BufferedInputStream bi=new BufferedInputStream(new FileInputStream("D:\\截图.bmp"));
  10.                         byte b[]=new byte[1024];
  11.                         int len;
  12.                         while((len=bi.read(b))!=-1)
  13.                         {
  14.                                 bo.write(b,0,len);
  15.                                // bo.flush();//这里加flush
  16.                         }
  17.                         bo.close();//加这一句,这句中包含flush,也将网络输出流关闭了
  18.                         bi.close();
  19.                        // s.shutdownOutput();
  20.                         s.close();
  21.                        
  22.                         System.out.println("图片发送完成!");
  23.                 } catch (Exception e) {
  24.                         e.printStackTrace();
  25.                 }
  26.                
  27.         }
  28. }
复制代码
回复 使用道具 举报
月光海 发表于 2014-6-7 22:55
数据在缓冲区中只有刷新一下里面的数据才会完全到目的地中。之前的一部分没有丢掉是因为之前的数据在缓冲 ...

不好意思 我忘了自己是写的缓冲区了,!!!多谢 其实我记得是字节流不用刷,忘了是缓冲去了!  不好意思...
回复 使用道具 举报
dede风 中级黑马 2014-11-28 13:33:36
7#
这都行.我不懂.学习下.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马