xiele
2015-06-28 15:06
我写的跟“风中过客”差不多,出了点小问题,弄不明白,请老师指教
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);
放在循环外面
运行时不报错,但客户端发送请求后,第一次得不到回应,发送第二次请求后,得到第一次的回应
但服务端不显示接收到的内容
我学“风中过客”把这两句放循环里 就正常了
请问为什么?
DatagramPacket p = new DatagramPacket(buf, buf.length);这个要放在while循环里面,因为每一次的
receive()都要指定一个特有的DatagramPacket p来接收每一个客户端发过来的请求,如果你放在外面的话,就每一次都要等上一次的数据输出后才能重新接收,这个就没有为每一个客户端各分配一个用来响应的reply了,不知道能不能帮到你!!
感谢楼主和解答者的疑问帮助到了我
玩线程的高手们,指点一下嘛
同问啊
Java Socket应用---通信是这样练成的
125013 学习 · 590 问题
相似问题