用線程實現多用戶通信出現奇怪的問題,麻煩大家幫忙看看
public?class?DatagramServer?{
????public?static?void?main(String[]?args)?{
????????try?{
????????????//1.創建DatagramSocket,指定端口
????????????DatagramSocket?socket?=?new?DatagramSocket(8787);
????????????System.out.println("我是服務器,我已經準備好了!");
????????????//3.接收客戶端發送的信息(此方法在接收數據包之前會一直阻塞)
????????????int?count?=?0;
????????????byte[]?buf?=?new?byte[1024];
????????????//2.創建DatagramPacket,用于接收客戶端發送的數據
????????????
????????????//》》》》》下面這一句放在while循環之外就出現了奇怪的運行結果,見圖
????????????DatagramPacket?p?=?new?DatagramPacket(buf,?buf.length);
????????????while(true){
????????????????socket.receive(p);
????????????????ServerThread?s?=?new?ServerThread(socket,?p,?buf);
????????????????s.start();
????????????????System.out.println("當前請求的客戶機有"+?(++count)?+"臺");
????????????}
????????}?catch?(SocketException?e)?{
????????????//?TODO?Auto-generated?catch?block
????????????e.printStackTrace();
????????}?catch?(IOException?e)?{
????????????//?TODO?Auto-generated?catch?block
????????????e.printStackTrace();
????????}
????????
????}
}
public?class?ServerThread?extends?Thread{
????DatagramSocket?socket1?=?null;
????DatagramPacket?p?=?null;
????byte[]?buf?=?null;
?
????public?ServerThread(DatagramSocket?socket1,?DatagramPacket?p,?byte[]?buf){
????????this.socket1?=?socket1;
????????this.p?=?p;
????????this.buf?=?buf;
????}
????
????@Override
????public?void?run()?{
????????String?info?=?null;
????????InetAddress?address?=?null;
????????int?port?=?0;
????????byte[]?buf1?=?null;
????????DatagramPacket?p1?=?null;
????????info?=?new?String(buf,?0,?p.getLength());
????????System.out.println("客戶端對我說:"+info);????
????????address?=?p.getAddress();
????????port?=?p.getPort();
????????String?reply?=?"歡迎您!";
????????buf1?=?reply.getBytes();
????????p1?=?new?DatagramPacket(buf1,?buf1.length,?address,?port);
????????try?{
????????????socket1.send(p1);
????????}?catch?(IOException?e)?{
????????????//?TODO?Auto-generated?catch?block
????????????e.printStackTrace();
????????}
????}
}如上代碼:如果服務器端的DatagramPacket p = new DatagramPacket(buf, buf.length);
這一句放在while循環之外,則整個程序的運行結果如下,我就想知道為什么第一次的數據報文服務器不能接收到呢?(正確的程序代碼應該是放到while循環里,因為每一次接收到的是不同的報文。)

感覺第一次的數據報文丟了一樣


2015-10-11
?DatagramPacket?p?=?new?DatagramPacket(buf,?buf.length);這個要放在while循環里面,因為每一次的
receive()都要指定一個特有的DatagramPacket? p來接收每一個客戶端發過來的請求,如果你放在外面的話,就每一次都要等上一次的數據輸出后才能重新接收,這個就沒有為每一個客戶端各分配一個用來響應的reply了,不知道能不能幫到你??!