- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有两个 C# 程序应该通过 WebSockets 进行通信,服务器工作正常(也使用 Alchemy)并且已经有一段时间了(使用 javascript 客户端)。然而连接炼金术WebSocketClient
结果 NullReferenceException
被抛到客户端。
调试后我发现异常是在 WebSocketClient.cs
的第187行抛出的。因为 _context.Connection.Connected
称呼。 _context.Connection 与本地 _client
是同一个实例并且在那个时间点这些都不是空的。关于TcpClient.Connected
msdn.microsoft.com 上的页面没有列出任何可能的异常(向我表明它不应引发任何异常)。
再往前看,我注意到 _client
WebSocketClient.cs
的第 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/
当我单步执行以下代码时,第二行的 report 为空。但是,第三行生成 NullReferenceException。 member this.setTaggedResearchReportList
我正在尝试按照建议从 URL 获取查询字符串 here ,但我收到 NullReferenceException。我的代码与链接帖子中的代码之间的唯一区别是我的代码是静态的,我看不出这会如何导致错误。
我有以下程序,这是一段示例代码,展示了 C# 反射如何对类进行操作。一切正常,完全没有问题。 public class Program { public static void Main() {
我在以下代码中使用 F# 类型和数据结构(我在 Mac 上使用 Monodevelop,这仅发生在 Interactive 中): type UnbalancedSet = | E |
我有一个 asp.net/C# 类可以调整图像的大小以作为文件缓存在服务器上,但是确定使用哪个编码器的代码部分似乎偶尔会抛出 NullReferenceException。 下面是初始化和传回编码器的
我已经向几位同事展示了这一点,但没有人给出解释。我纯粹偶然遇到了这个问题,因为我以为我在代码中发现了一个错误,但惊讶地发现代码实际上运行了。这是一个简化版本。这已通过 XE-2 完成。 到目前为止,与
这把我难住了。我试图优化 Noda Time 的一些测试,其中我们进行了一些类型初始值设定项检查。我想在将所有内容加载到新的 AppDomain 之前,我想找出类型是否有类型初始值设定项(静态构造函数
当我的页面加载时,我从 SQLite 数据库加载一个列表,有时在加载时我会得到 NullReferenceException ,并显示错误:对象引用未设置为对象的实例。 它在 SQLite 类文件中破
这个问题已经有答案了: What is a NullReferenceException, and how do I fix it? (26 个回答) 已关闭 4 年前。 我收到以下异常: Unhan
当我的页面加载时,我从 SQLite 数据库加载一个列表,有时当它加载时我得到 NullReferenceException 错误说 Object reference not set to an对象的
我有以下代码: try { using (var stream = new MemoryStream()) { var ms = stream; if (con
这个问题已经有答案了: What is a NullReferenceException, and how do I fix it? (26 个回答) 已关闭 4 年前。 我收到以下异常: Unhan
我有以下代码。 XElement opCoOptOff = doc.Descendants(ns + "OpCoOptOff").FirstOrDefault(); String opCo = o
这个问题在这里已经有了答案: What is a NullReferenceException, and how do I fix it? (27 个答案) 关闭 4 年前。 我有队列代码但抛出 N
所以我正在制作一个应用程序,一切都运行良好,直到发生以下情况: 我已经通过调试器进行了检查,但无法找到导致此异常的确切原因。我感觉根本原因在 SQL 方面,因为这是我最近更改的唯一部分,但我需要确切地
class Puzzle { private int PUZZLESIZE = 3; private int col, row; priva
我有一项学校作业,我快完成了,只剩下一件事了。每次启动程序时,我都会收到 NullReferenceException。除了抛出异常的 ListView 外,一切都按预期工作。 这是来自主窗体: pr
我向 Form1 组件添加了一个面板。该面板名为 panel1。 浏览通用列表时,我想动态添加标签。看看我的小代码: if (list.Count > 0) { foreach (TLClas
这是我的场景:我有一个控制台应用程序,我正在尝试使用以下代码处理控制台的“关闭事件”: static void Main(string[] args) { SetConsoleCtrlHand
这可能已经有人问过了。我搜索了 SO 并发现了一些关于 Null VS String.Empty 的问题,但我很好奇为什么以下语句不会抛出 NullReferenceException: String
我是一名优秀的程序员,十分优秀!