liusongsir
2015-08-01 10:50
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循环里,因为每一次接收到的是不同的报文。)

感觉第一次的数据报文丢了一样


DatagramPacket p = new DatagramPacket(buf, buf.length);这个要放在while循环里面,因为每一次的
receive()都要指定一个特有的DatagramPacket p来接收每一个客户端发过来的请求,如果你放在外面的话,就每一次都要等上一次的数据输出后才能重新接收,这个就没有为每一个客户端各分配一个用来响应的reply了,不知道能不能帮到你!!
Java Socket应用---通信是这样练成的
125006 学习 · 627 问题
相似问题