我做了一个简单的程序来发送和接收来自SA:MP服务器的数据包,其中包含有关指定服务器的信息。当我使用名为“Packet Sender”的程序发送数据包时,这可以正常工作,但我的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)
在调试中“Packet”是数据包转换为字节之前的数据包。它也缺少一个字符,因为它是一个无效的ascii字符(表示为CANCEL)。
这是我之前提到的程序的截图,发送和返回数据包: http://puu.sh/6gRd5.png
编辑: 我已经尝试通过我的防火墙禁用我的防火墙/允许javaw(它是一个小程序),以及使用端口7777和55056的数据包。
任何帮助将不胜感激! 感谢
答案 0 :(得分:1)
您的代码没有明显错误,因此您需要进行一些调查。
例如,查找并安装数据包记录器并使用它来查看数据包是否实际通过网络发送,以及是否有回复数据包从服务器返回。
实际上,输出消息中可能存在线索:
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不在您组织的网络中,则可能无法知道如何将数据包路由到您的地址......并且它们将被静默删除。