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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张然龙 金牌黑马   /  2014-6-7 14:43  /  2071 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张然龙 于 2014-6-7 21:11 编辑

心血来潮想用UDP来传输图片,遇到几个不解的问:
1.我给接收端发了个结束标记over,为什么没退出循环来呢....


2.因为UDP传输不需要确认是否在线,所以我发图片怕丢包加了个一毫秒延时.图片完美的发送了过来 ,而且打开图片看了下,一点问题都没有.
但是发现大小竟然多了2994K.....为啥呢?

代码如下:↓

  1. class  Fasong implements Runnable
  2. {
  3.         public void run()
  4.         {
  5.                 try
  6.                 {
  7.                         DatagramSocket ds=new DatagramSocket();
  8.                         byte []b=new byte[1024];
  9.                         InputStream is=new FileInputStream("D:\\截图.bmp");
  10.                         int len;
  11.                         while((len=is.read(b))!=-1)
  12.                         {
  13.                                 DatagramPacket dp=new DatagramPacket(b,len,InetAddress.getByName("192.168.1.106"),50012);
  14.                                 ds.send(dp);
  15.                                 Thread.sleep(1);
  16.                         }
  17.                         b="over".getBytes();
  18.                         DatagramPacket dp=new DatagramPacket(b,"over".length(),InetAddress.getByName("192.168.1.106"),50012);
  19.                         ds.send(dp);
  20.                         ds.close();
  21.                         is.close();
  22.                         System.out.println("传输完毕!");
  23.                 } catch (Exception e) {
  24.                         e.printStackTrace();
  25.                 }
  26.         }
  27. }
  28. class Jieshou implements Runnable
  29. {
  30.         public void run()
  31.         {
  32.                 try
  33.                 {
  34.                         DatagramSocket ds=new DatagramSocket(50012);
  35.                         byte []b=new byte [1024];
  36.                         OutputStream os=new FileOutputStream("D:\\截图备份.bmp");
  37.                         while(true)
  38.                         {
  39.                                 DatagramPacket dp=new DatagramPacket(b,b.length);
  40.                                 ds.receive(dp);
  41.                                 if(new String(b).contains("over"))
  42.                                 {
  43.                                         break;
  44.                                 }
  45.                                 os.write(b);
  46.                         }
  47.                         System.out.println("接收完毕!");
  48.                         ds.close();
  49.                         os.close();
  50.                 } catch (Exception e) {
  51.                         e.printStackTrace();
  52.                 }
  53.         }
  54. }
  55. public class Demo
  56. {
  57.         public static void main(String[] args)throws Exception
  58.         {
  59.                 new Thread(new Jieshou()).start();
  60.                 Thread.sleep(100);
  61.                 new Thread(new Fasong()).start();
  62.         }
  63. }
复制代码



评分

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

查看全部评分

4 个回复

正序浏览
月光海 发表于 2014-6-7 20:55
接收的类的循环改成这样

月光海啊  搞定了 能停下来了 多谢多谢...
回复 使用道具 举报
月光海 发表于 2014-6-7 20:55
接收的类的循环改成这样

多谢多谢!  我还没注意,  但是程序为啥停不下来呢?
回复 使用道具 举报
接收的类的循环改成这样
  1.   while(true)
  2.                         {
  3.                                 DatagramPacket dp=new DatagramPacket(b,b.length);
  4.                                 ds.receive(dp);
  5.                                 if(new String(b).contains("over"))
  6.                                 {
  7.                                         break;
  8.                                 }
  9.                                 os.write(b,0,dp.getLength());//这里改成这样,只写出去得到的数据的长度,而不是将整个字节数组写出去
  10.                         }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
各位大侠路过指点下啊:Q
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马