2013-12-08 3 views
0

여러 소켓을 허용하는 간단한 서버를 작성한 후 &을 입력하고 출력 할 수있게했습니다.Java 다중 클라이언트 서버 소켓 오류가 발생했습니다.

그러나 많은 오류가 발생하는 것처럼 잘못하고있는 것처럼 보입니다. 내가 그렇게 나쁜 짓을하려는거야? 더 나은 방법으로 어떻게 할 수 있습니까? 오류의

Starting up.. 
Trying to listen... 
Server is successfully running on port 43594 
New connection: /127.0.0.1:60639 
java.net.SocketException: Connection reset 
    at java.net.SocketInputStream.read(Unknown Source) 
    at java.net.SocketInputStream.read(Unknown Source) 
    at sun.nio.cs.StreamDecoder.readBytes(Unknown Source) 
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source) 
    at sun.nio.cs.StreamDecoder.read(Unknown Source) 
    at java.io.InputStreamReader.read(Unknown Source) 
    at java.io.BufferedReader.fill(Unknown Source) 
    at java.io.BufferedReader.readLine(Unknown Source) 
    at java.io.BufferedReader.readLine(Unknown Source) 
    at Client.getInputStream(Client.java:29) 
    at ClientHandler.run(ClientHandler.java:19) 
java.net.SocketException: Connection reset 
    at java.net.SocketInputStream.read(Unknown Source) 
    at java.net.SocketInputStream.read(Unknown Source) 
    at sun.nio.cs.StreamDecoder.readBytes(Unknown Source) 
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source) 
    at sun.nio.cs.StreamDecoder.read(Unknown Source) 
    at java.io.InputStreamReader.read(Unknown Source) 
    at java.io.BufferedReader.fill(Unknown Source) 
    at java.io.BufferedReader.readLine(Unknown Source) 
    at java.io.BufferedReader.readLine(Unknown Source) 
    at Client.getInputStream(Client.java:29) 
    at ClientHandler.run(ClientHandler.java:19) 
java.net.SocketException: Connection reset 
    at java.net.SocketInputStream.read(Unknown Source) 
    at java.net.SocketInputStream.read(Unknown Source) 
    at sun.nio.cs.StreamDecoder.readBytes(Unknown Source) 
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source) 
    at sun.nio.cs.StreamDecoder.read(Unknown Source) 
    at java.io.InputStreamReader.read(Unknown Source) 
    at java.io.BufferedReader.fill(Unknown Source) 
    at java.io.BufferedReader.readLine(Unknown Source) 
    at java.io.BufferedReader.readLine(Unknown Source) 
    at Client.getInputStream(Client.java:29) 
    at ClientHandler.run(ClientHandler.java:19) 
java.net.SocketException: Connection reset 
    at java.net.SocketInputStream.read(Unknown Source) 
    at java.net.SocketInputStream.read(Unknown Source) 
    at sun.nio.cs.StreamDecoder.readBytes(Unknown Source) 
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source) 
    at sun.nio.cs.StreamDecoder.read(Unknown Source) 
    at java.io.InputStreamReader.read(Unknown Source) 
    at java.io.BufferedReader.fill(Unknown Source) 
    at java.io.BufferedReader.readLine(Unknown Source) 
    at java.io.BufferedReader.readLine(Unknown Source) 
    at Client.getInputStream(Client.java:29) 
    at ClientHandler.run(ClientHandler.java:19) 
java.net.SocketException: Connection reset 
    at java.net.SocketInputStream.read(Unknown Source) 
    at java.net.SocketInputStream.read(Unknown Source) 
    at sun.nio.cs.StreamDecoder.readBytes(Unknown Source) 
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source) 
    at sun.nio.cs.StreamDecoder.read(Unknown Source) 
    at java.io.InputStreamReader.read(Unknown Source) 
    at java.io.BufferedReader.fill(Unknown Source) 
    at java.io.BufferedReader.readLine(Unknown Source) 
    at java.io.BufferedReader.readLine(Unknown Source) 
    at Client.getInputStream(Client.java:29) 
    at ClientHandler.run(ClientHandler.java:19) 
java.net.SocketException: Connection reset 
    at java.net.SocketInputStream.read(Unknown Source) 
    at java.net.SocketInputStream.read(Unknown Source) 
    at sun.nio.cs.StreamDecoder.readBytes(Unknown Source) 
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source) 
    at sun.nio.cs.StreamDecoder.read(Unknown Source) 
    at java.io.InputStreamReader.read(Unknown Source) 
    at java.io.BufferedReader.fill(Unknown Source) 
    at java.io.BufferedReader.readLine(Unknown Source) 
    at java.io.BufferedReader.readLine(Unknown Source) 
    at Client.getInputStream(Client.java:29) 
    at ClientHandler.run(ClientHandler.java:19) 

그리고 많은 더 많은 라인 :

는 나는 이러한 오류를 얻는 이유를 이해 해달라고. 그 기본적으로 반복 같은 오류가 반복하지만, 왜?

나는 코드를 주석 처리 했으므로 내가 시도한 것을보고 어쩌면 내가 그런 식으로 수정할 수 있습니다. 왜 연결이 재설정을 받고 계속됩니다

public class TestClient { 

    /** 
    * @param args 
    * @throws IOException 
    * @throws UnknownHostException 
    */ 
    public static void main(String[] args) { 
     try { 
      System.out.println("Client started"); 
      Socket sock = new Socket("localhost", 43594); 
      Scanner scanner = new Scanner(System.in); 
      String input; 
      PrintWriter out = new PrintWriter(sock.getOutputStream()); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(sock.getInputStream())); 

      input = scanner.nextLine(); 

      if (input != null) { 
       out.print(input); 
      } 
      if (reader.toString() != null) { 
       System.out.println(reader.toString()); 
      } 
     } catch (IOException e) { 
      System.out.println("Client error"); 
     } 

    } 

} 

: 그것은 도움이 될 것입니다 경우

public class Server { 

    private int port = 43594; 

    public void listen() { 
     System.out.println("Trying to listen..."); 
     try { 
      final ServerSocket server = new ServerSocket(port); 
      // Create new thread to handle clients I/O 
      ClientHandler handler = new ClientHandler(server); 
      // START it 
      handler.start(); 
      System.out.println("Server is successfully running on port " + port); 
      while (true) { 
       // New connection found create a new Client object 
       Client cl = new Client(server.accept()); 
       cl.setup(); 
       // add it to clietns list in the I/O handler 
       handler.clients.add(cl); 
      }   
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 

    public static void main(String[] args) { 
     // start up 
     System.out.println("Starting up.."); 

     // server instance 
     final Server server = new Server(); 

     // create a new thread for server 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       // listen for new connections 
       server.listen(); 
      } 
     }).start(); 
    } 
} 

public class ClientHandler extends Thread { 

    private Thread handler; 
    public ArrayList<Client> clients = new ArrayList<Client>(); // client list 
    private ServerSocket server; 

    public ClientHandler(ServerSocket s) { 
     server = s; 
    } 

    public void run() { 

     while(true) { 
      // Loop every time through every client and see if he has wrote 
      // anything to do server. I am 100% sure this is wrong, how can I do this 
      // without using multithreads (thread per client)? 
      for (Client c : this.clients) { 
       if (c.getInputStream() != null) { 
        // found input, return a message. 
        c.sendMessage("hey client"); 
       } 
      } 
      try { 
       // sleep for 100ms 
       Thread.sleep(100); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

public class Client { 

    private Socket socket; 
    private int clientId; 
    private BufferedReader inStream; 
    private PrintWriter outStream; 
    private boolean socketAlive = true; 

    public Client(Socket sock) { 
     this.socket = sock; 
    } 

    public void setup() { 
     setInputOutputStream(); 
     System.out.println("New connection: " + this.getIpAddress()); 
     this.sendMessage("Successfully connected!"); 
    } 


    public String getInputStream() { 
     String toReturn = ""; 
     try { 
      toReturn = this.inStream.readLine(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return toReturn; 
    } 

    private void setInputOutputStream() { 
     try { 
      inStream = new BufferedReader(new InputStreamReader(this.socket.getInputStream())); 
      outStream = new PrintWriter(this.socket.getOutputStream()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void sendMessage(String s) { 
     this.outStream.println(s); 
     this.outStream.flush(); 
    } 

    public String getIpAddress() { 
     return this.socket.getRemoteSocketAddress().toString(); 
    } 
} 

그리고하지 않도록,이 클라이언트는 무엇입니까?

답변

0

클라이언트 에는 루프 또는 지연이 없으므로이므로 데이터를 보내 자마자 즉시 종료됩니다. 프로그램이 종료되면 운영 체제는 항상 모든 네트워크 연결을 닫습니다.

또한 나는 이것이 당신이 원하는 것을 수행하지 않는다고 생각합니다 : System.out.println(reader.toString());. 클라이언트의 출력을 확인하십시오!

0

클라이언트에서 읽지 않은 서버의 내용을 쓰고 있습니다. 대신 클라이언트는 인쇄 후에 종료됩니다. 'reader.toString()은 I/O를 수행하지 않습니다. read 메소드를 호출해야합니다.

관련 문제