黑马程序员技术交流社区
标题:
UDP聊天的小问题。
[打印本页]
作者:
唐长智
时间:
2013-1-24 17:18
标题:
UDP聊天的小问题。
本帖最后由 唐长智 于 2013-1-25 08:58 编辑
基本和老毕视频里的代码一样,但是在客户端输入886之后,程序应该停止的。但是,实际控制台却并没有停止,就像假死一样,输入什么都没用,只能Ctrl+C强行结束,这是由于多线程的原因么?
请大神帮答。
import java.io.*;
import java.net.*;
class Send implements Runnable{
private DatagramSocket ds;
public Send(DatagramSocket ds){
this.ds = ds;
}
public void run(){
try{
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line = bufr.readLine())!= null){
byte[] buf = line.getBytes();
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.53"),10003);
ds.send(dp);
if("886".equals(line)){
break;
}
}
}
catch(Exception e){
throw new RuntimeException("读取失败");
}
}
}
class Rece implements Runnable{
private DatagramSocket ds;
public Rece(DatagramSocket ds){
this.ds = ds;
}
public void run(){
try{
while(true){
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
ds.receive(dp);
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(),0,dp.getLength());
System.out.println(ip + "...." + data);
}
}
catch(Exception e){
throw new RuntimeException("接收失败");
}
}
}
class ChatDemo{
public static void main(String args[])throws Exception{
DatagramSocket sendSocket = new DatagramSocket();
DatagramSocket receSocket = new DatagramSocket(10003);
new Thread(new Send(sendSocket)).start();
new Thread(new Rece(receSocket)).start();
}
}
复制代码
作者:
唐晓
时间:
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
import java.io.*;
import java.net.*;
class Send implements Runnable{
private DatagramSocket ds;
public Send(DatagramSocket ds){
this.ds = ds;
}
public void run(){
try{
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line = bufr.readLine())!= null){
byte[] buf = line.getBytes();
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),8888);
ds.send(dp);
if("886".equals(line)){
System.exit(0); //楼主,在这里就不该使用break了,而应该直接退出程序;
}
}
}
catch(Exception e){
throw new RuntimeException("读取失败");
}
}
}
class Rece implements Runnable{
private DatagramSocket ds;
public Rece(DatagramSocket ds){
this.ds = ds;
}
public void run(){
try{
while(true){
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
ds.receive(dp);
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(),0,dp.getLength());
System.out.println(ip + "...." + data);
}
}
catch(Exception e){
throw new RuntimeException("接收失败");
}
}
}
class ChatDemo{
public static void main(String args[])throws Exception{
DatagramSocket sendSocket = new DatagramSocket();
DatagramSocket receSocket = new DatagramSocket(8888);
new Thread(new Send(sendSocket)).start();
new Thread(new Rece(receSocket)).start();
}
}
复制代码
作者:
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