python 編寫遊戲測試機器人客戶端 (三)

A_Jian發表於2020-12-08

遊戲測試機器人搭建 - Recv Actor

Recv Actor

Recv Actor初始化

class RecvActor(pykka.ThreadingActor):
def __init__(self, player=None, sock=None):
super(RecvActor, self).__init__()
self.player = player
self.socket = sock
  • 引數傳遞及呼叫,在PlayerActor裡,看圖 recv_args
  • 傳的引數跟Send Actor 一樣

啟動Recv Actor

def on_start(self):
self.on_loop()
  • 跟 Send Actor 一樣,要先呼叫這裡,在這裡啟動了迴圈接收方法,持續接收服務端返回的資料

持續接收服務端資料

def on_receive(self, msg):
self.on_loop()
# sleep一下不然耗效能
time.sleep(0.01)

接收服務端資料進行反序列化

def on_loop(self):
data = self.socket.recv()
data = list(ijson.items(data,''))[0]
proto_id,proto_bin = data['cmd'],data
proto_module = protoFile
proto_cls = getattr(proto_module, str(proto_id).capitalize())
proto_cls_ins = proto_cls()
if hasattr(proto_cls_ins, 'response'):
getattr(proto_cls_ins,'response')(proto_bin)
self.player.send_msg(MSG_PROTO, (proto_id, proto_cls_ins))
else:
self.player.send_msg(MSG_PROTO, (proto_id, proto_cls_ins))
self.actor_ref.tell({'msg': 'loop'})

  • socket.recv : 接收服務端的資料
  • list(ijson.items(data,''))[0] : 服務端返回的資料是json,所以我用ijson來取值,之前的專案返回的是位元組流/二進位制流,我是根據協議文件生成對應的Python協議解析類來反序列化
  • 從data取到協議ID(proto_id)和協議內容(proto_bin)
  • 檢測(hasattr)協議模組(proto_module)裡有沒對應的協議,有的話就把該協議例項化,協議模組的協議類定義看下圖proto_show
  • to_json : 把dict裡的value取出來
  • 把反序列化後的協議ID和協議傳送給Player Actor 用來做互動處理(主要是擴充功能用的,proto模組,後續再寫)
  • 最後給自己傳送一條訊息,相當while 1,一直迴圈下去

停止RecvActor

def on_stop(self):
print('RecvActor stop')
  • pykka actor 自帶的方法,集中在PlayerActor的on_stop裡呼叫

雙是log收集

@GetLog(level='error')
def on_failure(self, exception_type, exception_value, traceback):
logging.error(f'RecvActor fail -> {exception_type, exception_value, tb.print_tb(traceback)}')
  • log模組的使用可以參考"官方說明"或者自行百度查詢,案例很多

到這裡3個核心的Actor都搭建完畢了,接下來演示下python編寫遊戲測試機器人客戶端(四)玩家登入

相關文章