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

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

關于udp使用多線程實現多客戶端請問人寫出來嗎?按照之前的tcp那種寫法不成功啊

如題,因為packet傳到線程里后不起作用啊,測了下,不為空,但它的方法都用不了啊,有誰知道嗎。老師沒講這個網上查到的資料也很有顯。幕課之前也有人問同樣的問題,但并沒有回答

正在回答

7 回答

public?class?UDPServerThread?extends?Thread?{
	DatagramSocket?socket?=?null;
	DatagramPacket?packet?=?null;
	public?UDPServerThread(DatagramPacket?packet,DatagramSocket?socket){
		this.packet?=?packet;
		this.socket?=?socket;
	}
	public?void?run(){
		byte[]?data?=?packet.getData();
		String?info?=?new?String(data,0,packet.getLength());
		System.out.println("我是服務器,客戶端說:"+info);
		//響應客戶端
		InetAddress?address?=?packet.getAddress();
		int?port?=?packet.getPort();
		byte[]?data2?=?"歡迎您!".getBytes();
		DatagramPacket?packet2?=?new?DatagramPacket(data2,?data2.length,address,?port);
		try?{
			socket.send(packet2);
		}?catch?(IOException?e)?{
			e.printStackTrace();
		}
	}
}
/*
?*?服務器端,實現基于UDP的用戶登陸
?*/
public?class?UDPServer?{

	public?static?void?main(String[]?args)?throws?IOException?{
		//創建服務器端DatagramSocket,指定端口號
		DatagramSocket?socket?=?new?DatagramSocket(8800);
		byte[]?data?=?new?byte[1024];//創建字節數組,指定接收的數據報的大小
		int?count=0;
		System.out.println("*******服務器端已經啟動,等待客戶端發送數據**********");
		while(true){
			DatagramPacket?packet?=?new?DatagramPacket(data,?data.length);
			socket.receive(packet);
			UDPServerThread?serverThread?=?new?UDPServerThread(packet,?socket);
			serverThread.start();
			count++;
			System.out.println("客戶端的數量是"+count);
		}
	}
}


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

moluchase

問你一下,為什么要把DatagramPacket packet = new DatagramPacket(data, data.length);這句寫到while里面?。?我寫到外面的時候,第一個客戶端一直不出結果,后面幾個客戶端卻正常,找來找去只能發現是packet不能在Thread中使用,卻不知道什么原因
2016-08-06 回復 有任何疑惑可以回復我~
#2

moluchase 回復 moluchase

懂了,packet被占據了,用了serverThread.join();就好了
2016-08-06 回復 有任何疑惑可以回復我~
#3

Airly 回復 moluchase

為什么不是把DatagramPacket 放while里呢?難道不是為每個客戶端創建一個數據報?放到while里面就是當每次有數據時就創建一個新的數據報啊......能不能說說你的思路?
2016-10-25 回復 有任何疑惑可以回復我~
#4

Mad_Man_ 回復 moluchase

什么意思 啊 我現在也遇到這個問題了
2017-07-26 回復 有任何疑惑可以回復我~
#5

MEI有頭緒 回復 Airly

數據報如果為單例的,豈不是數據會累加?
2019-01-05 回復 有任何疑惑可以回復我~
#6

MEI有頭緒 回復 Mad_Man_

因為放在外邊的時候,采用start()方法,packet類在run()方法中在運行,因為start()方法本身不用等待run()方法執行完畢,繼續執行后邊的代碼,所以容易導致下次執行要用packet的時候,上一次還在run()里面執行,導致占用,如果采用join(),會等待此線程執行完,在執行join()之后的代碼,所以就可以了。
2019-01-05 回復 有任何疑惑可以回復我~
查看3條回復


僅供參考:

public class UdpSocketMilServerDemo {

public static void main(String[] args) {

DatagramSocket socket = null;

try {

/*

* 接受客戶端發送到服務器的數據信息

*/

int count = 0;

//創建DatagramSocket,指定端口

socket = new DatagramSocket(8800);

while(true){

//創建DatagramPacket,用于存儲客戶端發送的信息

byte[] data = new byte[1024];

DatagramPacket packet = new DatagramPacket(data, data.length);

//接受從客戶端發送來的請求信息,并存儲在DatagramPacket中

socket.receive(packet);

UdpThread thread = new UdpThread(socket, data, packet);

thread.start();

count++;

System.out.println("總共有"+count+"個用戶登錄");

}

} catch (SocketException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}finally{

socket.close();

}

}

}

public class UdpThread extends Thread {

private DatagramSocket socket;

private byte[] data;

private DatagramPacket packet;

public UdpThread(DatagramSocket socket,byte[] data,DatagramPacket packet){

this.socket = socket;

this.data = data;

this.packet = packet;

}


@Override

public void run() {

try {

//讀取獲取到的客戶信息

String info = new String(data, 0, packet.getLength());

System.out.println("我是服務端,客戶端說:"+info);

/*?

?* 對客戶端的請求進行響應

?*/

?

//獲取客戶端主機信息和定義要響應的信息

InetAddress address = packet.getAddress();

int port = packet.getPort();

byte[] data2 = "歡迎您!".getBytes();

//定義一個DatagramPaket,用戶存放響應信息

DatagramPacket responsePacket = new DatagramPacket(data2, data2.length, address, port);

//發送響應信息

socket.send(responsePacket);

} catch (IOException e) {

e.printStackTrace();

}

}

}


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

SilenceDean

謝謝了
2016-07-25 回復 有任何疑惑可以回復我~
#2

SilenceDean

有個疑問,在while(true)里面放byte data=new byte[1024]; 是每次執行都是將data內容清空并重新開辟內存空間,相當于重新賦值么?
2016-07-25 回復 有任何疑惑可以回復我~
#3

Airly 回復 SilenceDean

并不是重新賦值而是重新創建了一個這個對象。
2016-10-25 回復 有任何疑惑可以回復我~
#4

Airly 回復 Airly

因為要為每一個客戶端對象創建一個實例....
2016-10-25 回復 有任何疑惑可以回復我~
查看1條回復

我的也不行,運行不出來。有沒有源代碼參考一下

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

可以發一下源代碼參考一下?

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

感覺因為現在人數多了還是怎么的,幕課網現在都已經沒老師來回答問題了,以前的時候人發問題總有。唉,現在就只剩些學生互相猜解了。

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

慕粉1651148

同感。前面的一些課程老師的回答明顯看得出來要多些
2016-04-14 回復 有任何疑惑可以回復我~

額,我已經找到答案了,udp的datagrampacket接受數據只能用一個線程接收。所以要先接受后將數據提交線程池處理即可

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

慕粉1651148

能不能說清楚點,畢竟我還是菜雞
2016-04-14 回復 有任何疑惑可以回復我~
#2

獅子追求真理 提問者 回復 慕粉1651148

例如socket.receive(packet)后將packet得到的數據也就是字節數組傳給新線程處理。而不是直接傳packet。
2016-04-14 回復 有任何疑惑可以回復我~
#3

慕粉1651148

剛剛我自己搞好了, 花了不少時間啊
2016-04-14 回復 有任何疑惑可以回復我~
#4

慕蘭雪下 回復 獅子追求真理 提問者

請問為什么不能直接傳packet呢?
2016-04-26 回復 有任何疑惑可以回復我~
#5

慕蘭雪下 回復 獅子追求真理 提問者

請問為什么不能直接傳packet呢?
2016-04-26 回復 有任何疑惑可以回復我~
#6

Airly 回復 獅子追求真理 提問者

同問,為什么不能直接傳packet呢?我直接傳packet并沒有什么問題啊,還是正常運行的。
2016-10-25 回復 有任何疑惑可以回復我~
查看3條回復

同問!

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

水止三千

把packet傳入線程可以用的,
2016-07-22 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

關于udp使用多線程實現多客戶端請問人寫出來嗎?按照之前的tcp那種寫法不成功啊

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

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

幫助反饋 APP下載

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

公眾號

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