用線程實現多用戶通信出現奇怪的問題,麻煩大家幫忙看看
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了,不知道能不能幫到你?。?/p>