1

我在java中的套接字使用方面遇到了麻烦。首先,让我解释一下我想用 java 中的套接字做什么。我想通过它通过 Internet 连接我的笔记本电脑。我的笔记本电脑有一个服务器,一个客户端必须通过互联网连接。因为我有一个路由器来处理我的本地网络,并且我不想将路由器上的端口连接到我的笔记本电脑,所以我需要遵循路径“internet->router->localNetwork->mylaptop”。问题是我找到了一种同时使用互联网 IP 地址和本地 IP 地址的方法;但是,它会引发异常:"Exception in thread "main" java.net.BindException: Address already in use"

我尝试的代码是:

InetAddress addr = InetAddress.getByName("XXX.XXX.XXX.XXX");
InetAddress local = InetAddress.getByName("YYY.YYY.YYY.YYY");
Socket socket = new Socket(addr, 1111, local, 1111); // The line I have got exception

通过将路由器端口连接到我的笔记本电脑,我可以出于类似目的运行此代码:

Socket socket = new Socket("XXX.XXX.XXX.XXX", 1111);

*Xs 代表互联网 IP 地址

*Ys 代表本地 IP 地址

*代码属于代码的客户端

4

2 回答 2

3

据我了解,您有一个带有 NAT 的 Internet (WAN) IP XXX.XXX.XXX.XXX 的路由器,并且您有一台连接到路由器的本地 (LAN) IP YYY.YYY.YYY.YYY 的笔记本电脑,并且你假设

Socket socket = new Socket(InetAddress.getByName("XXX.XXX.XXX.XXX"), 1111, InetAddress.getByName("YYY.YYY.YYY.YYY"), 1111);

将连接到笔记本电脑。这是不正确的。

您正在使用的类的构造函数的文档Socket告诉:

创建一个套接字并将其连接到指定远程端口上的指定远程主机。Socket 还将 bind() 到提供的本地地址和端口。

不是你想要的。

你不能像这样连接到 NAT 后面的设备。您必须“在路由器上引导一个端口”。

于 2013-07-21T20:09:30.737 回答
0

您不需要指定本地地址:套接字的端口,您这样做不正确。删除最后两个参数。

于 2013-07-21T22:29:14.113 回答