我在WinServer 2008计算机上有一个简单的多客户端Java服务器,它工作正常,但在看似随机的时间(天)之后,服务器停止接受任何连接,我无法弄清楚原因。
它没有捕获任何异常,它不会崩溃,它只是不接受任何连接,我认为它是使用GC的serversocket所以我使它全局但无济于事。它似乎也不是TCP耗尽,因为没有任何人连接数小时,它仍然不接受任何连接,我也将setReuseAddress设置为true但它仍然做同样的事情。
让它再次运行的唯一方法是重新启动java服务器应用程序(不需要重新启动计算机)并且它再次正常工作......一段时间。
这是我的代码与情况相关:
try
{
ServerSocket srvr = new ServerSocket(PORT);
while (isAlive)
{
Socket skt = srvr.accept();
this.bw = new PrintWriter(skt.getOutputStream(), true);
this.br = new BufferedReader(new InputStreamReader(skt.getInputStream()));
String msg = br.readLine();
//process msg
skt.close();
}
}
catch (Exception e)
{
System.out.println("Error");
}
编辑:更改了代码
while (isAlive)
{
Socket skt = srvr.accept();
skt.setSoTimeout(10000);
acceptConnection(skt);
}
public void acceptConnection(final Socket skt) throws Exception
{
Thread discConn = new Thread()
{
public void run()
{
try
{
PrintWriter bw = new PrintWriter(skt.getOutputStream(), true);
BufferedReader br = new BufferedReader(new InputStreamReader(skt.getInputStream()));
String msg = br.readLine();
//process msg
}
catch (SocketTimeoutException ste)
{
//
}
catch (SocketException se)
{
//
}
catch (Exception e)
{
System.out.println("ERROR");
}
finally
{
try
{
skt.close();
}
catch (IOException e)
{
System.out.println("ERROR");
}
}
}
};
discConn.start();
答案 0 :(得分:1)
您在接受循环中阻止客户端I / O.一个从不发送任何东西的客户端可以停止整个系统。你应该在接受循环中做的就是接受连接和启动线程。唯一的阻塞操作应该是accept()本身。客户端I / O应该在一个单独的线程中完成。
答案 1 :(得分:0)
你正在泄漏套接字。异常会跳过你的收盘价。使用finally块释放资源。
while(...) {
Socket sckt;
try {
sckt = ...
...
} catch(Exception e) {
} finally {
sckt.close();
}
}