jeremyczhen / fdbus

FDBus - Fast Distributed Bus
https://blog.csdn.net/jeremy_cz/article/details/89060291
164 stars 85 forks source link

python接口client端invoke_sync调用service服务已经回复client,但client解析回复为空 #25

Open dengerous opened 3 years ago

dengerous commented 3 years ago

service端: def on_invoke(self, sid, msg_code, msg_data, reply_handle): if msg_code == baseCanservice.GWM_GET_T_Box_FD1: message_status = baseCanservice.BroadcastMessageStatus() message_status.ParseFromString(msg_data) print('onInvoke: msg status is: ', message_status.msg_status) now_playing = baseCanservice.SetSignalValueRequest() now_playing.raw_value = b'a' now_playing.type = 1 reply_data = now_playing.SerializeToString()

reply_data = message_status.SerializeToString()

    print("replay client serialize data is:{}".format(reply_data))
    reply_handle.reply(reply_data)
    reply_handle.destroy()

client端: msg = client_list[i].invoke_sync(baseCanservice.GWM_GET_T_Box_FD1, send_data)

service端日志: MyTestServer: onOnline on_online for server service3 , first: True onInvoke: msg status is: 2 replay client serialize data is:b'\n\x01a\x10\x01'

client端日志: send message data is:b'\x08\x02' On online for client service3 accept server reply data is:{'sid': 0, 'msg_code': 0, 'msg_data': None, 'status': -128, 'msg_buffer': None} Error for sync invoke: -128 double free or corruption (out) Aborted (core dumped)

期待回复!!!!

jeremyczhen commented 3 years ago

你用的是哪个版本?目前看这个问题发生在master最近的版本上,今天的提交顺便解决了。v4.2.0-release分支上应该没有这个问题。

dengerous commented 3 years ago

出现上面那个问题是拉取的默认master分支,然后今天我拉取了v4.2.0-release分支,重新build了fdbus(没有rebuild protobuf),编译过程没有出现任何错误,也生成了,host_server,name_server以及python依赖的libfdbus-clib.so库文件,运行name_server,以及logsvc服务,再次运行python接口的server,和client,在logsvc服务看不到任何消息,是不是提供的python接口也需要更改一下?

root@danger:~/fdbus/python/test# python3 fdbusClient.py server1 2021-01-11 03:12:20.032 | INFO | main::108 - send message data is:b'\n\x012' 2021-01-11 03:12:20.032 | INFO | baseFdbus:invoke_sync:345 - accept server reply data is:{'sid': -65534, 'msg_code': 3, 'msg_data': bytearray(b'\xef\xff\xff\xff\x01\r\x00Invalid sid!\x00'), 'status': -17, 'msg_buffer': 139786824191808}

dengerous commented 3 years ago

总结一下目前最新FDBUS提供的python接口遇到的问题(因为现在项目在使用这个框架,麻烦大佬有空了验证一下呢。):

1.在linux系统上FDBUS的master或者v4.2.0-release启动name_server,logsvc服务,使用python接口起的server和client服务,logsvc收不到任何日志信息(在这之前一个commit我试过是有日志的,并且可以收到广播消息,只是client的invoke收到消息是{'sid': 0, 'msg_code': 0, 'msg_data': None, 'status': -128, 'msg_buffer': None});

2.在linux系统上使用v4.0.0python接口client端调用sync_invoke,async_invoke能够正常和server端通信,并且数据交互没有问题,但是client端订阅消息ID和topic后,收到的broadCast消息报错: Exception ignored on calling ctypes callback function: <function BaseFdbusClient.get_on_get_event_func..call_on_get_event at 0x7f10d6a1d790> Traceback (most recent call last): File "/root/fdbus/python/test/baseFdbus.py", line 234, in call_on_get_event fdbus_ctypes2_buffer(event_data, data_size), File "/root/fdbus/python/test/baseFdbus.py", line 92, in fdbus_ctypes2_buffer res = bytearray(length) ValueError: negative count data length is: -805298896

3.windows10系统编译后过程没有报任何错误,但是server服务收到订阅的事件ID和topic都是空的,日志如下: client端: D:\works\ENVS\NOBO-ENV\Scripts\python.exe D:/works/python-projects/NoBoA/project/B02/protocol/baseCanService/baseCanServiceClient.py 2021-01-11 15:42:30.919 | INFO | common.fdbus.baseFdbus:on_online:496 - On online for client 2021-01-11 15:42:30.921 | INFO | common.fdbus.baseFdbus:call_on_broadcast:245 - Accept server broad cast message size is: 2021-01-11 15:42:30.921 | INFO | main:on_broad_cast:82 - onBroadcast: server端: D:\works\ENVS\NOBO-ENV\Scripts\python.exe D:/works/python-projects/NoBoA/common/fdbus/fdbusServer.py 2021-01-11 15:42:30.918 | INFO | main:on_online:32 - fdbusServer: onOnline 2021-01-11 15:42:30.919 | INFO | common.fdbus.baseFdbus:on_online:810 - on_online for server 2021-01-11 15:42:30.920 | INFO | common.fdbus.baseFdbus:on_subscribe:847 - on subscribe for server 2021-01-11 15:42:30.920 | INFO | common.fdbus.baseFdbus:on_subscribe:849 - event: 2021-01-11 15:42:30.920 | INFO | common.fdbus.baseFdbus:on_subscribe:849 - event: 2021-01-11 15:42:35.921 | INFO | main:on_offline:36 - fdbusServer: onOffline 2021-01-11 15:42:35.921 | INFO | common.fdbus.baseFdbus:on_offline:819 - on_offline for server logsvc服务: [F][0@NBKJ-5CD047HN0R][s->server1][server1][0][Subscribe][0][][0][22][1610350950921]{ {mName:[{event : 2, topic : },{event : 3, topic : topic-1},]}} [F][0@NBKJ-5CD047HN0R][s->s][server1][0][Status][0][][0][49][1610350950922]{ {null}} [D][E][FDBUS-0-NBKJ-5CD047HN0R][1610350950920] CIntraNameProxy: Session 0, Server: server1, address tcp://127.0.0.1:60006 is connected. [F][0@NBKJ-5CD047HN0R][s->s][server1][0][Broadcast][2][][4294967295][3][1610350951274]{ No log! Data size: 0 }

4.希望可以优化的,初始化FdbusClient的时候,订阅消息应该是随时可以订阅才好,现在是订阅的消息在初始化的时候在onLine的函数都要先订阅,其在online函数后订阅的都没有生效,这个是不是可以优化一下呢,和MQTT的类似: def on_online(self, sid): self.subscribe(self.subscribe_list) #就是这儿 super(fdbusClient, self).on_online(sid)

jeremyczhen commented 3 years ago

谢谢你花这么多时间报告这些问题。python版本确实没有仔细验证过,但既然提供了就要做好。接下来会把python好好整理一下,按照你提的几点来验证。

Update 2021/01/12: 问题已经解决了,python版本可以正常工作。

dengerous commented 3 years ago

感谢大佬,然后我这边拉取最新master代码,在ubuntu上可以正常通信,然后我这边遇到两个个问题(用的proto3): 1.client端订阅事件后,服务端收到的是空的,client端收到的broadcast也是空: logsvc端的日志: root@danger:~/workspace/fdbus/build# ./logsvc [F][5290@][org.fdbus.log-server->org.fdbus.log-server][org.fdbus.log-server][0][SidebandRequest][2][][4294967295][28][4459176]{ {null}} [F][5290@][org.fdbus.log-server->org.fdbus.log-server][org.fdbus.log-server][0][Subscribe][0][][0][12][4459176]{ {mName:[{event : 6, topic : },{event : 7, topic : },]}} [D][E][FDBUS-5290-][4459176] CIntraNameProxy: Session 0, Server: org.fdbus.log-server, address ipc:///tmp/fdb-ipc8 is connected. [D][E][FDBUS-5290-danger][4459176] CIntraNameProxy: Session 0, Server: org.fdbus.log-server, address ipc:///tmp/fdb-ipc8 is connected. [D][I][FDBUS-5290-danger][4459176] CIntraNameProxy: session 0: Server: server1, address ipc:///tmp/fdb-ipc9 is bound. [F][5290@danger][5290-nsproxy(local)->][][0][Request][1][][4294967295][60][4459177]{ {null}} [F][5294@][org.fdbus.log-server->org.fdbus.log-server][org.fdbus.log-server][0][SidebandRequest][2][][4294967295][28][4466007]{ {null}} [F][5294@][org.fdbus.log-server->org.fdbus.log-server][org.fdbus.log-server][0][Subscribe][0][][0][12][4466007]{ {mName:[{event : 6, topic : },{event : 7, topic : },]}} [D][E][FDBUS-5294-][4466007] CIntraNameProxy: Session 0, Server: org.fdbus.log-server, address ipc:///tmp/fdb-ipc8 is connected. [D][E][FDBUS-5294-danger][4466008] CIntraNameProxy: Session 0, Server: org.fdbus.log-server, address ipc:///tmp/fdb-ipc8 is connected. [F][5290@danger][s->server1][server1][0][SidebandRequest][2][][4294967295][9][4466008]{ {null}} [F][5294@danger][s->server1][server1][0][SidebandRequest][2][][4294967295][9][4466008]{ {null}} [F][5294@danger][s->server1][server1][0][Subscribe][0][][0][22][4466009]{ {mName:[{event : 2, topic : },{event : 3, topic : topic-1},]}} [D][E][FDBUS-5294-danger][4466009] CIntraNameProxy: Session 0, Server: server1, address ipc:///tmp/fdb-ipc9 is connected. [F][5290@danger][s->s][server1][0][Broadcast][2][b''][0][3][4466010]{ No log! Data size: 0 }

server端: root@danger:~/fdbus/python/test# python3 fdbusServer.py server1 2021-01-13 10:43:51.176 | INFO | main:on_online:36 - fdbusServer: onOnline 2021-01-13 10:43:51.176 | INFO | baseFdbus:on_online:812 - on_online for server 2021-01-13 10:43:51.177 | INFO | baseFdbus:on_subscribe:849 - on subscribe for server 2021-01-13 10:43:51.178 | INFO | baseFdbus:on_subscribe:851 - event: 2021-01-13 10:43:51.178 | INFO | baseFdbus:on_subscribe:851 - event: 2021-01-13 10:43:54.234 | INFO | main:on_offline:40 - fdbusServer: onOffline 2021-01-13 10:43:54.235 | INFO | baseFdbus:on_offline:821 - on_offline for server

client端: root@danger:~/fdbus/python/test# python3 fdbusClient.py server1 2021-01-13 10:43:51.176 | INFO | main::108 - send message data is:b'\n\x012\x10\x01' 2021-01-13 10:43:51.177 | INFO | baseFdbus:on_online:498 - On online for client 2021-01-13 10:43:51.178 | INFO | baseFdbus:call_on_broadcast:247 - Accept server broad cast message size is: data length is: 3 2021-01-13 10:43:51.178 | INFO | main:on_broad_cast:76 - onBroadcast:

2021-01-13 10:43:51.356 | INFO | baseFdbus:call_on_broadcast:247 - Accept server broad cast message size is: data length is: 3 2021-01-13 10:43:51.357 | INFO | main:on_broad_cast:76 - onBroadcast:

2021-01-13 10:43:51.357 | INFO | baseFdbus:call_on_broadcast:247 - Accept server broad cast message size is:

2.client调用sync_invoke方法时,收到的message_buffer很大等于140233836336800,这个代表的是字节么,release_return_msg这个方法解析报错:

root@danger:~/fdbus/python/test# python3 fdbusClient.py server1 2021-01-13 10:39:48.195 | INFO | main::108 - send message data is:b'\n\x012\x10\x01' 2021-01-13 10:39:48.196 | INFO | baseFdbus:invoke_sync:347 - accept server reply data is:{'sid': 0, 'msg_code': 0, 'msg_data': None, 'status': -128, 'msg_buffer': None} 2021-01-13 10:39:48.197 | INFO | main::111 - accept server reply data is:{'sid': 0, 'msg_code': 0, 'msg_data': None, 'status': -128, 'msg_buffer': None} 2021-01-13 10:39:48.197 | INFO | main::113 - Error for sync invoke: 2021-01-13 10:39:48.198 | INFO | baseFdbus:on_online:498 - On online for client 2021-01-13 10:39:49.199 | INFO | main::108 - send message data is:b'\n\x013\x10\x02' data length is: 2 2021-01-13 10:39:49.203 | INFO | baseFdbus:invoke_sync:347 - accept server reply data is:{'sid': 2, 'msg_code': 3, 'msg_data': b'\x08\x01', 'status': 0, 'msg_buffer': 140233836336800} 2021-01-13 10:39:49.203 | INFO | main::111 - accept server reply data is:{'sid': 2, 'msg_code': 3, 'msg_data': b'\x08\x01', 'status': 0, 'msg_buffer': 140233836336800} 2021-01-13 10:39:49.204 | INFO | main:process_response:36 - 1 2021-01-13 10:39:50.206 | INFO | main::108 - send message data is:b'\n\x014\x10\x02'

dengerous commented 3 years ago

我确认了一下出现上面订阅消息是空的原因,是因为用了proto3的,您这边的的例子是给的proto2,这个我也过了下没有问题