2012-08-28 59 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

相關問題