从TCP服务器侦听传入消息会导致StackOverflow

时间:2015-01-04 22:41:12

标签: java tcp bufferedreader stack-overflow message-loop

我需要不断收听来自我的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()是非阻塞的,但我该怎么办呢?

1 个答案:

答案 0 :(得分:3)

请勿在{{1​​}}内致电run()。这不是递归函数。如果你想在某种情况下继续阅读,请将其包裹在while循环中。通过在执行时调用正在执行的方法,您将创建另一个堆栈帧。你真正想要的只是循环。

run()

为了帮助说明,它有点像......

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);
      }
   }
}