猿问

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

我正在尝试制作一个服务器客户端程序,该程序允许在不等待响应的情况下从服务器向客户端发送多条消息,反之亦然。当第一个客户端连接和断开连接时,该程序工作正常。但是当我再次连接客户端时,我得到了错误。这是我的服务器代码:

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();

            }

        }


    }



心有法竹
浏览 120回答 1
1回答

料青山看我应如是

BufferedReader你得到一个例外,因为你试图从一个不再存在的地方读取,in1特别是。在第一次运行时,所有的流和阅读器都按它们应该打开的方式打开,但是在从客户端收到命令后close,您的服务器关闭了in1. 然后,当客户端尝试重新连接时,程序会尝试将 的值赋给in1.readLine()which serverMsgis a String,但由于in1is 已不复存在,因此IOException会发生这种情况,因为BufferedReader已关闭并且无法从中读取任何内容。我想既然你想让服务器保持运行,而客户端可以在任何给定时间连接和断开连接,这完全有道理,也许你不应该关闭在你的情况下向服务器提供键盘命令的命令BufferedReader。关闭它对我来说没有意义,因为当客户端断开连接时你并没有停止整个服务器,你只是关闭连接,但服务器仍然应该能够接受命令。希望这可以帮助。
随时随地看视频慕课网APP

相关分类

Java
我要回答