我創建了一個聊天程序,要求用戶選擇客戶端或服務器角色。我在消除這個要求方面的做法是,讓每個用戶啓動他們自己的服務器,在那裏他們會從中獲取消息。這應該允許我讓兩個客戶端與另一個客戶端進行通信,而不必在它們之間放置服務器。套接字無法創建,拋出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)
打印異常的錯誤信息;對於確定發生異常的原因非常有用。 – Vulcan
您是否嘗試過'netstat -tupln'並檢查該端口是否已被綁定到其他東西? – noMAD
@Vulcan:我現在添加了它。不知道爲什麼我以前沒有想過這個。 –