亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

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下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號