我正在使用 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>"))
给我一个错误!?如果我删除它,没有错误..
最佳答案
直接的错误是您正在阅读两行。第二次读取似乎返回 null。您可以通过应用标准 NRE 调试技术找到这一点。
另一个错误是您假设 TCP 保留消息边界。如果 DataAvailable > 0
这不 表示整行可用。可能只有一个字节可用。您可能会发现您的游戏意外阻塞。
通常,最好有一个连续的读取循环运行并且永远不要为数据池。刚读。当收到新行时,对其进行操作。
关于c# - 明确定义对象时的空引用异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31905944/