2012-11-09 53 views
4

我试图从我的电脑中创建一台服务器,以便他们的电脑上的客户端可以连接并与我的电脑通信。我在31350端口上创建了服务器,客户端正在尝试通过我的路由器的IP地址进行连接。但它只能通过LAN工作,当我有“本地主机”或我的计算机的名称创建套接字的参数。而不是当我使用我的IP地址时,在不同的网络上运行客户端和服务器。这是代码。Java Socket/Serversocket广域网连接

这是我的电脑运行的服务器。

public static void main (String[] args) throws IOException 
{ 
    ServerSocket server = new ServerSocket(31350); 
    Socket client1 = server.accept(); 
} 

这里是我的朋友是他的计算机上运行的客户端代码

public static void main(String[] args) throws IOException, UnknownHostException 
{ 
    Socket socket; 

    // #'s are what I got from whatismyip.org on the server computer) 
    byte[] serverb = new byte[] {(byte)##, (byte)##, (byte)###, (byte)###}; 

    socket = new Socket(InetAddress.getByAddress(serverb),31350); 
} 

这是什么,当我在线程中运行客户端

异常“主要” java.net它说.ConnectException:连接超时:在java.net上的java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:69) 上的java.net.DualStackPlainSocketImpl.connect0(Native Method) 处连接 。 AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339) 在java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200) 在java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182) 在java.net.PlainSocketImpl。在java.net.Socket.connect(Socket.java:579) 上的java.net.SocketSocketImpl.connect(SocksSocketImpl.java:391) 连接(PlainSocketImpl.java:157) Socket.java:528) at java.net.Socket。(Socket.java:425) at java.net.Socket。(Socket.java:241) at ClientTest.main(ClientTest.java:22)// 22是socket socket = new Socket(InetAddress.getByAddress(serverb),31350);

防火墙已禁用。我的路由器上的端口31350被转发到我的计算机的本地ip地址,我使用ipconfig在cmd中获得。但它仍然不起作用,我试图从客户端计算机创建套接字时发生IOException。服务器计算机上没有任何反应。怎么了?

回答

3

[更新]

如你所料,连接超时表示这是某种网络问题。来自客户端的数据包没有到达服务器机器。确切的解决方案将取决于路由器的类型,但谷歌的术语是“端口转发”。这是我随机发现的一篇文章,可能有所帮助:http://www.rhinosoft.com/KnowledgeBase/kbarticle.asp?RefNo=1289

基本上你编程的路由器,以便在端口31350的任何连接请求将被转发到您的计算机在本地IP地址的局域网。

祝你好运!

[原创评论]

这比回答的评论(但我需要多一些空间)。你的try catch逻辑会使诊断问题变得更加困难。简化代码如下:

public static void main(String[] args) throws IOException, UnknownHostException 
{ 
    Socket socket; 

      // #'s are what I got from whatismyip.org on the server computer) 
    byte[] serverb = new byte[] {(byte)##, (byte)##, (byte)###, (byte)###}; 

    socket = new Socket(InetAddress.getByAddress(serverb),31350); 
} 

只是让原有的IOException异常传播和更新您的问题,包括异常堆栈跟踪。最初的例外包含有价值的信息 - 如果它表示连接被拒绝,则意味着一件事 - 可能您的端口号不正确。如果它表示连接超时,则意味着其他事情 - 要么确实存在防火墙问题,要么您的IP地址错误。

你的代码捕捉有用的异常,吞下它并抛出一个不太有用的异常。

做同样的事情到你的服务器代码:

public static void main (String[] args) throws IOException 
{ 
    ServerSocket server = new ServerSocket(31350); 
    Socket client1 = client1 = server.accept(); 
} 

堆栈跟踪将显示哪些方法抛出异常,所以你不需要像InetAddress creation failed

+0

由于多余的文字,那竟然是问题。我没有正确转发外部端口的端口 – user1813598