当对象被明确定义时,空引用异常

时间:2015-08-09 15:40:39

标签: c# sockets unity3d tcp

我正在使用Unity和.NET创建TCP客户端 - 服务器关系。

我实际上已经将所有内容都放在了可以来回发送消息的地方,但是现在我遇到了一个让我摸不着头脑的NullReferenceException。

我的Unity代码中的TCPClientListener中有一个函数,每次Update()调用ReadSocket

public void SetupSocket(){
      socket = new TcpClient(host, port);
      stream = socket.GetStream();
      writer = new StreamWriter(stream);
      reader = new StreamReader(stream);
      socketReady = true;

}

public string ReadSocket(){
   if(stream.DataAvailable){
      return "New Data! " + reader.ReadLine().Replace("<EOF>", "");
   }
   return "";
}

以上工作正常,没问题。当服务器发送消息时,我收到它就好了。但后来我添加了一个非常简单的if语句,现在我在读者方面得到了NullReferenceException。

public string ReadSocket() {
        if (stream.DataAvailable) {
            if (reader.ReadLine().Contains("<EOF>"))
                return "New data! " + reader.ReadLine().Replace("<EOF>", "");
        }
        return "";
    }

我希望我一直在看这个太长时间才能看到明显的。为什么

if (reader.ReadLine().Contains("<EOF>"))

给我一​​个错误!?如果我删除它,没有错误..

1 个答案:

答案 0 :(得分:3)

直接的错误是你正在阅读两行。第二次读取似乎返回null。你可以通过应用标准的NRE调试技术找到它。

另一个错误是你假设TCP保留了bessage边界。如果DataAvailable > 0意味着整行都可用。可能只有一个字节可用。您可能会发现您的游戏意外阻止。

通常,最好是连续读取循环运行,而不是为数据池。刚看完当收到新行时就行动了。