2012-02-25 59 views
1

我正在尝试使用Java创建一个基本的数据报客户机/服务器程序。如何通过Internet发送数据报包?

我让服务器挂在我的本地计算机上的端口9321。

我已经在本地计算机上的端口9320上创建了客户端,然后通过无线路由器网络(192.168.1.100)在端口9321 上发送数据。

然后我尝试通过端口9321 发送数据包(通过路由器)互联网IP 139.195.12.183(我的IP),但它没有工作! 有此异常:

java.net.SocketException: Interrupted function call: Datagram send failed 

我设置路由器端口9321的任何请求转发到我的电脑 然后我设置的例外为我的电脑上的防火墙端口上

这是源

String SERVER = "139.195.12.183"; 

sendString(SERVER, 9321, "Greetings"); << 


private void sendString(String IP, int port, String toSend) { 
    byte[] buf = toSend.getBytes(); 
    DatagramPacket packet = null; 
    try { 

     packet = new DatagramPacket(buf, buf.length, InetAddress.getByName(SERVER), port); 

     ds.send(packet);<< 
    }catch(UnknownHostException e) { 
     System.out.println("unknownhostception"); 
    }catch(IOException e) { 
     System.err.println("ioception "+e.getMessage()); 

    } 

} 

我从另一个论坛上说,它还有另外一个答案:

“路由器的工作方式,您不能从您的内部网络(LAN)看到您的外部(WAN)Internet地址。如果这就是你想要做的,没有什么不对,它 就是行不通的。

伊恩“

任何解释

+0

只是为了澄清 - 全球网络==互联网?您的本地PC确实有公开可用的IP地址(您提到的IP属于运营商)? – home 2012-02-25 14:05:22

+0

啊是的,我的意思是互联网。 专用网络是我的路由器。 – 2012-02-25 14:08:09

+1

如果您使用IP数据报,请始终考虑其TTL。 – ecle 2012-02-25 15:11:40

回答

0

,您可以采取一些步骤:?

  1. 检查代码工作在两台机器在局域网上
  2. 检查ping <target-ip>适用于您的机器。
  3. 如果是这样,请检查您的本地用于在端口/协议上阻塞的LAN防火墙设置。
  4. 如果端口未被阻塞,请将端口更改为其他值。一些ISP会阻止某些端口。

一些更多的原因这个错误可以拿出:

  • UDP(我假设?)数据报太大。
  • 客户端错误不影响接收(见过类似的事情与一些网络堆栈,其中错误是虚假的。)

后从patsebin或者如果你想要的东西,你的代码的链接更多信息。

+0

第一步是成功 ping目标是成功的(没有跳!) 路由器设置(转发)到我的电脑启用(在端口9321) 我认为端口9321没有被ISP阻止(但我会尝试它!) – 2012-02-25 14:41:02

+0

什么是IP数据报的TTL值设置? 1的TTL只会在第一个路由器上持续运行,永远不会超越它。 http://en.wikipedia.org/wiki/Time_to_live – ecle 2012-02-25 15:09:56

+0

好赶eee,我忘了提及。虽然我不确定基南会发送异常。 – brice 2012-02-25 15:46:10