黑马程序员技术交流社区

标题: UDP聊天的小问题。 [打印本页]

作者: 唐长智    时间: 2013-1-24 17:18
标题: UDP聊天的小问题。
本帖最后由 唐长智 于 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. }
复制代码

作者: 唐晓    时间: 2013-1-24 17:41
试一下在Send类的  if("886".equals(line)){ds.send(“886”);//添加给接受端发一个结束标记
break; }
然后在Rece里判断下if("886".equals(line)){break; }
把Send和Rece同时break;
作者: txl    时间: 2013-1-24 20:02
  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. }
复制代码

作者: txl    时间: 2013-1-24 20:04
我发现都是姓唐的.......
作者: 唐长智    时间: 2013-1-25 08:58
黑马唐贤来 发表于 2013-1-24 20:04
我发现都是姓唐的.......

哈哈,真是有缘
作者: 唐长智    时间: 2013-1-25 08:58
两个办法都能解决问题,3Q




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