2014-10-10 172 views
2

我正在学习有关Java的套接字编程。使用Java 8,有这个简单的服务器:无法连接Java套接字服务器和客户端

import java.net.InetAddress; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class Main { 
    public static void main(String[] args) throws Exception { 
     System.out.println("MY IP address is " + InetAddress.getLocalHost().getHostAddress()); 
     ServerSocket server  = new ServerSocket(4031); 
     Socket socket   = server.accept(); 
     System.out.println("Yay somebody connected! " + socket); 
     socket.close(); 
     server.close(); 
    } 
} 

它所做的就是显示主机的地址,然后等待一个插座进行连接。

而且有这样的客户:

import java.net.Socket; 

public class Main { 
    public static void main(String[] args) throws Exception { 
     System.out.println("Trying to connect..."); 
     Socket s = new Socket("123.456.7.890", 4031); 
     System.out.println("Cool"); 
     s.close(); 
    } 
} 

当我运行在我家的服务器和客户端(在两个不同的计算机),这个工程:我简单地抓取服务器显示的IP地址,将其提供给客户端,并建立连接。

现在我在我家有这个相同的服务器,而我在办公室运行我的客户端。在同一个过程中,我将服务器打印的IP地址提供给我的客户端。但是,连接永远不会建立:服务器或客户端都不会生成套接字。

  • 恰巧与Java 7和8
  • 试了不同端口两者。
  • 不引发任何异常。两个节目都挂在那里等着。
  • 我在两台机器上都使用Mac OSX Mavericks 10.9.5。
  • 两台计算机上的防火墙均已关闭。
  • 他们确实连接到互联网。实际上,我使用Chrome远程桌面来控制服务器并检查其状态。
  • 当两台机器都在同一栋房子里时,这很好。但不是当一个人在房子里,另一个人在别的地方时。
  • 是的,这也适用于本地主机。

以上几点似乎表明问题出在我用来连接到我的服务器的IP地址。也许InetAddress.getLocalHost().getHostAddress()不适合这个 - 虽然它让我感到困惑,为什么这个工作在同一个房子里的两台机器。

这是什么,我做错了?

+0

在您的问题中发布堆栈跟踪。总是。此代码不会永久封锁。我怀疑你正在得到连接超时。它会在一分钟左右发生。也许你没有耐心。 – EJP 2014-10-10 23:48:31

+0

@Voldemort,你是否进一步分析了这个问题? – aioobe 2014-10-13 15:37:26

回答

1

你说你的防火墙被关闭在两台机器上,但你也必须确保

  1. 连接到您的公共 IP。您的服务器报告的IP可能是您通过DHCP从路由器收到的局域网IP

  2. 您还必须确保您的路由器配置为将连接转发到公用IP的端口4031到IP的服务器(而不是本地网络上的其他机器)。

最后,您的ISP禁止在家中设置服务器的风险很小。在这种情况下,他们可能非常邪恶,以至于阻止传入的连接。

+0

奇怪的是,当我使用公共IP时,即使服务器和客户端都在同一台机器上,它也不起作用。我想这个问题是与路由器然后 - 我不知道如何配置,但我现在看看。 – Voldemort 2014-10-10 19:55:01

+0

我并不感到惊讶,您无法从您的网络连接到您的公共IP。 – aioobe 2014-10-10 20:24:05

+0

下面是配置端口转发的很好的资源:http://portforward.com/english/routers/port_forwarding/ – aioobe 2014-10-10 20:24:43

相关问题