Java Socket仅适用于“localhost”,但不适用于专用网络

时间:2014-02-05 10:27:54

标签: java sockets timeout localhost subnet

我的java套接字程序出现问题。 我在主机A上打开一个ServerSocket。 在主机B上,我在同一个私人网络中 尝试绑定到服务器,但我总是会超时。

主持人A |服务器| IP:192.168.56.1
主持人B |客户| IP:192.168.47.1

在服务器主机A ::

welcomeSocket = new ServerSocket(2323);
socket = welcomeSocket.accept();

打开那个serverSocket后;主持人B:

socket = new Socket("192.168.56.1", 2323);

然后几秒钟后出现异常:

java.net.ConnectException: Connection timed out: connect

当我在主机A或B上启动服务器时,套接字运行良好 并输入“localhost”。
这有什么不对?谢谢你的帮助。

5 个答案:

答案 0 :(得分:0)

这通常意味着传入端口2323未在主机A上打开。
因此主机B无法连接到主机A上的端口2323。

在局域网中并非所有端口都是打开的。你无法连接
在您想要的任何端口上的任何机器(从您的LAN)。

从主持人B尝试:

telnet 92.168.56.1 2323

如果你不能用这种方式连接,那么你的客户端java程序
不会连接,这是正常的。

然后,您应该与您的网络管理员联系。

如果你能用这种方式连接,那么你应该看看 以某种方式修复你的java程序。

答案 1 :(得分:0)

setSoTimeout(int)的Javadoc说:

  

使用指定的超时启用/禁用SO_TIMEOUT,以毫秒为单位。   将此选项设置为非零超时,调用accept()   此ServerSocket将仅阻止这段时间。如果   超时到期,但引发了java.net.SocketTimeoutException   ServerSocket仍然有效。必须在之前启用该选项   进入阻止操作才能生效。超时必须>   0.超时为零被解释为无限超时。

试试这个:

  

welcomeSocket.setSoTimeout(0);

在阻止服务器接受来自客户端的请求之前添加此语句。

注意:确保两台机器彼此均可访问,以确保正确连接。

答案 2 :(得分:0)

如果你的子网掩码是255.255.255.0(这是C类私有子网的标准),那么你的两台机器在不同的子网上:

Host A | Server | IP: 192.168.56.1
Host B | Client | IP: 192.168.47.1
.56。和.47。作为操作元素。尝试将IP更改为192.168.56.0/24192.168.47.0/24,您就可以了。

或者,您需要在两个子网之间设置静态路由。

干杯,

答案 3 :(得分:0)

感谢您帮助我!

我的程序现在正常运行。 感谢Anders对不同子网掩码的暗示,我认识到了这一点 知识产权是错误的。在Windows控制面板中查看我发现了一个不同的IP地址 对于主机A.实际上它们位于相同的子网掩码中。

我宁愿期待

给出的地址
InetAddress.getLocalHost().getHostAddress()

作为我的地址。
那么如何在java程序中显示我的“真实”IP地址?

答案 4 :(得分:-1)

如果IP可以访问,则在HOST文件中添加条目