我已经实现了一个带有服务器和单个客户端的套接字。它当前的结构方式,只要客户端关闭,服务器就会关闭。我的意图是让服务器运行直到手动关闭。
这是服务器:
public static void main(String args []) { ;
try
{
ServerSocket socket= new ServerSocket(17);
System.out.println("connect...");
Socket s = socket.accept();
System.out.println("Client Connected.");
while (true)
{
work with server
}
}
catch (IOException e)
{
e.getStackTrace();
}
}
我已尝试用另一个while(true)
循环包围整个try / catch循环,但它什么都不做,同样的问题仍然存在。关于如何让服务器保持运行的任何想法?
答案 0 :(得分:6)
看起来你的代码会发生什么,你连接到客户端,无限循环与客户端的交互,然后当有人破坏连接(关闭清除,或中断它 - 例如,拔掉网络你会得到一个IOException
,然后发送到运行的catch子句,然后继续运行(我猜“在那之后”是你的main()的结束?)。 ..
所以你需要做的是,从那时起,循环回到accept()调用,这样你就可以接受另一个新的客户端连接。例如,这里有一些伪代码:
create server socket
while (1) {
try {
accept client connection
set up your I/O streams
while (1) {
interact with client until connection closes
}
} catch (...) {
handle errors
}
} // loop back to the accept call here
另外,请注意这种情况下try-catch块的位置,以便在接受循环中捕获和处理错误。这样,单个客户端连接上的错误会将您发送回accept()而不是终止服务器。
答案 1 :(得分:0)
将单个服务器套接字保留在循环之外 - 循环需要在accept()之前启动。只需将ServerSocket创建放入单独的try / catch块即可。否则,您将打开一个尝试在同一端口上侦听的新套接字,但只关闭了一个连接,而不是serverSocket。服务器套接字可以接受多个客户端连接。
当这种方法有效时,您可能希望在accept()上启动一个新的Thread来支持多个客户端。最简单的方法是添加一个实现Runnable接口的“ClinentHandler”类。在客户端中,您可能也希望将套接字的读取放入单独的线程中。
这是家庭作业/某种作业吗?