求指教:UDP線程接收多客戶端數(shù)據(jù)
我寫的跟“風(fēng)中過客”差不多,出了點(diǎn)小問題,弄不明白,請老師指教
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("我是服務(wù)器,客戶端說:"+info); //響應(yīng)客戶端 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("******服務(wù)器已經(jīng)啟動******"); int?count?=?0; while(true){ socket.receive(packet); UDPThread?udpThread?=?new?UDPThread(socket,?packet); udpThread.start(); count++; System.out.println("客戶端數(shù)量為:"+count); } }
我把
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data, data.length);
放在循環(huán)外面
運(yùn)行時(shí)不報(bào)錯,但客戶端發(fā)送請求后,第一次得不到回應(yīng),發(fā)送第二次請求后,得到第一次的回應(yīng)
但服務(wù)端不顯示接收到的內(nèi)容
我學(xué)“風(fēng)中過客”把這兩句放循環(huán)里 ?就正常了
請問為什么?
2015-10-11
DatagramPacket?p?=?new?DatagramPacket(buf,?buf.length);這個(gè)要放在while循環(huán)里面,因?yàn)槊恳淮蔚?/p>
receive()都要指定一個(gè)特有的DatagramPacket? p來接收每一個(gè)客戶端發(fā)過來的請求,如果你放在外面的話,就每一次都要等上一次的數(shù)據(jù)輸出后才能重新接收,這個(gè)就沒有為每一個(gè)客戶端各分配一個(gè)用來響應(yīng)的reply了,不知道能不能幫到你!!
2018-05-29
感謝樓主和解答者的疑問幫助到了我
2015-09-15
玩線程的高手們,指點(diǎn)一下嘛
2015-08-26
同問啊