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以后就走不動了
2017-03-21
原因: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進行調用的方法才可以開始執行
2017-03-20
我也不理解,只要在while循環里面放進?packet?=?new?DatagramPacket(data,?data.length);就沒錯,如果都放在循環外的話,運行前兩個客戶端線程的話,run()輸出總是不完整的。如果樓主解決了這個問題,麻煩告訴一下~