gpt4 book ai didi

c# - Alchemy-Websockets - WebSocketClient 抛出 NullReferenceException

转载 作者:太空狗 更新时间:2023-10-29 21:54:18 25 4
gpt4 key购买 nike

我有两个 C# 程序应该通过 WebSockets 进行通信,服务器工作正常(也使用 Alchemy)并且已经有一段时间了(使用 javascript 客户端)。然而连接炼金术WebSocketClient结果 NullReferenceException被抛到客户端。

调试后我发现异常是在 WebSocketClient.cs 的第187行抛出的。因为 _context.Connection.Connected称呼。 _context.Connection 与本地 _client 是同一个实例并且在那个时间点这些都不是空的。关于TcpClient.Connected msdn.microsoft.com 上的页面没有列出任何可能的异常(向我表明它不应引发任何异常)。

再往前看,我注意到 _client WebSocketClient.cs 的第 176 行更改了类变量从一个看起来正常的实例到一个充满异常的实例:

在第 176 行之前 Before line 176

在第 176 行之后 After line 176

在这一行之后是 Context 的 Dispose() 方法刚刚在第 187 行添加的被称为断开 Connection (这与我之前在 _client 的第 131 行提到的 Context.cs 是同一个实例。

我的问题是:为什么会发生这种情况以及如何阻止它发生并成功连接到所需的 WebSocketServer?

如果您需要更多信息,请随时在评论中询问我。

编辑 1

异常仅在服务器实际监听时发生,如果服务器处于非事件状态 WebSocketClient.cs 的第 176 行未达到(这是正确的行为,因为在与服务器建立连接时会调用 OnRunClient())。

编辑 2

根据 StackTrace 的要求:

System.NullReferenceException was unhandled
HResult=-2147467261
Message=Object reference not set to an instance of an object.
Source=System
StackTrace:
at System.Net.Sockets.TcpClient.get_Connected()
at Alchemy.WebSocketClient.SetupContext(Context context) in C:\...\Alchemy\WebSocketClient.cs:regel 187
at Alchemy.WebSocketClient.HandleClientThread() in C:\...\Alchemy\WebSocketClient.cs:regel 94
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:

最佳答案

正如我所见,您使用的是 TcpClient。这个类使用 Socket 类进行数据传输(TcpClient 有这样的字段)。据我所知,在某些情况下,该字段可以为空。TcpClient 的 Connected 属性使用内部 Socket 实例的 Connected 属性。像这样:

public bool Connected 
{
get
{
return _socket.Connected; // Possible NullRef here!!!
}
}

所以当这个字段为空时你会得到 NullReferenceException。据我所知,当连接未成功建立时,可能会发生这种情况。

例如我在你的代码中看到了这个:

try
{
_client.EndConnect(result);
}
catch (Exception ex)
{
Disconnect();
connectError = true;
}

using (_context = new Context(null, _client))
{
_context = new Context(null, _client);
_context.BufferSize = 512;
// some code
}

如果连接出错,您将得到一个异常并执行一些操作,但在这种情况下,您的 _client 将没有初始化 Socket 字段。在 Context 构造函数中,您将尝试使用它字段(在 Connected 属性中),您将得到 NullReferenceException。

我猜你需要在 catch block 中添加 return。

像这样检查 TcpClient ( http://msdn.microsoft.com/ru-ru/library/system.net.sockets.tcpclient.client(v=vs.110).aspx) 的底层属性 Client:

if (_client.Client != null && _client.Connected)
{
// do what you need
}

希望对您有所帮助。

关于c# - Alchemy-Websockets - WebSocketClient 抛出 NullReferenceException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20122718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com