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

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

用線程實現多用戶通信出現奇怪的問題,麻煩大家幫忙看看

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循環里,因為每一次接收到的是不同的報文。)

55bc33cc0001ecf705000225.jpg

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

55bc33cc000119cd05000071.jpg


55bc33cc0001f3a604160081.jpg


正在回答

1 回答

?DatagramPacket?p?=?new?DatagramPacket(buf,?buf.length);這個要放在while循環里面,因為每一次的

receive()都要指定一個特有的DatagramPacket? p來接收每一個客戶端發過來的請求,如果你放在外面的話,就每一次都要等上一次的數據輸出后才能重新接收,這個就沒有為每一個客戶端各分配一個用來響應的reply了,不知道能不能幫到你?。?/p>

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

liusongsir 提問者

非常感謝!
2015-10-11 回復 有任何疑惑可以回復我~
#2

激流勇進__ 回復 liusongsir 提問者

你們的這種截圖是怎么截上去的?還有完整的序列。。。。
2016-03-23 回復 有任何疑惑可以回復我~
#3

石頭子0

如果你放在外面的話,就每一次都要等上一次的數據輸出后才能重新接收, 那么這是第一次沒有輸出數據,不是后來的都不會接收的意思嗎,這個結果不是第一次沒輸出,后來都有輸出啊
2016-04-17 回復 有任何疑惑可以回復我~
#4

qq_晝綻_0 回復 liusongsir 提問者

還是不懂第一次,為何沒有講接受的數據顯示。能說下你的理解?
2016-04-28 回復 有任何疑惑可以回復我~
#5

qq_默許凵_04107152

非常感謝。我也是這個問題困擾
2018-08-04 回復 有任何疑惑可以回復我~
查看3條回復

舉報

0/150
提交
取消

用線程實現多用戶通信出現奇怪的問題,麻煩大家幫忙看看

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

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

幫助反饋 APP下載

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

公眾號

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