UDP多線程中true循環(huán)里面的問題
public?class?UDPServer?{ ????public?static?void?main(String[]?args)?throws?IOException?{ //?創(chuàng)建datagramsocket對(duì)象 DatagramSocket?socket?=?new?DatagramSocket(8800); System.out.println("服務(wù)器端已經(jīng)啟動(dòng),等待客戶端發(fā)送數(shù)據(jù)"); while?(true)?{ ????//?創(chuàng)建數(shù)據(jù)報(bào) ????byte[]?data?=?new?byte[1024]; ????DatagramPacket?packet?=?new?DatagramPacket(data,?data.length); ????//?3.接受客戶端的數(shù)據(jù) ????socket.receive(packet);//?處于堵塞狀態(tài) ????new?UDPThread(packet).start();? ????} } }
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data, data.length);
為什么這一段代碼必須放在true循環(huán)里面??
開始我放在外面,但運(yùn)行后在thread線程中里面一直獲取不到packet對(duì)象,使用packet.getData()方法無效
System.out.println("run"); ????//4.讀取客戶端數(shù)據(jù) ????String?info=new?String(packet.getData(),0,packet.getLength()); ????System.out.println("我是服務(wù)器,客戶端說:"+info);
這是run()方法里面,打印run以后就走不動(dòng)了
2017-03-21
原因:socket.receive(packet)會(huì)鎖死對(duì)象packet,主線程鎖死packet對(duì)象后,在start()的子線程中不能調(diào)用 ?packet.屬性,packet.方法()。
解決辦法:
while(true){?
? ? byte[] data=new byte[1024];//創(chuàng)建字節(jié)數(shù)組,指定接受的數(shù)據(jù)包的大小
? ? DatagramPacket packet=new DatagramPacket(data, data.length);
? ? socket.receive(packet);//此方法在接受到數(shù)據(jù)之前會(huì)一直阻塞
? ? UDPServerThread serverThread=new UDPServerThread(socket,apcket,data);
? ? serverThread.start();
}
這樣在while循環(huán)到第二次時(shí),new了一個(gè)新的packet對(duì)象,主線程鎖住新對(duì)象,上一次的對(duì)象自動(dòng)解鎖,上一次循環(huán)時(shí)新建的子線程中的對(duì)packet進(jìn)行調(diào)用的方法才可以開始執(zhí)行
2017-03-20
我也不理解,只要在while循環(huán)里面放進(jìn)?packet?=?new?DatagramPacket(data,?data.length);就沒錯(cuò),如果都放在循環(huán)外的話,運(yùn)行前兩個(gè)客戶端線程的話,run()輸出總是不完整的。如果樓主解決了這個(gè)問題,麻煩告訴一下~