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()輸出總是不完整的。如果樓主解決了這個問題,麻煩告訴一下~