Java数据报套接字未接收数据包

B3t*_*3nU 1 java sockets datagram packet loss

我正在尝试使用Java数据报在服务器和客户端之间创建一个数据包流。问题是,尽管我收到了正在发送数据包的确认信息,但它们在到达我设置的客户端侦听器之前都丢失了。我现在有了它,所以5秒钟后会有超时,每次我运行它时都会发生。

class DGServer extends Thread
{
    private DatagramSocket server;

    public DGServer() throws IOException
    {
        server = new DatagramSocket();
    }

    public void run()
    {
        try
        {
            server.connect(App.Local, 4200);
            System.out.println("Server starting...");

            int i = 0;

            while (server.isConnected() && (i < 256))
            {
                byte[] buffer = new byte[1];
                buffer[0] = (byte) ++i;
                DatagramPacket packet = new DatagramPacket(buffer, buffer.length, App.Local, 4200);
                System.out.println("Sedning " + i + " to client...");

                server.send(packet);

                Thread.sleep(500);
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        System.out.println("Server Finished!");

        if (! server.isClosed())
            server.close();
    }

}

class DGClient extends Thread
{
    private DatagramSocket client;

    public DGClient() throws SocketException
    {
        client = new DatagramSocket();
    }

    public void run()
    {
        try
        {
            client.connect(App.Local, 4200);
            client.setSoTimeout(5000);
            System.out.println("Client starting...");

            int i = 0;

            while (client.isConnected() && (i < 256))
            {
                byte[] buffer = new byte[1];
                DatagramPacket packet;
                packet = new DatagramPacket(buffer, 1, App.Local, 4200);
                //System.out.println("Sedning " + i + " to server...");

                client.receive(packet);

                buffer = packet.getData();          
                System.out.println("Client Received:\t" + packet.getData()[0]);

                Thread.sleep(500);
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        System.out.println("Client Finished!");

        if (! client.isClosed())
            client.close();
    }

}
Run Code Online (Sandbox Code Playgroud)

您可以选择略过第二节课。它们大致相同,只是将server.send替换为client.receive。另外,此类并非旨在真正做任何重要的事情。因此,很多代码(例如异常处理)非常简单地编写。

我有什么办法可以防止数据包丢失?我已经在我的计算机上转发了端口(没关系,我使用的是我的本地主机,如果您想知道的话,它是App.Local)。

另外,旁边的问题。我最初将其设置为单个类,编码为发送一个数据包,然后转身接收一个数据包。但这是一个例外,因为“ ICMP端口无法访问”。有谁知道为什么会这样吗?

Eri*_*ric 5

好的,首先,我想您正在同时测试服务器和客户端,因此您不知道哪个会失败。

您应该使用netcat(nc)或wireshark测试客户端

使用netcat,您可以运行以下命令

nc -l -u -p 4200 -vv
Run Code Online (Sandbox Code Playgroud)

这将告诉netcat在端口(-p 4200)上的udp(-u)上侦听(-l),并且非常冗长(-vv)

这样,您就可以检查客户端是否可以连接到任何东西。

您可以使用同一程序检查服务器是否可以通过以下方式从已知的工作程序接收连接:

nc -u [target ip] 4200
Run Code Online (Sandbox Code Playgroud)

这里有一个netcat速查表

您也可以检查netcat到netcat来诊断它是否纯粹是网络问题。可能防火墙/ NAT配置不正确