【发布时间】:2015-06-16 18:27:57
【问题描述】:
我正在编写一个使用 DatagramChannel(非阻塞)发送/接收数据的服务器。它在我的本地网络上完美运行,但如果我尝试使用来自不同网络(即通过互联网)的客户端应用程序连接到它,我无法访问它。
在运行时,如果我使用http://ping.eu/port-chk/ 检查端口,它会说它已关闭。我已转发适当的端口并将防火墙调整到适当的级别。
我的代码如下:
public void runServer(int portNo)
{
try
{
serverChannel = DatagramChannel.open();
ipAddress = InetAddress.getLocalHost();
//ipAddress = InetAddress.getByName(getPublicIP());
//serverChannel.setOption(StandardSocketOptions.SO_REUSEADDR, true); //Added in to try to fix
serverChannel.socket().bind(new InetSocketAddress(portNo));
serverChannel.configureBlocking(false);
serverChannel.socket().setReceiveBufferSize(receiveBufferSize);
serverChannel.socket().setSendBufferSize(sendBufferSize);
//serverChannel.connect(new InetSocketAddress(ipAddress,portNo)); //Added in to try to fix
serverRunning = true;
}
catch(IOException e)
{
e.printStackTrace();
}
}
注释掉的部分没有效果。示例中的 ipAddress 变量将获取本地 IP,而注释掉的版本将获取计算机的公共 IP。
如果您能帮助我找出我无法通过 Internet 连接到此端口的原因,我将不胜感激。
【问题讨论】:
-
您没有正确转发端口。与代码无关。离题。
-
@EJP 代码是否保持原样,即没有取消注释注释行?
-
如果我添加:
System.out.println("Server: CHANNEL SOCKET LOCAL IP: "+serverChannel.socket().getLocalAddress()+" | CHANNEL SOCKET REMOTE IP: "+serverChannel.socket().getRemoteSocketAddress()+" | CHANNEL SOCKET PORT: "+serverChannel.socket().getPort()+" | CHANNEL SOCKET LOCAL PORT: "+serverChannel.socket().getLocalPort());,它会打印出:“服务器:通道套接字本地 IP:/0:0:0:0:0:0:0:0 | CHANNEL SOCKET REMOTE IP: null | CHANNEL SOCKET PORT: -1 | CHANNEL SOCKET LOCAL PORT: 8888" -
仅供参考,我为 TCP/UDP 设置了端口转发端口 8888-9000,为我的 PC 设置了 DMZ,并关闭了防火墙。我有一个 ServerSocket 在端口 9000 上的这个程序(TCP)内的不同线程上运行,并且可以完美地被 ping 通@EJP
-
所以你已经完美地打开了 TCP 端口,而不是 UDP 端口。
标签: java networking blocking channel datagram