android怎样使用websocketclient
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android怎样使用websocketclient相关的知识,希望对你有一定的参考价值。
参考技术A我是写了一个websocketclient的子类,接收到的消息用handler发送,在UI界面解析,操作.只不过多加了一个,getClient的
方法,传一个handler,我试过了,跳转的话,也不会断,而且保证了是一个websocketclient对象.但是要注意的
是,websocketclient对象是不可重用的,也就是当连接关闭,调用close方法之后,再open,会抛出一个错误,只要close,这个对
象就没用了,一定要重新new一个,ITJOB你可以试一试.
Alchemy-Websockets - WebSocketClient 抛出 NullReferenceException
【中文标题】Alchemy-Websockets - WebSocketClient 抛出 NullReferenceException【英文标题】:Alchemy-Websockets - WebSocketClient throws a NullReferenceException 【发布时间】:2013-11-21 13:48:17 【问题描述】:我有两个 C# 程序应该通过 WebSockets 进行通信,服务器运行良好(也使用 Alchemy)并且已经有一段时间了(使用 javascript 客户端)。但是,连接 Alchemy WebSocketClient
会导致在客户端抛出 NullReferenceException
。
经过一些调试,我发现由于_context.Connection.Connected
调用,在WebSocketClient.cs
的第187行抛出了异常。 _context.Connection 与本地 _client
是相同的实例,并且在那个时间点它们都不是空的。在 msdn.microsoft.com 上的 TcpClient.Connected
页面上,没有列出可能的异常(向我表明它不应该抛出任何异常)。
再往前走,我注意到_client
类变量在WebSocketClient.cs
的第176 行从一个正常的实例更改为一个充满异常的实例:
第 176 行之前
第 176 行之后
在此行之后,刚刚在第 187 行添加的 Context
的 Dispose() 方法被称为断开 Connection
(与我之前在第 131 行提到的 _client
的实例相同) Context.cs
.
我的问题是:为什么会发生这种情况,我怎样才能阻止它发生并成功连接到所需的 WebSocketServer?
如果您需要更多信息,请随时在 cmets 中向我提问。
编辑 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:
【问题讨论】:
贴出错误发生前的代码 这一切都在 WebSocketClient.cs 和 Context.cs 文件中(这些文件的提及是上面问题中的链接)。我没有以任何方式更改这些文件。 【参考方案1】:我看到你使用 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 块中添加 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
希望这会对你有所帮助。
【讨论】:
我知道如何检查客户端是否连接/null,我需要知道的是如何阻止这种情况发生。 @dragon112 对不起,我现在不明白你的意思。我写了大约2个弱点。首先是TcpClient
是用一些“特定”代码(和我同意的反射器)编写的,我们不能用它做任何事情,我们只能使用变通方法。无论连接是否成功(为什么?),您创建 Context
的秒数,这很奇怪,但您可以修复它。
哦,我明白了。我又看了一遍代码,发现它的某些部分很弱。这个类肯定需要修复。我只能这么说。以上是关于android怎样使用websocketclient的主要内容,如果未能解决你的问题,请参考以下文章