2014-02-07 117 views
1

有很多的CLOSE_WAIT连接,当过客户端的客户端将消息发送到服务器,并散发出来的TCP FSM卡在CLOSE_WAIT状态TCP连接

此客户端的代码,

public class Client1 
    { 

     private static Socket socket; 
     public static void main(String args[]) 
     { 
      try 
      { 
       String host = "localhost"; 
       int port = 25000; 
       InetAddress address = InetAddress.getByName(host); 
       socket = new Socket(address, port); 
       //Send the message to the server 
       OutputStream os = socket.getOutputStream(); 
       OutputStreamWriter osw = new OutputStreamWriter(os); 
       BufferedWriter bw = new BufferedWriter(osw); 
       String number = "2"; 
       String sendMessage = number + "\n"; 
       bw.write(sendMessage); 
       bw.flush(); 
       System.out.println("Message sent to the server : "+sendMessage); 
       //Get the return message from the server 
       InputStream is = socket.getInputStream(); 
       InputStreamReader isr = new InputStreamReader(is); 
       BufferedReader br = new BufferedReader(isr); 
       String message = br.readLine(); 
       System.out.println("Message received from the server : " +message); 
      } 
      catch (Exception exception) 
      { 
       exception.printStackTrace(); 
      } 
      finally 
      { 
       //Closing the socket 
       try 
       { 
        socket.close(); 
       } 
       catch(Exception e) 
       { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

这里面听即将到来的连接

public class Server1 
{ 

    private static Socket socket; 

    public static void main(String[] args) 
    { 
     try 
     { 

      int port = 25000; 
      ServerSocket serverSocket = new ServerSocket(port); 
      System.out.println("Server Started and listening to the port 25000"); 

      //Server is running always. This is done using this while(true) loop 
      while(true) 
      { 
       //Reading the message from the client 
       socket = serverSocket.accept(); 
       InputStream is = socket.getInputStream(); 
       InputStreamReader isr = new InputStreamReader(is); 
       BufferedReader br = new BufferedReader(isr); 
       String number = br.readLine(); 
       System.out.println("Message received from client is "+number); 

       //Multiplying the number by 2 and forming the return message 
       String returnMessage; 
       try 
       { 
        int numberInIntFormat = Integer.parseInt(number); 
        int returnValue = numberInIntFormat*2; 
        returnMessage = String.valueOf(returnValue) + "\n"; 
       } 
       catch(NumberFormatException e) 
       { 
        //Input was not a number. Sending proper message back to client. 
        returnMessage = "Please send a proper number\n"; 
       } 

       //Sending the response back to the client. 
       OutputStream os = socket.getOutputStream(); 
       OutputStreamWriter osw = new OutputStreamWriter(os); 
       BufferedWriter bw = new BufferedWriter(osw); 
       bw.write(returnMessage); 
       System.out.println("Message sent to the client is "+returnMessage); 
       bw.flush(); 
      } 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
     finally 
     { 
      try 
      { 
       socket.close(); 
      } 
      catch(Exception e){} 
     } 
    } 
} 

输出TCP FSM

的服务器代码
-bash:~$ netstat -an | grep 25000 
    tcp4  0  0 127.0.0.1.25000  127.0.0.1.56459  CLOSE_WAIT 
    tcp46  0  0 *.25000    *.*     LISTEN 

回答

0

您正在关闭在错误的地方接受的套接字。它需要在接受循环中。

+0

accpet是在While循环里面,当连接最后会关闭的时候 – user2554822

+0

能不能帮我解决这个问题 – user2554822

+0

修复了一个错字,请参阅编辑。 iPad再次击中。 – EJP