最近中文字幕高清中文字幕无,亚洲欧美高清一区二区三区,一本色道无码道dvd在线观看 ,一个人看的www免费高清中文字幕

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

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

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

正在回答

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("我是服務(wù)器,客戶端說:"+info);
		//響應(yīng)客戶端
		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();
		}
	}
}
/*
?*?服務(wù)器端,實現(xiàn)基于UDP的用戶登陸
?*/
public?class?UDPServer?{

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


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

moluchase

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

moluchase 回復 moluchase

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

Airly 回復 moluchase

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

Mad_Man_ 回復 moluchase

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

MEI有頭緒 回復 Airly

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

MEI有頭緒 回復 Mad_Man_

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


僅供參考:

public class UdpSocketMilServerDemo {

public static void main(String[] args) {

DatagramSocket socket = null;

try {

/*

* 接受客戶端發(fā)送到服務(wù)器的數(shù)據(jù)信息

*/

int count = 0;

//創(chuàng)建DatagramSocket,指定端口

socket = new DatagramSocket(8800);

while(true){

//創(chuàng)建DatagramPacket,用于存儲客戶端發(fā)送的信息

byte[] data = new byte[1024];

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

//接受從客戶端發(fā)送來的請求信息,并存儲在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("我是服務(wù)端,客戶端說:"+info);

/*?

?* 對客戶端的請求進行響應(yīng)

?*/

?

//獲取客戶端主機信息和定義要響應(yīng)的信息

InetAddress address = packet.getAddress();

int port = packet.getPort();

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

//定義一個DatagramPaket,用戶存放響應(yīng)信息

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

//發(fā)送響應(yīng)信息

socket.send(responsePacket);

} catch (IOException e) {

e.printStackTrace();

}

}

}


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

SilenceDean

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

SilenceDean

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

Airly 回復 SilenceDean

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

Airly 回復 Airly

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

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

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

可以發(fā)一下源代碼參考一下?

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

感覺因為現(xiàn)在人數(shù)多了還是怎么的,幕課網(wǎng)現(xiàn)在都已經(jīng)沒老師來回答問題了,以前的時候人發(fā)問題總有。唉,現(xiàn)在就只剩些學生互相猜解了。

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

慕粉1651148

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

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

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

慕粉1651148

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

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

例如socket.receive(packet)后將packet得到的數(shù)據(jù)也就是字節(jié)數(shù)組傳給新線程處理。而不是直接傳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
提交
取消

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

我要回答 關(guān)注問題
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號