我正在嘗試制作一個服務器客戶端程序,該程序允許在不等待響應的情況下從服務器向客戶端發(fā)送多條消息,反之亦然。當第一個客戶端連接和斷開連接時,該程序工作正常。但是當我再次連接客戶端時,我得到了錯誤。這是我的服務器代碼:import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import java.net.SocketException;import java.io.InputStreamReader;import java.io.BufferedReader;class Q2Server implements Runnable{ private ServerSocket serverSocket; private Socket socket; private DataOutputStream out; private BufferedReader in1; private DataInputStream in2; private Thread read, write; private String clientMsg, serverMsg; public Q2Server (int port) throws IOException{ serverSocket = new ServerSocket(port); while(true) { try { System.out.println("Waiting for client on port " + serverSocket.getLocalPort() + "..."); socket = serverSocket.accept(); System.out.println("Just connected to " + socket.getRemoteSocketAddress()); out = new DataOutputStream(socket.getOutputStream()); out.writeUTF("Thanks for connecting to " + socket.getLocalSocketAddress()); clientMsg = ""; serverMsg = ""; read = new Thread(this); write = new Thread(this); read.start(); write.start(); read.join(); write.join(); } catch(IOException e) { e.printStackTrace(); } catch(InterruptedException ie) { ie.printStackTrace(); } } }
1 回答

料青山看我應如是
TA貢獻1772條經驗 獲得超8個贊
BufferedReader
你得到一個例外,因為你試圖從一個不再存在的地方讀取,in1
特別是。在第一次運行時,所有的流和閱讀器都按它們應該打開的方式打開,但是在從客戶端收到命令后close
,您的服務器關閉了in1
. 然后,當客戶端嘗試重新連接時,程序會嘗試將 的值賦給in1.readLine()
which serverMsg
is a String
,但由于in1
is 已不復存在,因此IOException
會發(fā)生這種情況,因為BufferedReader
已關閉并且無法從中讀取任何內容。
我想既然你想讓服務器保持運行,而客戶端可以在任何給定時間連接和斷開連接,這完全有道理,也許你不應該關閉在你的情況下向服務器提供鍵盤命令的命令BufferedReader
。關閉它對我來說沒有意義,因為當客戶端斷開連接時你并沒有停止整個服務器,你只是關閉連接,但服務器仍然應該能夠接受命令。
希望這可以幫助。
添加回答
舉報
0/150
提交
取消