2012-08-28 58 views
2

我正在尝试开发一个基本的聊天应用程序。我已经为服务器和客户端编写了所需的代码,并且该应用程序在局域网上运行得非常好。但是,当我试图通过互联网工作时,我陷入了困境。我了解到我需要在服务器机器上进行端口转发,并且我这样做了。我转发了端口6000和canyouseeme.org给了一个成功的消息。所以,端口肯定是开放的,没有防火墙阻止它。但是,客户端代码无法连接到它。通过互联网在Java中聊天应用程序| ConnectException(连接超时)

服务器代码打开一个ServerSocket如下(其定义以前所做):

InetAddress IP = InetAddress.getLocalHost(); 
welcomeSocket = new ServerSocket(6000, 10, IP); 
connectionSocket = welcomeSocket.accept(); 

而且客户端代码尝试连接到它主要是使用下面的代码:

clientSocket = new Socket("xx.xxx.xxx.xx", 6000); 

哪里xx.xxx.xxx.xx是服务器的IP地址(不是本地的192.168.xx)。

这是Java的问题?我问,因为端口6000显然是开放的,canyouseeme.org可以成功连接到它,但我的客户没有这样做。为什么会发生这样的事情?任何帮助将不胜感激(更多信息,请阅读下面的评论)。

的错误信息是如下:

java.net.ConnectException: Connection timed out: connect 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333) 
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195) 
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) 
    at java.net.Socket.connect(Socket.java:519) 
    at java.net.Socket.connect(Socket.java:469) 
    at java.net.Socket.<init>(Socket.java:366) 
    at java.net.Socket.<init>(Socket.java:180) 
    at ChatPanel$ConnectButtonListener.actionPerformed(ChatPanel.java:206) 
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) 
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) 
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) 
    at java.awt.Component.processMouseEvent(Component.java:6038) 
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3265) 
    at java.awt.Component.processEvent(Component.java:5803) 
    at java.awt.Container.processEvent(Container.java:2058) 
    at java.awt.Component.dispatchEventImpl(Component.java:4410) 
    at java.awt.Container.dispatchEventImpl(Container.java:2116) 
    at java.awt.Component.dispatchEvent(Component.java:4240) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322) 
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986) 
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916) 
    at java.awt.Container.dispatchEventImpl(Container.java:2102) 
    at java.awt.Window.dispatchEventImpl(Window.java:2429) 
    at java.awt.Component.dispatchEvent(Component.java:4240) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:121) 
+0

确保没有防火墙阻止呼叫和端口打开。 – kosa

+0

那么,正如我所说,端口已经打开,没有防火墙阻止它。防火墙可以阻止客户端的传出请求吗?如果是这样,我该如何检查它? – etua

+1

确保您将端口转发到正确的内部地址(从路由器)。如果您尚未将它们设置为静态,则本地地址将在未发出警告的情况下更改。 – Wug

回答

1

在客户端,你应该使用

clientSocket = new Socket(InetAddress.getByAddress(addr), port); 

其中addr是服务器的公网地址,port是绑定到服务器。

+0

我做了这个改变,现在我可以通过端口23连接,没有任何问题。谢谢。但是端口6000仍然会造成一些麻烦。所以,我猜6000不是一个明智的港口选择。你怎么想的,我还应该保持23还是发现自己是一个像5192那样的虚拟端口? – etua

+0

你检查过NAT /防火墙配置吗?如果您有端口转发问题,请尝试以下方法http://netcallback.sourceforge.net –

+0

我现在通过TeamViewer使用服务器计算机,即使更改一个设置也需要很长时间。所以,几个小时后我会回家,我会尝试一堆不同的端口。如果我无法通过23以外的任何其他端口连接,我将检查您建议的链接,我将在此处发布。 – etua

相关问题