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();
}
}
}
2016-08-23
為什么構造方法中沒有傳入data,這個地方創建線程的時候為什么可以傳入??
2016-02-11
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循環外就不行,我寫在上面一直不行,看你這么寫改了竟然就可以了。。。
2016-01-16
?不可以用多線程嗎?
2015-09-28
1,需要手動關閉的
2,packet返回的字節數組不一定全部用完了,因此要通過packet.getLength()方法構造一個String,可以這樣寫
String info = new String(packet.getData(), 0, packet.getLength());
2015-07-21
問題1. 當客戶端的數據報發送完畢,客戶端創建的DatagramSocket是否需要關閉(手動的)?
問題2. run方法中的 讀取來自客戶端的數據報里面的數據,為什么不直接
???????? ? String Info = new String(packet.getData());
????? ? ? ?而是 先寫到一個臨時數組里面,然后去讀那個數組里面的東西,有點多此一舉的感覺?