2016-10-28 2 views
0

서버 사이트에서 루프를 사용하여 클라이언트에서 보낸 데이터를 계속 읽지 만 클라이언트에서 데이터를 보내면 서버 사이트에서 예외가 발생합니다.계속 읽기 방법 InputStream in 루프 사용 소켓 연결?

서버 사이트에서 클라이언트의 데이터를 읽을 수있는 코드를 디버깅했지만 클라이언트에서 읽기가 완료되면 루프를 멈출 수 없습니다. 예외가 발생한 것 같습니다.

MAX_INPUT이 서버로 보내는 데이터보다 작을 때 서버에서 올바르게 읽을 수있을 때 어떻게 이러한 문제를 해결할 수 있습니까?

대답은 말하자면 클라이언트 사이트에 socket.close()을 추가하고 finally 블록에 연결 재설정 문제가 수정되었습니다.

동시에 서버 사이트 MAX_INPUT = 8을 설정하면 해당 서버에서 입력 바이트를 계속 읽고 클라이언트로 다시 보낼 수 있습니다.

Server's response is: This is 
Server's response is: This is 
Server's response is: This is Seq.0 request send to server! 
Server's response is: This is Seq.3 request send to server! 
Server's response is: This is Seq.4 request send to server! 

또는 때때로 서버 사이트 던져 예외 같은 :

java.net.SocketException: Software caused connection abort: recv failed 
at java.net.SocketInputStream.socketRead0(Native Method) 
at java.net.SocketInputStream.read(Unknown Source) 
at java.net.SocketInputStream.read(Unknown Source) 
at java.net.SocketInputStream.read(Unknown Source) 
at com.simple.server.Server$Handler.run(Server.java:44) 
at java.lang.Thread.run(Unknown Source) 

[서버 사이트 코드 :

import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.ServerSocket; 
import java.net.Socket; 


public class Server implements Runnable { 
    public final static int port = 8080; 
    public final static String host = "127.0.0.1"; 
    public final static int MAX_INPUT = 1024; 

    public void run() { 
     try { 
      ServerSocket serverSocket = new ServerSocket(port); 
      System.out.println("Server begin to listen to port to accept!\n"); 
      while (!Thread.interrupted()) { 
       Socket socket = serverSocket.accept(); 
       new Thread(new Handler(socket)).start(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    private static class Handler implements Runnable { 

     private Socket _socket; 

     Handler(Socket socket) { 
      _socket = socket; 
     } 

     public void run() { 
      try { 

       InputStream in = _socket.getInputStream(); 
       OutputStream out = _socket.getOutputStream(); 

       int read; 
       byte[] buf = new byte[MAX_INPUT]; 
       // I use a loop to continue to read 
       // data from client 
       while ((read = in.read(buf)) != -1) 
        out.write(buf, 0, read); 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } finally { 
       try { 
        _socket.close(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

    public static void main(String args[]) { 
     new Thread(new Server()).start(); 
    } 

} 

그러나 결과는 클라이언트가 전체 데이터를 수신 할 수 없다는 것입니다 고객 사이트 코드 :

public class Client implements Runnable { 

    public final static String host = "127.0.0.1"; 
    public final static int port = 8080; 
    public final static int MAX_INPUT = 1024; 

    private int seq; 

    Client(int seq) { 
     this.seq = seq; 
    } 

    public void run() { 
     try { 

      Socket client = new Socket(host, port); 


      OutputStreamWriter writer = new OutputStreamWriter(client.getOutputStream()); 
      InputStreamReader reader = new InputStreamReader(client.getInputStream()); 
      writer.write("This is Seq." + seq + " request send to server!"); 
      writer.flush(); 

      char[] buf = new char[MAX_INPUT]; 
      int len = reader.read(buf); 
      String response = new String(buf, 0, len); 

      System.out.println("Server's response is: " + response); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String args[]) { 

     Thread threads[] = { 
      new Thread(new Client(0)), 
      new Thread(new Client(1)), 
      new Thread(new Client(2)), 
      new Thread(new Client(3)), 
      new Thread(new Client(4)) 
     }; 

     for(Thread thread : threads) 
      thread.start(); 
    } 
} 

투사 예외 :

java.net.SocketException: Connection reset 
at java.net.SocketInputStream.read(Unknown Source) 
at java.net.SocketInputStream.read(Unknown Source) 
at java.net.SocketInputStream.read(Unknown Source) 
at com.simple.server.Server$Handler.run(Server.java:44) 
at java.lang.Thread.run(Unknown Source) 
+0

어떻게 서버 측에서 MAX_INPUT에 액세스하고 계십니까? – Jois

+0

나는'public final static int MAX_INPUT = 1024;로 초기화한다. –

+0

미안하다. – Jois

답변

1

서버가 스트림의 말까지 입력을 읽고 잘 지내을 반향한다. 귀하의 고객은 하나의 요청을 보내고 하나의 응답을 읽고 결코 소켓을 닫지 않습니다. 따라서 서버가 스트림 종료를 경험하는 대신 클라이언트 프로세스가 종료 될 때 연결 리셋이 발생합니다.

해결 방법 : 클라이언트의 소켓을 닫습니다.

+0

제대로 실행되는 클라이언트의 소켓을 닫습니다! –