遇到android 消息回调不回调,connect 不回调怎么办

2010年11月
日一二三四五六311234567810111213141516171819202122232426272829301234567891011
留言簿(54)
mplayer安装
U-Boot官方DULG
Useful Site
关于Android
关于Android
关于Android
嵌入式Linux移植
阅读排行榜
评论排行榜php的swoole扩展中onclose和onconnect回调不被调用的问题
时间: 23:54:29
&&&& 阅读:80
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&  在用swoole扩展写在线聊天例子的时候遇到一个问题,查了不少资料,现在记录于此。
  通过看swoole_server的接口文档,回调注册接口on中倒是有明确的注释:
* swoole_server-&on & swoole_http_server-&on are the same except swoole_http_server :
* - not accepting onConnect/onReceive callback accept events onRequest
swoole_http_server和swoole_server大体是相同的,但是swoole_http_server中是不调用connect和receive接口的,相对应调用request接口。
  在聊天的小例子中用的是swoole_websocket_server,通过测试在swoole_websocket_server中receive接口也是没有被调用的,但是作为长连接服务,worker中
close和connect中的回调还是有必要的。比如上线广播通知,下线广播通知,都是需要回调这两个对应的接口才能很好的实现。所以官方肯定是支持回调的。
  最后找到问题是通过一份swoole版本更新公告。
  swoole-1.7.16 版本已发布,BUG 修复版本:
增加swoole_server-&tick和swoole_timer_tick函数
增加http服务器对gzip压缩的支持
增加swoole_table-&incr/decr原子自增/自减方法
增加open_eof_split配置,使用EOF检测可以支持自动分包
增加server统计项request_count和worker_request_count
增加server的连接迭代器,可以使用foreach遍历服务器的所有连接
增加http服务器请求的query_string
增加http服务器multipart-form和上传文件的支持
修复onReceive数据合并失效的BUG
修复swoole_server-&addtimer与tick定时器冲突的BUG
修复低版本Linux下Accept未设置阻塞的问题
修复Accept失败返回Too Many Connection重复打印日志的问题
修复task_max_request参数失效的问题
修复swoole_client的waitall参数失效问题
修复swoole_table发生死循环的BUG
WebSocket服务器onOpen回调函数第2个参数由$fd调整为$request对象
Http服务器允许发送空body的response
禁用swoole_websocket_server-&send方法
BASE模式支持向任意FD发送数据
设置dispatch_mode = 1, 3 后关闭onClose/onConnect事件回调
允许Worker进程内设置非系统保留信号
移除swoole底层对对象资源属性的依赖,直接读取指针,提升性能
解决心跳线程无法强制杀掉遗留连接的问题
优化dispatch_mode=3模式,提升任务分配的效率
& & &是worker分配模式的问题。在抢占模式和轮询模式,这两个回调接口不在被调用。固定模式,每个客户端的数据包都会由固定的worker进程处理,这样就可以在worker进程中存放一些属于这个客户端的私有信息,缓存一部分读写频繁的数据,就和erlang中的进程词典类似的操作。这样客户端在下线时,要做一些清理操作。上线初始化操作。所以这个模式是很有意义,也是很有必要的。固定模式适合处理每个客户端逻辑相对均匀的情况。
&标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&原文:/tdkj/p/5149827.html
教程昨日排行
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!iOS小记--didConnectPeripheral不调用 - 简书
iOS小记--didConnectPeripheral不调用
在的时候,会在回调方法中获取被发现的周边设备,紧接着,可能就会像文档说的那样,去连接设备。并且实现了didConnectPeripheral方法,期待输出已连接的状态。
-(void)centralManager:(CBCentralManager*)central didDiscoverPeripheral:(CBPeripheral*)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI {[myCentralManager connectPeripheral:peripheral options:nil];}
但是这里恐怕要失望了,因为一些需求,自己又几乎从头写了中心角色的实现,但是在这一步被坑到了,诚如标题,didConnectPeripheral方法不被调用。天哪,这是超出认知范围的(至少当时是这样认为的,这根本不可能嘛,项目里都使用了这么久了,怎么会连不上)。然后去stack overflow搜了搜,出乎我的意料,CBPeripheral对象居然会被释放掉,在这里对它用的是个weak?虽然我不太相信,但还是赶紧试了试答案了说的方法,写了个全局的属性对CBPeripheral强引用。果然,接下来一切OK,后面的内容写起来畅通无阻。心里还是有点疑惑,就去找,然后找到这样一句话:
You must retain a local copy of the peripheral if any command is to be performed on it.
没有看到其它的解释,结合上面的那个案例,结论很明显了。至于为什么,我还是不清楚,如果谁理解透彻了,欢迎分享。
敢梦想 有担当mqtt-client回调方法简介 - CSDN博客
mqtt-client回调方法简介
使用Fusesource mqtt-client作为mqtt客户包使用,其总共提供了三种API:
1.Blocking API(阻塞式API)
2.Future based API
3.Callback/Continuation(阻塞式API)
其中第三种Callback阻塞式是前两种的基础,可以通过前两种的源码中证明:
public FutureConnection(CallbackConnection next){
receiveFutures = new LinkedList();
receivedFrames = new LinkedList();
this.next =
this.next.listener(new Listener() {
public void onConnected()
connected =
public void onDisconnected()
connected =
public void onPublish(UTF8Buffer topic, Buffer payload, Runnable onComplete)
getDispatchQueue().assertExecuting();
Message msg = new Message(getDispatchQueue(), topic, payload, onComplete);
if(receiveFutures.isEmpty())
receivedFrames.add(msg);
((Promise)receiveFutures.removeFirst()).onSuccess(msg);
public void onFailure(Throwable value)
getDispatchQueue().assertExecuting();
ArrayList tmp = new ArrayList(receiveFutures);
receiveFutures.clear();
for(Iterator i$ = tmp.iterator(); i$.hasNext(); future.onFailure(value))
future = (Promise)i$.next();
connected =
final FutureConnection this$0;
this$0 = FutureConnection.
}毫无疑问Callback方式是最复杂的一种,但是其也是能够提供更好的服务,因此有必要好好研究,下面就是对使用回调方式的简单介绍:
一、在使用回调方式前,先通过MQTT获取回调连接:
MQTT mqtt=new MQTT();
//此处省略设置MQTT的属性
CallbackConnection connection=mqtt.callbackConnection();
二、调用CallbackConnection的方法实现业务逻辑:
1、connect(连接方法):
connection.connect(new Callback&Void&() {
public void onSuccess(Void arg0) {
//进入该方法表示连接成功连接成功
public void onFailure(Throwable value) {
//进入该方法表示连接失败
});一般可以在connect的onSuccess方法中发布或者订阅相应的主题,在其onFailure方法中作相应的断开连接等操作
2、listener(监听方法):
connection.listener(new Listener() {
public void onPublish(UTF8Buffer topicmsg, Buffer msg, Runnable ack) {
//utf-8 is used for dealing with the garbled
//String topic = topicmsg.utf8().toString();
//String payload = msg.utf8().toString();
//表示监听成功
ack.run();
public void onFailure(Throwable value) {
//表示监听失败
//execute only once when connection is ended
public void onDisconnected() {
/表示监听到断开连接
//execute only once when connecting started
public void onConnected() {
//表示监听到连接成功
});onPublish表示成功,可以获取到订阅的主题和订阅的内容(UTF8Buffer topicmsg表示订阅的主题, Buffer msg表示订阅的类容),一般的可以在这个方法中获取到订阅的主题和内容然后进行相应的判断和其他业务逻辑操作;
onFailure表示监听失败,这里可以调用相应的断开连接等方法;
onConnected表示监听到连接建立,该方法只在建立连接成功时执行一次,表示连接成功建立,如果有必要可以在该方法中进行相应的订阅操作;
onDisconnected表示监听到连接断开,该方法只在断开连接时执行一次,如有必要可以进行相应的资源回收操作。
3、subscribe(订阅方法):
connection.subscribe(topics, new Callback&byte[]&() {
public void onSuccess(byte[] qoses) {
//主题订阅成功
public void onFailure(Throwable value) {
//状态主题订阅失败
});onSuccess方法表示订阅成功,onFailure方法表示订阅失败;方法中Topic[] topics表示定于的主题数组,注意只有在改方法订阅的主题,才能够在监听方法中接收到。
4、publish(发布主题方法):
connection.publish(topic, payload.getBytes(), qos, retain, new Callback&Void&() {
public void onSuccess(Void arg0) {
//表示发布主题成功
public void onFailure(Throwable throwable) {
//表示发布主题失败
});publish方法用于发布响应的主题,以便订阅者订阅;onSuccess表示发布成功,onFailure表示发布失败。
5、disconnect(断开连接方法):
connection.disconnect(new Callback&Void&() {
public void onSuccess(Void arg0) {
//与服务器断开连接成功
public void onFailure(Throwable arg0) {
//与服务器断开连接失败
});disconnect表示断开与代理服务器的连接,调用该方法后只是表示断开连接但是实际的connect依然存在并没有为null,再次调用connect方法又能够连接成功。
1、在上面的五个方法中一般先调用connect和listener方法
2、回调将执行与连接相关联的调度队列,以便可以安全使用从回调的连接,但你绝不能在回调中执行任何阻塞操作,否则会改变执行的顺序,这样可能出错。如果可能存在阻塞时,最好是在连接的调度队列中执行另外一个线程:
connection.getDispatchQueue().execute(new Runnable() {
public void run() {
//在这里进行相应的订阅、发布、停止连接等等操作
本文已收录于以下专栏:
相关文章推荐
当QoS level 1的时候 发布消息时,Server会回调通知客户端。fusesource 有实现带callback的发布方式。
所有QoS level 1都要在可变头部中附加一个16位的消息ID...
1. java回调机制
回调方法的理解:
  消防员给出一个电话号码119(这是每个人都知道的,119就相当于Java中的一个接口),并在每一个地方都设置一个发生火灾时的检测装置,如果危急...
前一篇博客(MQTT协议实现Eclipse Paho学习总结一)写了一些MQTT协议相关的一些概述和其实现Eclipse Paho的报文类别,同时对心跳包进行了分析。这篇文章,在不涉及MQ...
上一节我们讲解了mosquitto的安装和使用,下面我们使用手机测试一下。将AndroidPushNotificationsDemo中mosquitto的服务器IP和port修改为对应的地址,再讲ap...
在moquette-mqtt中提供了回调callback模式的发布和订阅但是在订阅之后没有发现有消息接收的方法,参看moquette-mqtt中Block,Future式的发布订阅基础是callbac...
参阅官方文档:
http://publib./infocenter/wmqv7/v7r0/index.jsp?topic=/com.ibm.mq.amqtat.do...
1. connect
在libemqtt代码中,客户端的connect代码是调用的mqtt_connect函数,代码如下:int mqtt_connect(mqtt_broker_handle_t* ...
MQTT是IBM开发的一个即时通讯协议。MQTT是面向M2M和物联网的连接协议,采用轻量级发布和订阅消息传输机制。Mosquitto是一款实现了 MQTT v3.1 协议的开源消息代理软件,提供轻量级...
LwIP raw tcp编程调试记录以及MQTT移植,文章内容为工程调试记录,内容排版散乱,阅读慎入!
RPC-client异步回调原理
见下面的设计图:
所谓异步回调,在得到结果之前,不会处于阻塞状态,理论上任何时间都没有任何线程处于阻塞状态,因此异步回调的模型,理论上只需要很少的...
他的最新文章
讲师:宋宝华
讲师:何宇健
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)深入理解Socket的事件通知(转贴) - CSDN博客
深入理解Socket的事件通知(转贴)
[本文摘自网络. ]
Socket有同步阻塞方式和异步非阻塞方式两种使用,事实上同步和异步在我们编程的生涯中可能遇到了很多,而Socket也没什么特别。虽然同步好用,不费劲,但不能满足一些应用场合,其效率也很低。&&& 也许初涉编程的人不能理解&同步(或阻塞)&和&异步(或非阻塞)&,其实简单两句话就能讲清楚,同步和异步往往都是针对一个函数来说的,&同步&就是函数直到其要执行的功能全部完成时才返回,而&异步&则是,函数仅仅做一些简单的工作,然后马上返回,而它所要实现的功能留给别的线程或者函数去完成。例如,SendMessage就是&同步&函数,它不但发送消息到消息队列,还需要等待消息被执行完才返回;相反PostMessage就是个异步函数,它只管发送一个消息,而不管这个消息是否被处理,就马上返回。
一、Socket API&&& 首先应该知道,有Socket1.1提供的原始API函数,和Socket2.0提供的一组扩展函数,两套函数。这两套函数有重复,但是2.0提供的函数功能更强大,函数数量也更多。这两套函数可以灵活混用,分别包含在头文件Winsock.h,Winsock2.h,分别需要引入库wsock32.lib、Ws2_32.lib。
1、默认用作同步阻塞方式,那就是当你从不调用WSAIoctl()和ioctlsocket()来改变Socket IO模式,也从不调用WSAAsyncSelect()和WSAEventSelect()来选择需要处理的Socket事件。正是由于函数accept(),WSAAccept(),connect(),WSAConnect(),send(),WSASend(),recv(),WSARecv()等函数被用作阻塞方式,所以可能你需要放在专门的线程里,这样以不影响主程序的运行和主窗口的刷新。2、如果作为异步用,那么程序主要就是要处理事件。它有两种处理事件的办法:&&& 第一种,它常关联一个窗口,也就是异步Socket的事件将作为消息发往该窗口,这是由WinSock扩展规范里的一个函数WSAAsyncSelect()来实现和窗口关联。最终你只需要处理窗口消息,来收发数据。&&第二种,用到了扩展规范里另一个关于事件的函数WSAEventSelect(),它是用事件对象的方式来处理Socket事件,也就是,你必须首先用WSACreateEvent()来创建一个事件对象,然后调用WSAEventSelect()来使得Socket的事件和这个事件对象关联。最终你将要在一个线程里用WSAWaitForMultipleEvents()来等待这个事件对象被触发。这个过程也稍显复杂。二、CAsyncSocket&&& 看类名就知道,它是一个异步非阻塞Socket封装类,CAsyncSocket::Create()有一个参数指明了你想要处理哪些Socket事件,你关心的事件被指定以后,这个Socket默认就被用作了异步方式。那么CAsyncSocket内部到底是如何将事件交给你的呢?&&& CAsyncSocket的Create()函数,除了创建了一个SOCKET以外,还创建了个CSocketWnd窗口对象,并使用WSAAsyncSelect()将这个SOCKET与该窗口对象关联,以让该窗口对象处理来自Socket的事件(消息),然而CSocketWnd收到Socket事件之后,只是简单地回调CAsyncSocket::OnReceive(),CAsyncSocket::OnSend(),CAsyncSocket::OnAccept(),CAsyncSocket::OnConnect()等虚函数。所以CAsyncSocket的派生类,只需要在这些虚函数里添加发送和接收的代码。&&&&简化后,大致的代码为:&&bool CAsyncSocket::Create( long lEvent ) 参/数lEvent是指定你所关心的Socket事件&&{&&&m_hSocket = socket( PF_INET, SOCK_STREAM, 0 ); 创建Socket本身
&&&CSocketWnd* pSockWnd = new CSocketW 创建响应事件的窗口,实际的这个窗口在AfxSockInit()调用时就被创建了。&&&pSockWnd-&Create(...);
&&&WSAAsyncSelect( m_hSocket, pSockWnd-&m_hWnd, WM_SOCKET_NOTIFY, lEvent ); Socket事件和窗口关联&&}&&&&static void PASCAL CAsyncSocket::DoCallBack(WPARAM wParam, LPARAM lParam)&&{&&&CAsyncSocket S&&&Socket.Attach( (SOCKET)wParam ); wParam就是触发这个事件的Socket的句柄&&&int nErrorCode = WSAGETSELECTERROR(lParam); lParam是错误码与事件码的合成&&&switch (WSAGETSELECTEVENT(lParam))&&&{&&&case FD_READ:&&&&pSocket-&OnReceive(nErrorCode);&&&&&&&case FD_WRITE:&&&&pSocket-&OnSend(nErrorCode);&&&&&&&case FD_OOB:&&&&pSocket-&OnOutOfBandData(nErrorCode);&&&&&&&case FD_ACCEPT:&&&&pSocket-&OnAccept(nErrorCode);&&&&&&&case FD_CONNECT:&&&&pSocket-&OnConnect(nErrorCode);&&&&&&&case FD_CLOSE:&&&&pSocket-&OnClose(nErrorCode);&&&&&&&}&&}
&&CSocketWnd类大致为:
&&BEGIN_MESSAGE_MAP(CSocketWnd, CWnd)&&&ON_MESSAGE(WM_SOCKET_NOTIFY, OnSocketNotify)&&END_MESSAGE_MAP()
&&LRESULT CSocketWnd::OnSocketNotify(WPARAM wParam, LPARAM lParam)&&{&&&CAsyncSocket::DoCallBack( wParam, lParam ); 收到Socket事件消息,回调CAsyncSocket的DoCallBack()函数&&&return 0L;&&}
&&然而,最不容易被初学Socket编程的人理解的,也是本文最要提醒的一点是,客户方在使用CAsyncSocket::Connect()时,往往返回一个WSAEWOULDBLOCK的错误(其它的某些函数调用也如此),实际上这不应该算作一个错误,它是Socket提醒我们,由于你使用了非阻塞Socket方式,所以(连接)操作需要时间,不能瞬间建立。既然如此,我们可以等待呀,等它连接成功为止,于是许多程序员就在调用Connect()之后,Sleep(0),然后不停地用WSAGetLastError()或者CAsyncSocket::GetLastError()查看Socket返回的错误,直到返回成功为止。这是一种错误的做法,断言,你不能达到预期目的。事实上,我们可以在Connect()调用之后等待CAsyncSocket::OnConnect()事件被触发,CAsyncSocket::OnConnect()是要表明Socket要么连接成功了,要么连接彻底失败了。至此,我们在CAsyncSocket::OnConnect()被调用之后就知道是否Socket连接成功了,还是失败了。&&类似的,Send()如果返回WSAEWOULDBLOCK错误,我们在OnSend()处等待,Receive()如果返回WSAEWOULDBLOCK错误,我们在OnReceive()处等待,以此类推。&&还有一点,也许是个难点,那就是在客户方调用Connect()连接服务方,那么服务方如何Accept(),以建立连接的问题。简单的做法就是在监听的Socket收到OnAccept()时,用一个新的CAsyncSocket对象去建立连接,例如:
&void CMySocket::OnAccept( int ErrCode )&{&&&&&& CMySocket* pSocket = new CMyS&&&&&& Accept( *pSocket );&}&&& 于是,上面的pSocket和客户方建立了连接,以后的通信就是这个pSocket对象去和客户方进行,而监听的Socket仍然继续在监听,一旦又有一个客户方要连接服务方,则上面的OnAccept()又会被调用一次。当然pSocket是和客户方通信的服务方,它不会触发OnAccept()事件,因为它不是监听Socket。
本文已收录于以下专栏:
相关文章推荐
主要内容:Socket I/O事件的定义、I/O处理函数的实现。
内核版本:3.15.2
我的博客:http://blog.csdn.net/zhangskd
I/O事件定义
sock中定义了...
CAsyncSocket
         看类名就知道,它是一个异步非阻塞Socket封装类,CAsyncSocket::Create()有一个参数指明了你想要处理哪些Socket事件,你关心的事...
其实这个和 PC 机的通信差不多,大同小异。 PC 机上是直接 send 发送数据的,而 MTK 是发送数据时要加一个 HTTP 头再发送出去,这就是传说中的CMWAP 模式通信,与&#16...
PB窗口居中的实现方法
        在PB中,如何使打开的窗口在屏幕中居中显示呢?现在用得多的有以下两种
(1)直接使用PB窗口中的center属性(PB9及以上版本才有该属性)。...
本例采用Socket实现局域网通信。
开发环境:XP+VS2005+MFC
关键API:WSACreateEvent、WSAEventSelect、WSACloseEvent、WSAWai...
如果你想在Windows平台上构建服务器应用,那么I/O模型是你必须考虑的。Windows操作系统提供了选择(Select)、异步选择(WSAAsyncSelect)、事件选择(WSAEventSel...
1.closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:BOOL bReuseaddr=TRUE;setsockopt(s,SOL_SOCKET ,SO...
他的最新文章
讲师:宋宝华
讲师:何宇健
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 rabbitmq 消息回调 的文章

 

随机推荐