为了账号安全,请及时绑定邮箱和手机立即绑定

UDP多线程中true循环里面的问题

public class UDPServer {
    public static void main(String[] args) throws IOException {
	// 创建datagramsocket对象
	DatagramSocket socket = new DatagramSocket(8800);
	System.out.println("服务器端已经启动,等待客户端发送数据");
	while (true) {
	    // 创建数据报
	    byte[] data = new byte[1024];
	    DatagramPacket packet = new DatagramPacket(data, data.length);
	    // 3.接受客户端的数据
	    socket.receive(packet);// 处于堵塞状态
	    new UDPThread(packet).start(); 
	    }
	}
}

byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data, data.length);
为什么这一段代码必须放在true循环里面??

开始我放在外面,但运行后在thread线程中里面一直获取不到packet对象,使用packet.getData()方法无效

System.out.println("run");
    //4.读取客户端数据
    String info=new String(packet.getData(),0,packet.getLength());
    System.out.println("我是服务器,客户端说:"+info);

这是run()方法里面,打印run以后就走不动了

正在回答

2 回答

原因:socket.receive(packet)会锁死对象packet,主线程锁死packet对象后,在start()的子线程中不能调用  packet.属性,packet.方法()。

解决办法:

while(true){ 

    byte[] data=new byte[1024];//创建字节数组,指定接受的数据包的大小

    DatagramPacket packet=new DatagramPacket(data, data.length);

    socket.receive(packet);//此方法在接受到数据之前会一直阻塞

    UDPServerThread serverThread=new UDPServerThread(socket,apcket,data);

    serverThread.start();

}

这样在while循环到第二次时,new了一个新的packet对象,主线程锁住新对象,上一次的对象自动解锁,上一次循环时新建的子线程中的对packet进行调用的方法才可以开始执行


1 回复 有任何疑惑可以回复我~

我也不理解,只要在while循环里面放进 packet = new DatagramPacket(data, data.length);就没错,如果都放在循环外的话,运行前两个客户端线程的话,run()输出总是不完整的。如果楼主解决了这个问题,麻烦告诉一下~

0 回复 有任何疑惑可以回复我~
#1

慕粉4241372 提问者

碰到这种逻辑上的问题最恼人了,我还问了老师,他也不知道,还说socket方式实际运用中很少用到,只能把这个问题跳过去了,但还是很不甘心
2017-03-21 回复 有任何疑惑可以回复我~
#2

小肚腩era 回复 慕粉4241372 提问者

这是我昨晚看到的一个慕友的回复,楼主可以参考一下~
2017-03-21 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

UDP多线程中true循环里面的问题

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信