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?創(chuàng)建時(shí)間:2015年6月1日?下午6:28:05?
?*?@version?
?*?@parameter??
?*?@since??
?*?@return??*/
public?class?Server?{
public?static?void?main(String[]?args)?{
try?{
//1.創(chuàng)建服務(wù)器DatagramSocket
DatagramSocket?socket=new?DatagramSocket(8800);
System.out.println("****服務(wù)器已經(jīng)啟動(dòng),等待客戶(hù)端連接");
//2.創(chuàng)建數(shù)據(jù)包,用于接收客戶(hù)端發(fā)送的數(shù)據(jù)
while(true){
byte?[]?data=?new?byte[1024];
DatagramPacket?packet=new?DatagramPacket(data,?data.length);
//3.接收客戶(hù)端發(fā)送的數(shù)據(jù)
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?創(chuàng)建時(shí)間:2015年6月1日?下午7:16:08?
?*?@version?
?*?@parameter??
?*?@since??
?*?@return??*/
public?class?ServerThread?extends?Thread?{
private?DatagramSocket?socket;
private?DatagramPacket?packet;
/*
?*?通過(guò)構(gòu)造方法把套接字和數(shù)據(jù)包傳過(guò)來(lái),不要傳byte?[]?data,
?*?用packet.getData()體現(xiàn)數(shù)據(jù)是通過(guò)數(shù)據(jù)包傳送過(guò)來(lái)的?
?*/
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();//返回?cái)?shù)據(jù)緩沖區(qū)
String?info=new?String(data,0,packet.getLength());
System.out.println("我是服務(wù)器"+Thread.currentThread()+",客戶(hù)端說(shuō):"+info);
InetAddress?address?=packet.getAddress();//得到主機(jī)的地址
int?port=packet.getPort();//返回某臺(tái)遠(yuǎn)程主機(jī)的端口號(hào)
byte?[]data2="歡迎您!".getBytes();
DatagramPacket?packet2=new?DatagramPacket(data2,?data2.length,address,port);//發(fā)送data2到主機(jī)
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
為什么構(gòu)造方法中沒(méi)有傳入data,這個(gè)地方創(chuàng)建線(xiàn)程的時(shí)候?yàn)槭裁纯梢詡魅???/p>
2016-02-11
try?{
????????????//1.創(chuàng)建服務(wù)器DatagramSocket
????????????DatagramSocket?socket=new?DatagramSocket(8800);
????????????System.out.println("****服務(wù)器已經(jīng)啟動(dòng),等待客戶(hù)端連接");
????????????//2.創(chuàng)建數(shù)據(jù)包,用于接收客戶(hù)端發(fā)送的數(shù)據(jù)
????????????while(true){
????????????????byte?[]?data=?new?byte[1024];
????????????????DatagramPacket?packet=new?DatagramPacket(data,?data.length);
????????????????//3.接收客戶(hù)端發(fā)送的數(shù)據(jù)
????????????????socket.receive(packet);
????????????????ServerThread?serverThread=new?ServerThread(socket,packet,data);
????????????????serverThread.start();
????????????????}
????????}?
為什么把?DatagramPacket?packet=new?DatagramPacket(data,?data.length);
寫(xiě)在while循環(huán)外就不行,我寫(xiě)在上面一直不行,看你這么寫(xiě)改了竟然就可以了。。。
2016-01-16
?不可以用多線(xiàn)程嗎?
2015-09-28
1,需要手動(dòng)關(guān)閉的
2,packet返回的字節(jié)數(shù)組不一定全部用完了,因此要通過(guò)packet.getLength()方法構(gòu)造一個(gè)String,可以這樣寫(xiě)
String info = new String(packet.getData(), 0, packet.getLength());
2015-07-21
問(wèn)題1. 當(dāng)客戶(hù)端的數(shù)據(jù)報(bào)發(fā)送完畢,客戶(hù)端創(chuàng)建的DatagramSocket是否需要關(guān)閉(手動(dòng)的)?
問(wèn)題2. run方法中的 讀取來(lái)自客戶(hù)端的數(shù)據(jù)報(bào)里面的數(shù)據(jù),為什么不直接
???????? ? String Info = new String(packet.getData());
????? ? ? ?而是 先寫(xiě)到一個(gè)臨時(shí)數(shù)組里面,然后去讀那個(gè)數(shù)組里面的東西,有點(diǎn)多此一舉的感覺(jué)?