客户端关闭连接后Java TCPSocket中断

客户端关闭连接后Java TCPSocket中断,java,tcp,Java,Tcp,我对编程非常陌生,尤其是套接字编程。我试图弄清楚通信在现实中是如何工作的,但并不是在我所有的书中都是如此,但在下载的SimpleEchoServer示例中,我立即遇到了第一个问题。Communicationflow可以工作,但当Clientsocket在不发送特定字符串的情况下关闭其连接时,我的serversocket就会崩溃。你能告诉我我做错了什么吗 这是服务器端: import java.net.*; import java.io.*; import java.net.InetAddre

我对编程非常陌生,尤其是套接字编程。我试图弄清楚通信在现实中是如何工作的,但并不是在我所有的书中都是如此,但在下载的SimpleEchoServer示例中,我立即遇到了第一个问题。Communicationflow可以工作,但当Clientsocket在不发送特定字符串的情况下关闭其连接时,我的serversocket就会崩溃。你能告诉我我做错了什么吗

这是服务器端:

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

public class EchoServer { 

public static void main(String[] args) throws IOException { 

    ServerSocket serverSocket = null;
    Integer port = new Integer(args[0]);

    try { 

        serverSocket = new ServerSocket(port); 

        } 

    catch (IOException e) { 

            System.err.println("Could not listen on port: "+port); 
            System.exit(1); 

        } 

    Socket clientSocket = null; 
    System.out.println ("Waiting for connection on port "+port+" ...");

    try { 

        clientSocket = serverSocket.accept(); 

        }

    catch (IOException e) { 

            System.err.println("Accept failed."); 
            System.exit(1);

        } 

    System.out.println ("Connection successful");
    System.out.println ("Waiting for input.....");

    PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); 
    BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream(), "UTF-8")); 

    String inputLine; 

    while ((inputLine = in.readLine()) != null) { 

        System.out.println ("received: " + inputLine); 
        out.println(inputLine); 

        if (inputLine.equals("Bye.")) 
        break; 

    } 

    out.close(); 
    in.close(); 
    clientSocket.close(); 
    serverSocket.close(); 

   } 

}
这就是客户端

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

public class EchoClient {

    public static void main(String[] args) throws IOException {

    String serverHostname = new String (args[0]);
    Integer port = new Integer(args[1]);

    if (args.length > 0)

        serverHostname = args[0];
        System.out.println ("Attemping to connect to host " + serverHostname + " on port 10007.");

        Socket echoSocket = null;
        PrintWriter out = null;
        BufferedReader in = null;

        try {

            echoSocket = new Socket(serverHostname, port);
            out = new PrintWriter(echoSocket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream(), "UTF-8"));

            } catch (UnknownHostException e) {

                System.err.println("Don't know about host: " + serverHostname);
                System.exit(1);

            } catch (IOException e) {

                System.err.println("Couldn't get I/O for " + "the connection to: " + serverHostname);
                System.exit(1);

            }

       BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
       String userInput;

     System.out.print ("input: ");

     while ((userInput = stdIn.readLine()) != null) {

           out.println(userInput);
           System.out.println("echo: " + in.readLine());
         System.out.print ("input: ");

       }

       out.close();
       in.close();
       stdIn.close();
       echoSocket.close();

    }

}

断开的不是服务器套接字

当inputLine=in.readLine!=无效的当套接字连接终止时,尝试读取将引发异常。由于循环不在try-catch块内,因此异常会终止服务器进程

为了防止这种情况,您需要处理异常

try {
    while ((inputLine = in.readLine()) != null) { 

        System.out.println ("received: " + inputLine); 
        out.println(inputLine); 

        if (inputLine.equals("Bye.")) 
            break; 

    } 
} catch (IOException ex) {
    System.out.println("Connection error... terminating.");
}

您面临的问题与这里描述的问题非常相似。谢谢,我现在就看这个。首先我想说,我还尝试了多线程echoserver ant,它在3次请求后中断。第一个被接受,第二个冻结我的服务器控制台,第三个通过客户端控制台中的套接字重置消息断开连接OK,谢谢,我收到了:DI将添加此作为答案。这不是中止。双方都在以正常方式关闭连接。”“故障”不是问题描述。告诉我们实际发生了什么。例外堆栈跟踪?那会是什么异常?这段代码中没有任何东西可以阻止循环正常终止。这一个:线程主java.net.SocketException中的异常:java.net.SocketInputStream.readUnknown Source[…]处的连接重置。我认为这只是套接字连接未正确关闭时的问题,例如,通过简单地杀死EchoClient。在客户端循环中调用Socket.close时,代码运行正常。