2013-10-11 2 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); 
      } 
    } 
} 

Я пытаюсь открыть два клиента. Когда я набираю «exit» у одного из клиентов (например, client1), сам сервер завершается. Но я не хочу, чтобы сервер закрывался, но только соединение с client1 закрывалось. Когда я следующий, введите строку в 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

Смежные вопросы