黑马程序员技术交流社区

标题: UDP问题 求助! 高手指点下 , 谢谢! [打印本页]

作者: 张然龙    时间: 2014-6-7 14:43
标题: UDP问题 求助! 高手指点下 , 谢谢!
本帖最后由 张然龙 于 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. }
复制代码




作者: 张然龙    时间: 2014-6-7 20:45
各位大侠路过指点下啊:Q
作者: 月光海    时间: 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.                         }
复制代码

作者: 张然龙    时间: 2014-6-7 21:02
月光海 发表于 2014-6-7 20:55
接收的类的循环改成这样

多谢多谢!  我还没注意,  但是程序为啥停不下来呢?
作者: 张然龙    时间: 2014-6-7 21:11
月光海 发表于 2014-6-7 20:55
接收的类的循环改成这样

月光海啊  搞定了 能停下来了 多谢多谢...




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