求指教:UDP線程接收多客戶端數據
我寫的跟“風中過客”差不多,出了點小問題,弄不明白,請老師指教
public?static?class?UDPThread?extends?Thread{ DatagramSocket?socket=null; DatagramPacket?packet=null; public?UDPThread(DatagramSocket?socket,?DatagramPacket?packet)?{ super(); this.socket?=?socket; this.packet?=?packet; } public?void?run(){ byte[]?data?=?packet.getData(); String?info?=?new?String(data,0,packet.getLength()); System.out.println("我是服務器,客戶端說:"+info); //響應客戶端 byte[]?data2?=?"歡迎您!".getBytes(); InetAddress?address?=?packet.getAddress(); int?port?=?packet.getPort(); DatagramPacket?packet2?=?new?DatagramPacket(data2,?data2.length,?address,?port); try?{ socket.send(packet2); }?catch?(IOException?e)?{ //?TODO?Auto-generated?catch?block e.printStackTrace(); } } }
上面沒什么問題,下面的main方法出問題了
public?static?void?main(String[]?args)?throws?Exception?{ DatagramSocket?socket?=?new?DatagramSocket(8800); byte[]?data?=?new?byte[1024]; DatagramPacket?packet?=?new?DatagramPacket(data,?data.length); System.out.println("******服務器已經啟動******"); int?count?=?0; while(true){ socket.receive(packet); UDPThread?udpThread?=?new?UDPThread(socket,?packet); udpThread.start(); count++; System.out.println("客戶端數量為:"+count); } }
我把
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data, data.length);
放在循環外面
運行時不報錯,但客戶端發送請求后,第一次得不到回應,發送第二次請求后,得到第一次的回應
但服務端不顯示接收到的內容
我學“風中過客”把這兩句放循環里 ?就正常了
請問為什么?
2015-10-11
DatagramPacket?p?=?new?DatagramPacket(buf,?buf.length);這個要放在while循環里面,因為每一次的
receive()都要指定一個特有的DatagramPacket? p來接收每一個客戶端發過來的請求,如果你放在外面的話,就每一次都要等上一次的數據輸出后才能重新接收,這個就沒有為每一個客戶端各分配一個用來響應的reply了,不知道能不能幫到你??!
2018-05-29
感謝樓主和解答者的疑問幫助到了我
2015-09-15
玩線程的高手們,指點一下嘛
2015-08-26
同問啊