Java 套接字终止后维护服务器
所以我有一个简单的服务器。我想做的是,当我终止客户机套接字(telnet->end进程)时,让服务器运行并等待另一个客户机 Atm it抛出bindException,如何处理它。在finally块之前添加catch语句(但不要在那里调用Java 套接字终止后维护服务器,java,Java,所以我有一个简单的服务器。我想做的是,当我终止客户机套接字(telnet->end进程)时,让服务器运行并等待另一个客户机 Atm it抛出bindException,如何处理它。在finally块之前添加catch语句(但不要在那里调用recreateSocket()) 更新以澄清,如下所示: while(true) { //do stuff } } catch (SocketException e) { e.printStackTrace(); } c
recreateSocket()
)
更新以澄清,如下所示:
while(true) {
//do stuff
}
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
sock.close();
启动一个新线程来处理每个已接受的连接。原因是您正在再次创建服务器套接字。您不需要这样做(前一个仍在工作,这就是为什么会出现绑定异常)。这就是您想要做的:
private ServerSocket serv;
public Server(int port) throws IOException
{
try {
serv = new ServerSocket(port);
serv.setReuseAddress(true);
while(true) {
Socket sock = serv.accept();
try {
BufferedReader netIn = new BufferedReader(new InputStreamReader(sock.getInputStream()));
PrintWriter netOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())), true);
// do stuff
} catch(SocketException e) {
e.printStackTrace();
} finally {
sock.close();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
当我在终止套接字后尝试连接时,我得到:无法打开到主机的连接,在端口8888上:连接失败更新答案以澄清。如果客户端强制终止连接(如关闭连接),它将在服务器中生成异常,而您不是在内部循环中捕获它,而是在外部捕获它,从而杀死
ServerSocket
。所以,这就是为什么我建议在内部循环中添加一些catch语句。
private ServerSocket serv;
public Server(int port) throws IOException
{
try {
serv = new ServerSocket(port);
serv.setReuseAddress(true);
while(true) {
Socket sock = serv.accept();
try {
BufferedReader netIn = new BufferedReader(new InputStreamReader(sock.getInputStream()));
PrintWriter netOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())), true);
// do stuff
} catch(SocketException e) {
e.printStackTrace();
} finally {
sock.close();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}