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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙百鑫 高级黑马   /  2013-5-3 10:42  /  1869 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. /*
  2. 编写一个聊天程序。
  3. 有收数据的部分,和发数据的部分。
  4. 这两部分需要同时执行。
  5. 那就需要用到多线程技术。
  6. 一个线程控制收,一个线程控制发。

  7. 因为收和发动作是不一致的,所以要定义两个run方法。
  8. 而且这两个方法要封装到不同的类中。

  9. */
  10. import java.net.*;
  11. import java.io.*;
  12. class Send implements Runnable//发送端
  13. {
  14.         private DatagramSocket ds;
  15.         public Send(DatagramSocket ds)
  16.         {
  17.                 this.ds=ds;
  18.         }
  19.         public void run()//多线程覆盖run方法
  20.         {
  21.                 try
  22.                 {
  23.                         //键盘录入
  24.                         BufferedReader bufr=
  25.                                 new BufferedReader(new InputStreamReader(System.in));

  26.                         String len=null;

  27.                         while((len=bufr.readLine())!=null)
  28.                         {
  29.                                 //转换成字节数组发送数据
  30.                                 byte[] buf=len.getBytes();

  31.                                 DatagramPacket dp=
  32.                                         new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10001);

  33.                                 ds.send(dp);

  34.                                 if("886".equals(len))
  35.                                         break;
  36.                         }
  37.                 }
  38.                 catch (Exception e)
  39.                 {
  40.                         throw new RuntimeException("发送端失败");
  41.                 }
  42.         }
  43. }
  44. class Rece implements Runnable//接收端
  45. {
  46.         private DatagramSocket ds;
  47.         public Rece(DatagramSocket ds)
  48.         {
  49.                 this.ds=ds;
  50.         }
  51.         public void run()
  52.         {
  53.                 try
  54.                 {
  55.                         while(true)
  56.                         {
  57.                                 //建立字节数组接收数据
  58.                                 byte[] buf=new byte[1024];

  59.                                 DatagramPacket dp=
  60.                                         new DatagramPacket(buf,buf.length);

  61.                                
  62.                                 ds.receive(dp);

  63.                                 //获取IP
  64.                                 String ip=dp.getAddress().getHostAddress();

  65.                                 //将包转化成字符串
  66.                                 String data=new String(dp.getData(),0,dp.getLength());

  67.                                 if("886".equals(data))
  68.                                 {
  69.                                         System.out.println(ip+"...离开聊天室");
  70.                                         break;
  71.                                 }
  72.                                 //打印
  73.                                 System.out.println(ip+".,"+data);
  74.                         }
  75.                 }
  76.                 catch (Exception e)
  77.                 {
  78.                         throw new RuntimeException("接收端失败");
  79.                 }
  80.         }
  81. }

  82. class  ChatDemo
  83. {
  84.         public static void main(String[] args) throws Exception
  85.         {
  86.                 //创建接收端和发送端
  87.                 DatagramSocket sendSocket = new DatagramSocket();
  88.                 DatagramSocket receSocket = new DatagramSocket(10001);

  89.                 //开启多线程
  90.                 new Thread(new Send(receSocket)).start();
  91.                 new Thread(new Rece(sendSocket)).start();
  92.         }
  93. }
复制代码
我知道肯定是个小问题....可是.找了半天还找到.发送数据没反应
打印结果

D:\java0410\day23>java ChatDemo
看吧没结果吧....
啊啊啊 啊啊

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

9 个回复

倒序浏览
抢鑫鑫的沙发
回复 使用道具 举报
楼主好搞笑
回复 使用道具 举报
线程没学好啊!
回复 使用道具 举报
李德全 发表于 2013-5-3 11:27
楼主好搞笑

肿么了???? - -
回复 使用道具 举报
harborbest 发表于 2013-5-3 11:29
线程没学好啊!

怎么;了啊 啊啊 啊  - -
回复 使用道具 举报
大哥,您这是什么玩意?
                new Thread(new Send(receSocket)).start();

                new Thread(new Rece(sendSocket)).start();

这传的是什么参数啊!!!哪个是发送端哪个是接收端搞乱了吧!你参数写反了!
回复 使用道具 举报
参数ds没传
回复 使用道具 举报
本帖最后由 Jiewin 于 2013-7-6 21:23 编辑

楼主让我想起了一个故事,有两个老农到镇上买了一口大水缸,由于水缸大,回家路途远,
两人费了一天的时间小心翼翼的抬到了家门口,特别高兴,正想总算安全太到家了,
正当他们要把水缸抬进家里时,不小心一个人被门卡拌了一下,摔倒了,于是水缸也摔到地上破了!

这个故事告诉我们任何时候都不能掉以轻心。

8楼说的对,参数传反了!应该是下面这样
new Thread(new Send(sendSocket)).start();
new Thread(new Rece(receSocket)).start();


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马