为了账号安全,请及时绑定邮箱和手机立即绑定

用线程实现多用户通信出现奇怪的问题,麻烦大家帮忙看看

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

55bc33cc0001ecf705000225.jpg

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

55bc33cc000119cd05000071.jpg


55bc33cc0001f3a604160081.jpg


正在回答

1 回答

 DatagramPacket p = new DatagramPacket(buf, buf.length);这个要放在while循环里面,因为每一次的

receive()都要指定一个特有的DatagramPacket  p来接收每一个客户端发过来的请求,如果你放在外面的话,就每一次都要等上一次的数据输出后才能重新接收,这个就没有为每一个客户端各分配一个用来响应的reply了,不知道能不能帮到你!!

2 回复 有任何疑惑可以回复我~
#1

liusongsir 提问者

非常感谢!
2015-10-11 回复 有任何疑惑可以回复我~
#2

激流勇进__ 回复 liusongsir 提问者

你们的这种截图是怎么截上去的?还有完整的序列。。。。
2016-03-23 回复 有任何疑惑可以回复我~
#3

石头子0

如果你放在外面的话,就每一次都要等上一次的数据输出后才能重新接收, 那么这是第一次没有输出数据,不是后来的都不会接收的意思吗,这个结果不是第一次没输出,后来都有输出啊
2016-04-17 回复 有任何疑惑可以回复我~
#4

qq_昼绽_0 回复 liusongsir 提问者

还是不懂第一次,为何没有讲接受的数据显示。能说下你的理解?
2016-04-28 回复 有任何疑惑可以回复我~
#5

qq_默许凵_04107152

非常感谢。我也是这个问题困扰
2018-08-04 回复 有任何疑惑可以回复我~
查看3条回复

举报

0/150
提交
取消

用线程实现多用户通信出现奇怪的问题,麻烦大家帮忙看看

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信