Java DatagramSocket未接收数据包

Java DatagramSocket未接收数据包,java,datagram,Java,Datagram,我制作了一个简单的程序,用于从SA:MP服务器发送和接收数据包,其中包含有关指定服务器的信息。当我用一个名为“packetsender”的程序发送数据包时,这是正确的,但我的Java程序就是不想工作。这是我当前使用的代码: DatagramSocket dataSocket = new DatagramSocket(iPort); dataSocket.setSoTimeout(iTimeout); byte[] bytepacket = szPa

我制作了一个简单的程序,用于从SA:MP服务器发送和接收数据包,其中包含有关指定服务器的信息。当我用一个名为“packetsender”的程序发送数据包时,这是正确的,但我的Java程序就是不想工作。这是我当前使用的代码:

        DatagramSocket dataSocket = new DatagramSocket(iPort);
        dataSocket.setSoTimeout(iTimeout);
        byte[] bytepacket = szPacket.getBytes(Charset.forName("UTF-8"));
        byte[] buf = new byte[256];
        DatagramPacket recpacket = new DatagramPacket(buf, buf.length);
        DatagramPacket packet = new DatagramPacket(bytepacket, bytepacket.length, address, iPort);
        packet.setData(bytepacket);
        packet.setAddress(address);
        packet.setPort(iPort);
        dataSocket.connect(address, iPort);
        socketConnected = true;
        System.out.println("Local port: " + dataSocket.getLocalPort());
        System.out.println("Local IP: " + dataSocket.getLocalAddress());
        System.out.println("Remote port: " + dataSocket.getPort());
        System.out.println("Remote IP: " + dataSocket.getInetAddress());
        System.out.println("Recieve Timeout: "+iTimeout+" milliseconds.");
        dataSocket.send(packet);
        System.out.println("Sent packet: "+ packet.getData());
        dataSocket.receive(recpacket);
        String recieved = new String(recpacket.getData(), 0, recpacket.getLength());
        System.out.println("Recieved packet: "+ recieved);
        dataSocket.close();
        dataSocket.disconnect();
这是我的调试:

Packet: SAMPÀßµai
Local port: 7777 
Local IP: /192.168.0.103
Remote port: 7777
Remote IP: samp.lawlessrp.com/192.223.24.181
Recieve Timeout: 5000 milliseconds.
Sent packet: [B@76dd3333
java.net.SocketTimeoutException: Receive timed out
at java.net.DualStackPlainDatagramSocketImpl.socketReceiveOrPeekData(Native Method)
at java.net.DualStackPlainDatagramSocketImpl.receive0(Unknown Source)
at java.net.AbstractPlainDatagramSocketImpl.receive(Unknown Source)
at java.net.DatagramSocket.receive(Unknown Source)
at lillyramcharan.blacksirrah239.tracker.main.<init>(main.java:199)
at lillyramcharan.blacksirrah239.tracker.launch.init(launch.java:17)
at sun.applet.AppletPanel.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
数据包:SAMPÀßµai
本地港口:7777
本地IP:/192.168.0.103
远程端口:7777
远程IP:samp.lawlesrp.com/192.223.24.181
接收超时:5000毫秒。
发送的数据包:[B@76dd3333
java.net.SocketTimeoutException:接收超时
位于java.net.DualStackPlainDatagramSocketImpl.socketReceiveOrPeekData(本机方法)
位于java.net.DualStackPlainDatagramSocketImpl.receive0(未知源)
位于java.net.AbstractPlainDatagramSocketImpl.receive(未知源)
位于java.net.DatagramSocket.receive(未知源)
blacksirrah239.tracker.main.(main.java:199)
在lillylramcharan.blacksirrah239.tracker.launch.init(launch.java:17)
位于sun.applet.AppletPanel.run(未知源)
位于java.lang.Thread.run(未知源)
在调试中,“数据包”是在转换为字节之前的数据包。由于它是无效的ascii字符(表示为取消),因此也缺少一个字符

下面是我前面提到的发送和返回数据包的程序的屏幕截图:

编辑: 我已经尝试过禁用我的防火墙/允许javaw(它是一个小程序)通过我的防火墙,以及端口为7777和55056的数据包

任何帮助都将不胜感激!
谢谢

您的代码没有明显的错误,所以您需要做一些调查

例如,查找并安装一个数据包记录器,并使用它查看数据包是否实际通过网络发送,以及是否有应答数据包从服务器返回


实际上,在输出消息中有一个可能的线索:

    Local IP: /192.168.0.103
    Remote IP: samp.lawlessrp.com/192.223.24.181

您已将程序设置为在IP地址192.168.0.103上侦听。这是一个专用IP地址。但您正在尝试与192.223.24.181(名义上)公用IP地址通话。如果192.223.24.181不在您组织的网络中,很可能,它不知道如何将数据包路由到您的地址……它们会被悄悄地丢弃。

您谈到两个不同的端口,但您的代码只使用一个端口。您在服务器上发送到哪个端口,服务器发送回复到哪个端口?SAMP使用端口7777,这就是我发送到/从哪个端口发送的。为什么使用packet.setData、packet.setAddress方法?数据和地址以及新DatagramPacket(bytepacket、bytepacket.length、address、iPort)中已定义的其他数据。不是吗?感谢您的帮助,我最终通过将字符集从UTF-8更改为US-ASCII来修复它,并且成功:-)