java - 监听来自 TCP 服务器的传入消息会导致 StackOverflow

标签 java tcp bufferedreader stack-overflow message-loop

我需要持续监听来 self 的 C# TCP 服务器的消息,所以我在单独的线程中执行:

private void StartMessageReceivingLoop()
{       
    new Thread(){
        public void run()
        {
            String msg = null;

            try
            {
                msg = inputStream.readLine(); // inputStream is a BufferedReader instance.
            } 
            catch (IOException e)
            {
                e.printStackTrace();
            }

            if (msg != null && msg != "")
                NotifyAndForwardMessage(msg); // Notify listeners about the message.

            run(); // Next iteration.
        }
    }.start();
}

我的方法有什么问题?为什么我会收到 StackOverflowError?我猜测 run() 的调用速度非常快,因为 BufferedReader.readLine() 是非阻塞的,但我能做些什么呢?

最佳答案

不要在 run() 中调用 run()。这不是递归函数。如果您想一直阅读直到出现某种情况,请将其包装在一个 while 循环中。通过在执行时调用正在执行的方法,您正在创建另一个堆栈框架。您真正想要的只是循环。

public void run() {
   String msg = null;
   while(true) {  // Or whatever your exit condition is...
      try {
         msg = inputStream.readLine();
      } catch(IOException e) {
         // Handle properly.
      }
      if (msg != null && msg != "") {
          NotifyAndForwardMessage(msg);
      }
   }
}

为了帮助说明,它的工作原理是这样的......

Thread.start()
   + run() // 1 (called by thread)
      + run() // 2 (called by previous run)
         + run() //3 (called by previous run)
            +etc... where you'll eventually run out of stack space.

关于java - 监听来自 TCP 服务器的传入消息会导致 StackOverflow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27771179/

相关文章:

c# - 写入套接字 : Unable to write data to transport connection 时出现异常

c++ - tcp 套接字,无法绑定(bind)到端口 - 正在使用

Java从文本(txt)文件中读取字符串

Java - BufferedReader 不从 url 读取

java - Gradle Android "Duplicate class foo found in module bar"错误

java - 在 Java 中列出文件而不使用 java.io

java - java中的“隐式”同步?

tcp - 为什么 TCP 数据包不包含源 IP 和目标 IP?

java - 如何通过java过滤文本文件并将结果保存到新文件

java - 关于 Java 文件加密性能的建议