Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java套接字绑定错误_Java_Sockets_Networking_Local - Fatal编程技术网

Java套接字绑定错误

Java套接字绑定错误,java,sockets,networking,local,Java,Sockets,Networking,Local,我在java中的套接字使用方面遇到了问题。首先,让我解释一下我想用java中的套接字做什么。我想通过它连接我的笔记本电脑。我的笔记本电脑有一个服务器和一个客户端必须通过互联网连接。因为我有一个路由器来处理我的本地网络,我不想把路由器上的端口引到我的笔记本电脑上,所以我需要遵循路径“internet->router->localNetwork->mylaptop”。问题是我找到了一种既使用互联网ip地址又使用本地ip地址的方法;但是,它会抛出一个异常:“线程”main中的异常”java.net.B

我在java中的套接字使用方面遇到了问题。首先,让我解释一下我想用java中的套接字做什么。我想通过它连接我的笔记本电脑。我的笔记本电脑有一个服务器和一个客户端必须通过互联网连接。因为我有一个路由器来处理我的本地网络,我不想把路由器上的端口引到我的笔记本电脑上,所以我需要遵循路径“internet->router->localNetwork->mylaptop”。问题是我找到了一种既使用互联网ip地址又使用本地ip地址的方法;但是,它会抛出一个异常:
“线程”main中的异常”java.net.BindException:地址已在使用中“

我尝试的代码是:

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地址


*代码属于代码的客户端

据我所知,您有一个带有互联网(WAN)IP XXX.XXX.XXX.XXX和NAT的路由器,您有一台带有本地(LAN)IP YYY.YYY.YYY的笔记本电脑连接到路由器,您假设

Socket socket = new Socket(InetAddress.getByName("XXX.XXX.XXX.XXX"), 1111, InetAddress.getByName("YYY.YYY.YYY.YYY"), 1111);
将连接到笔记本电脑这是不对的。

您正在使用的
Socket
类的构造函数的文档说明:

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

这不是你想要的


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

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

好的,很好,你已经抓住要点了。但是,如果我不想在路由器上引导端口怎么办?