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