c# - 明确定义对象时的空引用异常

标签 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>"))

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

最佳答案

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

另一个错误是您假设 TCP 保留消息边界。如果 DataAvailable > 0 表示整行可用。可能只有一个字节可用。您可能会发现您的游戏意外阻塞。

通常,最好有一个连续的读取循环运行并且永远不要为数据池。刚读。当收到新行时,对其进行操作。

关于c# - 明确定义对象时的空引用异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31905944/

相关文章:

c# - UserControl 的本地化属性

c# - 如何从相对路径在 C# 中运行 PowerShell 脚本?

c# - 响应式扩展从 IObservable 转换为 IEnumerable

android - 使用 Android Studio 和 Socket 创建用户登录页面

2d - Unity3D:我的 2D 游戏中瓷砖之间奇怪的 1 像素白线

ios - Firebase Unity iOS通知未在应用程序图标上显示角标(Badge)计数器

c# - xml文件拆分算法

sockets - Erlang:连接到服务器,并在同一个套接字上接收输入

在客户端和服务器中注意到 java.net.SocketException

c# - Unity3D防止与鼠标事件发生冲突