2014-02-05 81 views
1

我遇到了Java套接字程序的问题。 我在主机A上打开一个ServerSocket。 在主机B上,它位于同一个专用网络中,我尝试绑定到服务器,但我总是得到一个超时。Java Socket只适用于“本地主机”,但不适用于私人网络

Host A |服务器| IP:192.168.56.1
Host 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 服务器并输入“本地主机插座不正常工作”。
这里有什么问题?谢谢你的帮助。

+0

你可以通过ping到达主机吗? – Markus

回答

0

如果您的子网掩码为255.255.255.0(这是C类专用子网的规范),那么你的两台机器在不同的子网:

Host A | Server | IP: 192.168.56.1 
Host B | Client | IP: 192.168.47.1 

的0.56。和.47。成为操作元素。尝试将IP更改为192.168.56.0/24192.168.47.0/24,这样你就可以。

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

干杯,

0

这通常意味着输入端口2323是不是主机A.开放
所以主机B无法在主机A

连接到端口2323在局域网并不是所有的端口是开放的。您不能在任何您需要的端口上连接
到任何机器(从您的LAN)。

试试这个从主机B:

telnet 92.168.56.1 2323

如果无法以这种方式进行连接,然后你的客户端的Java程序
将无法​​连接太,这是正常的。

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

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

-1

添加在HOST文件中的条目,如果IP是reachble

+0

主机文件连接IP和主机名 - 它与连接完全无关! –

0

的Javadoc setSoTimeout(int)这样说:

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

试试这个:

welcomeSocket。setSoTimeout(0);

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

注意:确保两台机器都可以相互访问以确保正确连接。

+0

由于OP声明它在'localhost'上工作,所以它很可能不是一个延迟问题,但是否则你的观点是正确的(但是如前所述,无关紧要)。 –

0

谢谢你的帮助!

我的程序现在工作正常。 感谢安德斯提示不同的子网掩码,我认识到 IP是错误的。看着Windows控制面板,我发现主机A有一个不同的IP地址 。实际上它们在同一个子网掩码中。

我是相当相当期待通过

InetAddress.getLocalHost().getHostAddress() 

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

相关问题