我有两个C#程序应该通过WebSockets进行通信,服务器工作正常(也使用Alchemy)并且已经有一段时间了(使用javascript客户端).但是,连接Alchemy会WebSocketClient导致NullReferenceException客户端被抛出.
经过一些调试后,我发现WebSocketClient.cs因为_context.Connection.Connected调用而在第187行抛出异常._context.Connection是与本地相同的实例,_client并且在那个时间点都不为null.在TcpClient.Connectedmsdn.microsoft.com 上的页面上没有列出可能的异常(指示我不应该抛出任何异常).
回过头来,我注意到_client类变量在第176行WebSocketClient.cs从正常查看实例更改为填充异常的实例:
在这一行之后Context,刚刚在第187行添加的Dispose()方法被称为断开连接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:
Run Code Online (Sandbox Code Playgroud)
据我所知,您使用 TcpClient。该类使用Socket类进行数据传输(TcpClient有这样的字段)。据我所知,在某些情况下该字段可以为空。TcpClient 的 Connected 属性使用内部 Socket 实例的 Connected 属性。像这样的东西:
public bool Connected
{
get
{
return _socket.Connected; // Possible NullRef here!!!
}
}
Run Code Online (Sandbox Code Playgroud)
因此,当该字段为 null 时,您将得到 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
}
Run Code Online (Sandbox Code Playgroud)
如果连接出错,您将收到异常并执行一些操作,但在这种情况下,您的 _client 将尚未初始化内部的 Socket 字段。在 Context 构造函数中,您将尝试使用它的字段(在 Connected 属性中),您将得到 NullReferenceException。
我想你需要在 catch 块中添加 return 。
或者
检查 TcpClient 的基础属性 Client ( http://msdn.microsoft.com/ru-ru/library/system.net.sockets.tcpclient.client(v=vs.110).aspx ),如下所示:
if (_client.Client != null && _client.Connected)
{
// do what you need
}
Run Code Online (Sandbox Code Playgroud)
希望对你有帮助。
| 归档时间: |
|
| 查看次数: |
1828 次 |
| 最近记录: |