2013-10-11 108 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”时,服务器本身正在终止。但我不想让服务器关闭,而只是连接到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

使用另一个命令(例如再见)退出服务器 – crybird

+0

但它仍会给出相同的例外。 – user2201650

相关问题