2013-02-01 112 views
0

我創建了一個聊天程序,要求用戶選擇客戶端或服務器角色。我在消除這個要求方面的做法是,讓每個用戶啓動他們自己的服務器,在那裏他們會從中獲取消息。這應該允許我讓兩個客戶端與另一個客戶端進行通信,而不必在它們之間放置服務器。套接字無法創建,拋出IOException

現在我已經修改了我的程序,使得客戶端發送和服務器進行接收。

請注意,兩個程序之間的通信工作完美無缺,直到這些更改。然而,現在我已經改變了一些東西,只要我創建套接字時就會發生錯誤。

我的節目,直到這一問題的流程如下:

  • 計劃開始
  • Server會自動啓動,綁定到本地端口6666
  • 連接配置彈出,用戶點擊保存按鈕(目標主機和端口保存)
  • 用戶點擊連接按鈕
  • 程序創建一個客戶端線程
  • 線程創建套接字並啓動出站流

經過一些調試後,我發現此套接字永遠不會創建。

當流程進入這個階段(列表中的最後一個項目)時,只有'第一個測試'被執行。

public void run() { 
      System.out.println("First test"); 
      createConnection(); 
      System.out.println("Second test"); 
      initiateIO(); 
    } 

private void createConnection() { 
     try { 
      socket = new Socket(host, port); 
     } catch (UnknownHostException e) { 
      OutputUtil.showErrorMessage("Couldn't bind socket to unknown host", "Unknown host"); 
     } catch (IOException e) { 
      OutputUtil.showErrorMessage("General IO error at creating client socket", "IO error"); 
     } 
    } 

private void initiateIO() { 
     try { 
      outbound = new PrintWriter(socket.getOutputStream(), true); 
     } catch (IOException e) { 
      OutputUtil.showErrorMessage("Couldn't load IO streams from client", "IO Error"); 
     } 
    } 

輸出:創建PrintWriter

Console: First test 
Popup: General IO error at creating client socket 
Console: Second test 
Console: NPE at `outbound.close()` 

我假設NPE是第一錯誤的結果,考慮到從插座的方法被調用。還應該注意,顯示第一個錯誤需要大約10秒。

起初我以爲可能會引入錯誤,因爲本地服務器和與其他客戶端的連接使用端口6666,但在端口6667上創建鏈接後,問題仍然存在。審查後有意義。

當其中outbound是「第二次測試」消息後初始化(行我調試點,插座具有價值null

我的問題是:爲什麼不能套接字創建的文件只規定

IOException異常。 - 如果創建套接字時發生I/O錯誤

這是沒有多大用處

完整的源代碼可以找到here以獲得更好的概述。

編輯:從第一個主錯誤打印堆棧跟蹤。

java.net.ConnectException: Connection timed out: connect 
    at java.net.DualStackPlainSocketImpl.connect0(Native Method) 
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) 
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) 
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) 
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source) 
    at java.net.PlainSocketImpl.connect(Unknown Source) 
    at java.net.SocksSocketImpl.connect(Unknown Source) 
    at java.net.Socket.connect(Unknown Source) 
    at java.net.Socket.connect(Unknown Source) 
    at java.net.Socket.<init>(Unknown Source) 
    at java.net.Socket.<init>(Unknown Source) 
    at core.Client.createConnection(Client.java:30) 
    at core.Client.run(Client.java:64) 
    at java.lang.Thread.run(Unknown Source) 
+2

打印異常的錯誤信息;對於確定發生異常的原因非常有用。 – Vulcan

+0

您是否嘗試過'netstat -tupln'並檢查該端口是否已被綁定到其他東西? – noMAD

+0

@Vulcan:我現在添加了它。不知道爲什麼我以前沒有想過這個。 –

回答

-1

套接字是客戶端/服務器的定義。您始終需要綁定到6666端口的ServerSocket並監聽來自客戶端Socket的傳入連接。

兩個客戶端中的一個成功綁定了一個ServerSocket?

+0

如果這是他的'連接被拒絕'的問題。 – EJP

0

這是一個防火牆問題。您指定的目標端口未在目標的防火牆中打開。

服務器可能沒有運行,但如果這是唯一的問題,它會'連接被拒絕',而不是'連接超時:連接'。