为了账号安全,请及时绑定邮箱和手机立即绑定

Java IOException 流在服务器客户端程序中关闭

Java IOException 流在服务器客户端程序中关闭

心有法竹 2023-06-08 20:06:29
我正在尝试制作一个服务器客户端程序,该程序允许在不等待响应的情况下从服务器向客户端发送多条消息,反之亦然。当第一个客户端连接和断开连接时,该程序工作正常。但是当我再次连接客户端时,我得到了错误。这是我的服务器代码: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 serverMsgis a String,但由于in1is 已不复存在,因此IOException会发生这种情况,因为BufferedReader已关闭并且无法从中读取任何内容。

我想既然你想让服务器保持运行,而客户端可以在任何给定时间连接和断开连接,这完全有道理,也许你不应该关闭在你的情况下向服务器提供键盘命令的命令BufferedReader。关闭它对我来说没有意义,因为当客户端断开连接时你并没有停止整个服务器,你只是关闭连接,但服务器仍然应该能够接受命令。

希望这可以帮助。


查看完整回答
反对 回复 2023-06-08
  • 1 回答
  • 0 关注
  • 119 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信