web-dev-qa-db-ja.com

ソケットクローズ例外

以下のような簡単なサーバーとクライアントの例を書きました。

クライアント:

  • 接続を開く
  • Outputstreamを取得し、ストリームに書き込み、出力ストリームを閉じます
  • Inputstreamを取得し、ストリームから読み取ります。この時点で例外を取得する

    public class DateServer {
    public static void main(String[] args) throws InterruptedException {
    ServerSocket serverSocket = null;
    Socket client = null;
    try {
        serverSocket = new ServerSocket(6013);
        while (true) {
            client = serverSocket.accept();
            OutputStream outputStream = client.getOutputStream();
            InputStream inputStream = client.getInputStream();
    
            System.out.println("" + outputStream + "-" + inputStream);
    
            BufferedReader bufferedReader = new BufferedReader(
                    new InputStreamReader(inputStream));
    
            String line = null;
            while ((line = bufferedReader.readLine()) != null) {
                System.out
                        .println("Message recieved from client ::" + line);
            }
    
            PrintWriter printWriter = new PrintWriter(outputStream, true);
    
            printWriter.println(new Java.util.Date().toString());
    
            client.close();
        }
    } catch (IOException exception) {
        exception.printStackTrace();
        System.err.println(exception);
    }
        }
    
        }
    

クライアント:

    public class DateClient {

public static void main(String[] args) throws UnknownHostException,
        IOException, InterruptedException {
    Socket sock = new Socket("127.0.0.1", 6013);
    OutputStream outputStream = sock.getOutputStream();
    InputStream inputStream = sock.getInputStream();

    System.out.println("" + outputStream + "-" + inputStream);

    PrintWriter printWriter = new PrintWriter(outputStream, true);
    printWriter.println("Hi Server");

    outputStream.close();

    System.out.println(sock.isConnected());

    BufferedReader bufferedReader = new BufferedReader(
            new InputStreamReader(inputStream));
    String line;
    while ((line = bufferedReader.readLine()) != null) { // Exception 
        System.out.println(line);
    }

}

}

クライアントでソケットクローズ例外を下回っています。その理由を教えてください。

  Exception in thread "main" Java.net.SocketException: Socket closed
at Java.net.SocketInputStream.socketRead0(Native Method)
at Java.net.SocketInputStream.read(SocketInputStream.Java:146)
at Sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.Java:282)
at Sun.nio.cs.StreamDecoder.implRead(StreamDecoder.Java:324)
at Sun.nio.cs.StreamDecoder.read(StreamDecoder.Java:176)
at Java.io.InputStreamReader.read(InputStreamReader.Java:184)
at Java.io.BufferedReader.fill(BufferedReader.Java:153)
at Java.io.BufferedReader.readLine(BufferedReader.Java:316)
at Java.io.BufferedReader.readLine(BufferedReader.Java:379)
at edu.iub.cs.httpserver.DateClient.main(DateClient.Java:32)
8
Abhilash

Java.net.SocketExceptionソケットが閉じていますこの例外は、ソケットを閉じた後、引き続き使用を試みたことを意味します。

os.close();

そして、あなたはそれをここで閉じました。ソケットの入力または出力ストリームを閉じると、他のストリームとソケットが閉じます。

10
Todd Jefferson

Java.net.SocketExceptionは、サーバーから読み取る前にOutputStream(または)ソケットを閉じた場合にのみ発生します。

コードから、以下を削除します。

OutputStream.close(); 

してみて.

2
user3003435