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

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

UDP服務器接受多個客服端。

package?com.guoke2;

import?java.io.IOException;
import?java.net.DatagramPacket;
import?java.net.DatagramSocket;
import?java.net.InetAddress;
import?java.net.Socket;
import?java.net.SocketException;

/**?*?@author??guokewind?
?*?@date?創建時間:2015年6月1日?下午6:28:05?
?*?@version?
?*?@parameter??
?*?@since??
?*?@return??*/
public?class?Server?{
	public?static?void?main(String[]?args)?{
		try?{
			//1.創建服務器DatagramSocket
			DatagramSocket?socket=new?DatagramSocket(8800);
			System.out.println("****服務器已經啟動,等待客戶端連接");
			//2.創建數據包,用于接收客戶端發送的數據
			while(true){
				byte?[]?data=?new?byte[1024];
				DatagramPacket?packet=new?DatagramPacket(data,?data.length);
				//3.接收客戶端發送的數據
				socket.receive(packet);
				ServerThread?serverThread=new?ServerThread(socket,packet);
				serverThread.start();
				}
		}?
		catch?(SocketException?e)?{
			//?TODO?Auto-generated?catch?block
			e.printStackTrace();
		}			catch?(IOException?e)?{
			//?TODO?Auto-generated?catch?block
			e.printStackTrace();
		}
	}
}
package?com.guoke2;

import?java.io.IOException;
import?java.net.DatagramPacket;
import?java.net.DatagramSocket;
import?java.net.InetAddress;
import?java.net.SocketException;

/**?*?@author??guokewind?
?*?@date?創建時間:2015年6月1日?下午7:16:08?
?*?@version?
?*?@parameter??
?*?@since??
?*?@return??*/
public?class?ServerThread?extends?Thread?{
	private?DatagramSocket?socket;
	private?DatagramPacket?packet;
	/*
	?*?通過構造方法把套接字和數據包傳過來,不要傳byte?[]?data,
	?*?用packet.getData()體現數據是通過數據包傳送過來的?
	?*/
	public?ServerThread(DatagramSocket?socket,DatagramPacket?packet){
		this.socket=socket;
		this.packet=packet;
	}
	@Override
	public?void?run()?{
		//?TODO?Auto-generated?method?stub
		super.run();
		try{
			byte?[]?data=packet.getData();//返回數據緩沖區
			String?info=new?String(data,0,packet.getLength());
			System.out.println("我是服務器"+Thread.currentThread()+",客戶端說:"+info);
			InetAddress?address?=packet.getAddress();//得到主機的地址
			int?port=packet.getPort();//返回某臺遠程主機的端口號
			byte?[]data2="歡迎您!".getBytes();
			DatagramPacket?packet2=new?DatagramPacket(data2,?data2.length,address,port);//發送data2到主機
			socket.send(packet2);
		}?catch?(SocketException?e)?{
			//?TODO?Auto-generated?catch?block
			e.printStackTrace();
		}			catch?(IOException?e)?{
			//?TODO?Auto-generated?catch?block
			e.printStackTrace();
		}
		
	}
}


正在回答

5 回答

http://img1.sycdn.imooc.com//57bbc46f0001c8a305690117.jpg

為什么構造方法中沒有傳入data,這個地方創建線程的時候為什么可以傳入??

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

風中過客 提問者

哈哈, 那個啥, 請忽略掉那個data
2016-08-25 回復 有任何疑惑可以回復我~

try?{

????????????//1.創建服務器DatagramSocket

????????????DatagramSocket?socket=new?DatagramSocket(8800);

????????????System.out.println("****服務器已經啟動,等待客戶端連接");

????????????//2.創建數據包,用于接收客戶端發送的數據

????????????while(true){

????????????????byte?[]?data=?new?byte[1024];

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

????????????????//3.接收客戶端發送的數據

????????????????socket.receive(packet);

????????????????ServerThread?serverThread=new?ServerThread(socket,packet,data);

????????????????serverThread.start();

????????????????}

????????}?

為什么把?DatagramPacket?packet=new?DatagramPacket(data,?data.length);

寫在while循環外就不行,我寫在上面一直不行,看你這么寫改了竟然就可以了。。。

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

?不可以用多線程嗎?

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

1,需要手動關閉的

2,packet返回的字節數組不一定全部用完了,因此要通過packet.getLength()方法構造一個String,可以這樣寫

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

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

問題1. 當客戶端的數據報發送完畢,客戶端創建的DatagramSocket是否需要關閉(手動的)?

問題2. run方法中的 讀取來自客戶端的數據報里面的數據,為什么不直接

???????? ? String Info = new String(packet.getData());

????? ? ? ?而是 先寫到一個臨時數組里面,然后去讀那個數組里面的東西,有點多此一舉的感覺?

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

舉報

0/150
提交
取消

UDP服務器接受多個客服端。

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

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

幫助反饋 APP下載

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

公眾號

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