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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 唐长智 中级黑马   /  2013-1-24 17:18  /  1879 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 唐长智 于 2013-1-25 08:58 编辑

基本和老毕视频里的代码一样,但是在客户端输入886之后,程序应该停止的。但是,实际控制台却并没有停止,就像假死一样,输入什么都没用,只能Ctrl+C强行结束,这是由于多线程的原因么?
请大神帮答。
  1. import java.io.*;
  2. import java.net.*;

  3. class Send implements Runnable{
  4.         private DatagramSocket ds;
  5.         public Send(DatagramSocket ds){
  6.                 this.ds = ds;
  7.         }
  8.         
  9.         public void run(){
  10.                 try{
  11.                         BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
  12.                         
  13.                         String line = null;
  14.                         
  15.                         while((line = bufr.readLine())!= null){
  16.                                 byte[] buf = line.getBytes();
  17.                                 
  18.                                 DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.53"),10003);
  19.                                 
  20.                                 ds.send(dp);
  21.                                 
  22.                                 if("886".equals(line)){
  23.                                 break;
  24.                                 }
  25.                         }
  26.                 }
  27.                 catch(Exception e){
  28.                         throw new RuntimeException("读取失败");
  29.                 }
  30.         }
  31. }

  32. class Rece implements Runnable{
  33.         private DatagramSocket ds;
  34.         
  35.         public Rece(DatagramSocket ds){
  36.                 this.ds = ds;
  37.         }
  38.         
  39.         public void run(){
  40.                 try{
  41.                         while(true){
  42.                                 byte[] buf = new byte[1024];
  43.                                 DatagramPacket dp = new DatagramPacket(buf,buf.length);
  44.                                 
  45.                                 ds.receive(dp);
  46.                                 String ip = dp.getAddress().getHostAddress();
  47.                                 
  48.                                 String data = new String(dp.getData(),0,dp.getLength());
  49.                                 
  50.                                 System.out.println(ip + "...." + data);

  51.                         }
  52.                 }
  53.                 catch(Exception e){
  54.                         throw new RuntimeException("接收失败");
  55.                 }        
  56.         }
  57. }

  58. class ChatDemo{
  59.         public static void main(String args[])throws Exception{
  60.                 DatagramSocket sendSocket = new DatagramSocket();
  61.                 DatagramSocket receSocket = new DatagramSocket(10003);
  62.                
  63.                 new Thread(new Send(sendSocket)).start();
  64.                 new Thread(new Rece(receSocket)).start();
  65.         }
  66. }
复制代码

评分

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

查看全部评分

5 个回复

倒序浏览
试一下在Send类的  if("886".equals(line)){ds.send(“886”);//添加给接受端发一个结束标记
break; }
然后在Rece里判断下if("886".equals(line)){break; }
把Send和Rece同时break;

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

回复 使用道具 举报
  1. import java.io.*;
  2. import java.net.*;

  3. class Send implements Runnable{
  4.         private DatagramSocket ds;
  5.         public Send(DatagramSocket ds){
  6.                 this.ds = ds;
  7.         }
  8.         
  9.         public void run(){
  10.                 try{
  11.                         BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
  12.                         
  13.                         String line = null;
  14.                         
  15.                         while((line = bufr.readLine())!= null){
  16.                                 byte[] buf = line.getBytes();
  17.                                 
  18.                                 DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),8888);
  19.                                 
  20.                                 ds.send(dp);
  21.                                 
  22.                                 if("886".equals(line)){
  23.                                         System.exit(0);                         //楼主,在这里就不该使用break了,而应该直接退出程序;
  24.                                 }
  25.                         }
  26.                 }
  27.                 catch(Exception e){
  28.                         throw new RuntimeException("读取失败");
  29.                 }
  30.         }
  31. }

  32. class Rece implements Runnable{
  33.         private DatagramSocket ds;
  34.         
  35.         public Rece(DatagramSocket ds){
  36.                 this.ds = ds;
  37.         }
  38.         
  39.         public void run(){
  40.                 try{
  41.                         while(true){
  42.                                 byte[] buf = new byte[1024];
  43.                                 DatagramPacket dp = new DatagramPacket(buf,buf.length);
  44.                                 
  45.                                 ds.receive(dp);
  46.                                 String ip = dp.getAddress().getHostAddress();
  47.                                 
  48.                                 String data = new String(dp.getData(),0,dp.getLength());
  49.                                 
  50.                                 System.out.println(ip + "...." + data);

  51.                         }
  52.                 }
  53.                 catch(Exception e){
  54.                         throw new RuntimeException("接收失败");
  55.                 }        
  56.         }
  57. }

  58. class ChatDemo{
  59.         public static void main(String args[])throws Exception{
  60.                 DatagramSocket sendSocket = new DatagramSocket();
  61.                 DatagramSocket receSocket = new DatagramSocket(8888);
  62.                
  63.                 new Thread(new Send(sendSocket)).start();
  64.                 new Thread(new Rece(receSocket)).start();
  65.         }
  66. }
复制代码

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

回复 使用道具 举报
我发现都是姓唐的.......
回复 使用道具 举报
黑马唐贤来 发表于 2013-1-24 20:04
我发现都是姓唐的.......

哈哈,真是有缘
回复 使用道具 举报
两个办法都能解决问题,3Q
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马