2013-10-24 3 views
5

私は以下のような単純なサーバーとクライアントの例を書いています。ソケットクローズ例外

クライアント:

  • オープン接続
  • 、OutputStreamを取得
  • 取得するInputStream出力ストリームをストリーミングし、閉じるに書き込み、ストリームから読み込まれました。クライアントソケットクローズ例外の下に取得

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

    :この時点

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

クライアントで例外を取得します。あなたは私に理由を教えてください。

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) 

答えて

6

java.net.SocketExceptionがソケットは、この例外は、ソケットが閉じられ、それを使用しようとし続けていることを意味し 閉じられています。

os.close(); 

あなたはここでそれを閉じました。 Socketの入力ストリームまたは出力ストリームのいずれかを閉じると、もう一方のストリームとSocketが閉じられます。

+1

。..してみてください。しかし 'のSystem.out.println(sock.isConnected())、その後

OutputStream.close(); 

をして;'真 – Abhilash

+1

@Abhilashは無関係に印刷されます。 'isConnected()'はあなたが 'Socket.'に接続したかどうかを知らせます。***接続されているかどうかは***ではありません。 ( 'isConnected()'と 'isClosed()'メソッドは、接続の状態ではなく*ソケットの状態に関するものです。) – EJP

0

java.net.SocketExceptionは、サーバーから読み取る前にOutputStream(または)ソケットを閉じるときにのみ発生します。あなたのコードから

、削除:

関連する問題