2013-10-11 7 views
0

서버로 문자열을 보내고 역순으로 된 문자열을 클라이언트에 다시 보내는 소켓 프로그램을 작성하려고합니다.java.net.SocketException : 연결 재설정

import java.io.*; 
import java.net.*; 

class ClientSystem 
{ 
    public static void main(String[] args) 
    { 
      String hostname = "127.0.0.1"; 
      int port = 1234; 

      Socket clientsocket = null; 
      DataOutputStream output =null; 
      BufferedReader input = null; 

      try 
      { 
        clientsocket = new Socket(hostname,port); 
        output = new DataOutputStream(clientsocket.getOutputStream()); 
        input = new BufferedReader(new InputStreamReader(clientsocket.getInputStream())); 
      } 
      catch(Exception e) 
       { 
        System.out.println("Error occured"+e); 
      } 

      try 
      { 
        while(true) 
        { 
          System.out.println("Enter input string ('exit' to terminate connection): "); 
          BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
          String inputstring = br.readLine(); 
          output.writeBytes(inputstring+"\n"); 

          //int n = Integer.parseInt(inputstring); 
          if(inputstring.equals("exit")) 
            break; 

          String response = input.readLine(); 
          System.out.println("Reversed string is: "+response); 

        } 

        output.close(); 
        input.close(); 
        clientsocket.close(); 

      } 
      catch(Exception e) 
      { 
        System.out.println("Error occured."+e); 
      } 
      /*finally 
      { 
        output.close(); 
        input.close(); 
        clientsocket.close(); 
      }*/ 

    } 
} 

가 여기 내 서버 코드입니다 : 내가 두 클라이언트를 엽니 다하기 위해 노력하고있어

import java.io.*; 
import java.net.*; 

public class ServerSystem 
{ 
    ServerSocket server = null; 
    Socket clientsocket = null; 
    int numOfConnections = 0, port; 

    public ServerSystem(int port) 
    { 
      this.port = port; 
    } 

    public static void main(String[] args) 
    { 
      int port = 1234; 
      ServerSystem ss = new ServerSystem(port); 
      ss.startServer(); 
    } 

    public void startServer() 
    { 
      try 
      { 
        server = new ServerSocket(port); 
      } 
      catch(Exception e) 
      { 
        System.out.println("Error occured."+e); 
      } 

      System.out.println("Server has started. Ready to accept connections."); 

      while(true) 
      { 
        try 
        { 
          clientsocket = server.accept(); 
          numOfConnections++; 
          ServerConnection sc = new ServerConnection(clientsocket, numOfConnections, this); 
          new Thread(sc).start(); 
        } 
        catch(Exception e) 
        { 
          System.out.println("Error occured."+e); 
        } 
      } 
    } 

    public void stopServer() 
    { 
      System.out.println("Terminating connection"); 
      System.exit(0); 
    } 
} 

class ServerConnection extends Thread 
{ 
    BufferedReader br; 
    PrintStream ps; 
    Socket clientsocket; 
    int id; 
    ServerSystem ss; 

    public ServerConnection(Socket clientsocket, int numOfConnections, ServerSystem ss) 
    { 
      this.clientsocket = clientsocket; 
      id = numOfConnections; 
      this.ss = ss; 

      System.out.println("Connection "+id+" established with "+clientsocket); 
      try 
      { 
        br = new BufferedReader(new InputStreamReader(clientsocket.getInputStream())); 
        ps = new PrintStream(clientsocket.getOutputStream()); 
      } 
      catch(Exception e) 
      { 
        System.out.println("Error occured."+e); 
      } 
    } 

    public void run() 
    { 
      String line; 
      try 
      { 
        boolean stopserver = false; 
        while(true) 
        { 
          line = br.readLine(); 
          System.out.println("Received string: "+line+" from connection "+id); 
          long threadID = Thread.currentThread().getId(); 
          System.out.println("Thread ID: "+threadID+" is doing the current task."); 

          if(line.equals("exit")) 
          { 
            stopserver = true; 
            break; 
          } 
          else 
          { 
            int len = line.length(); 
            String reversedstring = ""; 
            for (int i=len-1; i>=0; i--) 
              reversedstring = reversedstring + line.charAt(i); 
              ps.println(""+reversedstring); 

          } 
} 
        System.out.println("Connection "+id+" is closed."); 
        br.close(); 
        ps.close(); 
        clientsocket.close(); 

        if(stopserver) 
          ss.stopServer(); 
      } 
      catch(Exception e) 
      { 
        System.out.println("Error occured."+e); 
      } 
    } 
} 

여기 내 서버 코드입니다. 클라이언트 (예 : client1) 중 하나에 "exit"를 입력하면 서버 자체가 종료됩니다. 하지만 서버를 닫지 않고 클라이언트 1과의 연결을 닫으려고합니다. 다음에 client2에 문자열을 입력하면 "java.net.SocketException : Connection Reset"이 표시됩니다.

예외를 제거하고 서버에서의 연결을 client2에 대해 아직 열어 둘 수있는 방법은 무엇입니까? 아무도 여기 좀 도와 줄래? 미리 감사드립니다. :)

답변

2

그것은 당신의 코드입니다 :

while(true){ 
    ... 
    if(line.equals("exit")) 
    { 
      stopserver = true; 
      break; 
    } 
    ... 
} 
... 
if(stopserver) 
ss.stopServer(); 
+0

이 어떤 변화 내가해야합니까? – user2201650

+0

다른 명령 (예 : bye)을 사용하여 서버를 종료하십시오. – crybird

+0

그러나 여전히 동일한 예외가 발생합니다. – user2201650

관련 문제