我正在使用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>"))
给我一个错误!?如果我删除它,没有错误..
答案 0 :(得分:3)
直接的错误是你正在阅读两行。第二次读取似乎返回null。你可以通过应用标准的NRE调试技术找到它。
另一个错误是你假设TCP保留了bessage边界。如果DataAvailable > 0
这不意味着整行都可用。可能只有一个字节可用。您可能会发现您的游戏意外阻止。
通常,最好是连续读取循环运行,而不是为数据池。刚看完当收到新行时就行动了。