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

标签 java sockets

我在 WinServer 2008 机器上有一个简单的多客户端 java 服务器,它工作正常,但在看似随机的时间(天)之后,服务器停止接受任何连接,我不明白为什么。

它没有捕获任何异常,它不会崩溃,它只是不接受任何连接,我认为这是服务器套接字被GC,所以我将其设置为全局但无济于事。它似乎也不是 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();

最佳答案

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

关于java - 服务器在一段时间后停止接受连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12274551/

相关文章:

sockets - 原始套接字问题: Are TCP packets passed to a raw socket?

sockets - 今天使用套接字编程开发了哪些类型的应用程序?

python - python 中的 TLS echo 服务器和 echoclient 崩溃

java - 如何从另一个泛型类参数转换泛型参数?

java - Discord 机器人异常重复

java - 将我的 Eclipse 项目正确导出为可运行的 Jar

java - Openshift 上带有 Strimzi 运算符的 Apache Kafka - 无法连接

java - hdfs dfs -ls 的默认值

c - C 语言的套接字编程 - Web 服务器

c - 需要帮助在 C 中获取 TCP 端口号和 IP 地址