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

A_Jian發表於2020-12-08

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

Send Actor

Send Actor初始化

class SendActor(pykka.ThreadingActor):
'''
傳送訊息給服務端
'''
def __init__(self, player=None, sock=None):
super(SendActor, self).__init__()
self.player = player
self.socket = sock
self.wpe = 1
  • 引數傳遞及呼叫,在PlayerActor裡,直接看圖 sendActor_args
  • 在PlayerActor的on_receive裡建立socket/websocket連線,我的專案是用websocket,引數傳PlayerActor的例項和socket

啟動Send Actor

def on_start(self):
self.on_heart()
  • 跟 Player Actor 一樣,要先呼叫這裡,我在這裡啟動了心跳方法,可以根據自己的專案型別決定心跳的啟動方式或幹掉心跳

心跳包

def on_heart(self):
self.player.sys_count += 1
if self.player.sys_count >= 590:
self.actor_ref.tell({MSG_PROTO: {'cmd': 'hall_heart'}})
self.player.sys_count = 0
# 心跳這裡時間會阻塞100毫秒
self.actor_ref.tell({MSG_HEART:{'msg':'loop'}})
time.sleep(0.1)
  • MSG_PROTO:訊息型別,傳送協議都是這個型別,可自己自定義
  • 這裡我是60秒跟服務端發一次心跳包
  • {'cmd': 'hall_heart'} : 這是心跳協議,我這裡用的Json格式的協議,根據自己專案的協議型別更換,如protobuf,sproto,自定義協議,關於協議轉換(序列化和反序列化)這裡就不展開討論,後面再寫
  • self.actor_ref.tell({MSG_HEART:{'msg':'loop'}}) : 這一行的程式碼作用是重複給SendActor 自己傳送訊息,在SendActor的on_receive會接收到訊息

序列化和傳送資料

def on_receive(self, msg):
'''
msg[MSG_PROTO] 打包好的協議資料
傳送包有引數的為元組型別,沒有引數則直接傳送協議
'''
if MSG_PROTO in msg.keys() and msg[MSG_PROTO]:
proto_id, proto_bin = msg[MSG_PROTO]['cmd'],msg[MSG_PROTO]
proto_header = {
'cmd': proto_id,
'sessionId': self.wpe,
'ts':int(time.time()*1000),
}
proto_header.update(proto_bin)
buff = json.dumps(proto_header)
self.socket.send(buff)
elif msg[MSG_HEART]:
self.on_heart()
else:
print('發過來空資料了')
if self.wpe is XXX:
self.wpe = 0
else:
self.wpe = self.wpe + 1
  • msg: 這裡接收兩個資料,協議ID和序列化後的協議內容
  • 協議頭:proto_header,協議內容和協議頭進行合併,再傳送給服務端
  • 前面寫的心跳方法在這裡呼叫
  • wpe 我這裡是指向sessionID,有些專案需要做序列校驗

停止SendActor

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

又是log收集

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

接下來的是 python編寫遊戲測試機器人客戶端(三),跟SendActor區別在於反序列化服務端的資料

相關文章