我正在尝试制作一个服务器客户端程序,该程序允许在不等待响应的情况下从服务器向客户端发送多条消息,反之亦然。当第一个客户端连接和断开连接时,该程序工作正常。但是当我再次连接客户端时,我得到了错误。这是我的服务器代码: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
会发生这种情况,因为BufferedReader
已关闭并且无法从中读取任何内容。
我想既然你想让服务器保持运行,而客户端可以在任何给定时间连接和断开连接,这完全有道理,也许你不应该关闭在你的情况下向服务器提供键盘命令的命令BufferedReader
。关闭它对我来说没有意义,因为当客户端断开连接时你并没有停止整个服务器,你只是关闭连接,但服务器仍然应该能够接受命令。
希望这可以帮助。
添加回答
举报
0/150
提交
取消