我写的跟“风中过客”差不多,出了点小问题,弄不明白,请老师指教
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了,不知道能不能帮到你!!
感谢楼主和解答者的疑问帮助到了我
玩线程的高手们,指点一下嘛
同问啊