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

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

求指教:UDP線程接收多客戶端數據

我寫的跟“風中過客”差不多,出了點小問題,弄不明白,請老師指教

	public?static?class?UDPThread?extends?Thread{
		DatagramSocket?socket=null;
		DatagramPacket?packet=null;
		public?UDPThread(DatagramSocket?socket,?DatagramPacket?packet)?{
			super();
			this.socket?=?socket;
			this.packet?=?packet;
		}
		
		public?void?run(){
			byte[]?data?=?packet.getData();
			String?info?=?new?String(data,0,packet.getLength());
			System.out.println("我是服務器,客戶端說:"+info);
			
			//響應客戶端
			byte[]?data2?=?"歡迎您!".getBytes();
			InetAddress?address?=?packet.getAddress();
			int?port?=?packet.getPort();
			DatagramPacket?packet2?=?new?DatagramPacket(data2,?data2.length,?address,?port);
			try?{
				socket.send(packet2);
			}?catch?(IOException?e)?{
				//?TODO?Auto-generated?catch?block
				e.printStackTrace();
			}
		}
	}

上面沒什么問題,下面的main方法出問題了

	public?static?void?main(String[]?args)?throws?Exception?{
		DatagramSocket?socket?=?new?DatagramSocket(8800);
		byte[]?data?=?new?byte[1024];
		DatagramPacket?packet?=?new?DatagramPacket(data,?data.length);
		System.out.println("******服務器已經啟動******");
		int?count?=?0;
		while(true){
			socket.receive(packet);
			UDPThread?udpThread?=?new?UDPThread(socket,?packet);
			udpThread.start();
			count++;
			System.out.println("客戶端數量為:"+count);
		}
	}

我把

byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data, data.length);

放在循環外面

運行時不報錯,但客戶端發送請求后,第一次得不到回應,發送第二次請求后,得到第一次的回應

但服務端不顯示接收到的內容

我學“風中過客”把這兩句放循環里 ?就正常了

請問為什么?

正在回答

4 回答

DatagramPacket?p?=?new?DatagramPacket(buf,?buf.length);這個要放在while循環里面,因為每一次的

receive()都要指定一個特有的DatagramPacket? p來接收每一個客戶端發過來的請求,如果你放在外面的話,就每一次都要等上一次的數據輸出后才能重新接收,這個就沒有為每一個客戶端各分配一個用來響應的reply了,不知道能不能幫到你??!


2 回復 有任何疑惑可以回復我~
#1

xiele 提問者

明白了 原來是這樣 謝謝
2015-10-11 回復 有任何疑惑可以回復我~
#2

慕數據3802251

按照“每一次都要等上一次的數據輸出后才能重新接收”這個話來理解的話,那第二次服務器接收客戶端信息要在第一次信息輸出之后,但是結果顯然是沒有第一次的輸出,這不是矛盾嗎?我認為這并不是正解。
2016-03-21 回復 有任何疑惑可以回復我~
#3

lucitas 回復 慕數據3802251

我覺得是定義在循環里的變量會在每次循環后,會被系統自動回收,因為每一次的 receive()都要指定一個新的DatagramPacket,如果把datagrampacket和數組放在循環外面,一次循環后,packet和數組里面,保存的將會是上一次循環的數據。所以會出錯
2016-04-16 回復 有任何疑惑可以回復我~

感謝樓主和解答者的疑問幫助到了我

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

玩線程的高手們,指點一下嘛

0 回復 有任何疑惑可以回復我~

同問啊


0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

求指教:UDP線程接收多客戶端數據

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

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

公眾號

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