2014-01-11 80 views
-1

我做了一個簡單的程序來發送和接收來自SA:MP服務器的數據包,其中包含有關指定服務器的信息。當我使用名爲「Packet Sender」的程序發送數據包時,此功能正常工作,但我的Java程序不想工作。這是我目前使用的代碼:Java DatagramSocket沒有收到數據包

 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: [[email protected] 
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) 

在調試「包」是包被轉換成字節之前。由於它是一個無效的ascii字符(表示爲CANCEL),它也缺少一個字符。

這裏是我前面提到的,發送和返回數據包的程序的截圖: http://puu.sh/6gRd5.png

編輯: 我已經試過禁用我的防火牆/允許javaw進程(這是一個applet)通過我的防火牆,以及與端口7777和55056數據包。

任何幫助,將不勝感激! 謝謝

+0

你談論兩個不同的端口,但你的代碼恰好使用一個。你在服務器上發送什麼端口,以及服務器發送回覆的端口是什麼? –

+0

SAMP使用端口7777,這是我發送到/從的端口。 – user1338675

回答

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不在您組織的網絡中,那麼它很可能不會知道如何將數據包路由到您的地址......並且它們將被無聲地丟棄。

+0

感謝您的幫助,我最終通過將UTF-8的字符集更改爲US-ASCII來解決此問題,它的工作原理是:-) – user1338675

相關問題