java - 服务器在一段时间后停止接受连接

时间:2012-09-05 04:37:16

标签: java sockets

我在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();

2 个答案:

答案 0 :(得分:1)

您在接受循环中阻止客户端I / O.一个从不发送任何东西的客户端可以停止整个系统。你应该在接受循环中做的就是接受连接和启动线程。唯一的阻塞操作应该是accept()本身。客户端I / O应该在一个单独的线程中完成。

答案 1 :(得分:0)

你正在泄漏套接字。异常会跳过你的收盘价。使用finally块释放资源。

while(...) {
   Socket sckt;
   try {
      sckt = ...
      ...
   } catch(Exception e) {
   } finally {
       sckt.close();
   }
}