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的主要内容,如果未能解决你的问题,请参考以下文章

android怎样调用webService

Android 5.0 怎样正确启用isLoggable__原理分析

怎样下载原生android系统

Android studio 怎样使用隐藏API

在Android开发中怎样使用Application类

怎样高速启动Android模拟器(Android Emulator)