私は開発中のマルチプレイヤーオンラインゲームで奇妙な問題に遭遇しました。1つのパケット文字列を受け取ったときにサーバを切断するクライアント。
ユーザーがクライアント上で「クエストを受諾」をクリックすると、それは次のアクションを実行:サーバー上
packet = "A:io-QS#"
tcpClient.send(packet.encode('utf-8'))
を、データを送信/受信処理する各クライアントのために作成されたスレッドがある:
while (client[self.id].authenticated == True):
try:
data = (self.connection.recv(1024)).decode('utf-8')
client[self.id].lastPacketTime = time.time()
client[self.id].processData(data)
except:
print("Client disconnected due to data receive error")
client[self.id].saveDataToDatabase()
client[self.id].authenticated = False
client[self.id].loggedIn = False
サーバがパケット "A:io-QS#"を受信すると、例外をスローしてクライアントを切断します。私はaboeに言及したクライアントコードを変更して、パケット「M:w#」(方向移動パケット)を送信し、例外をスローしません。
パケットが「A:io-QS#」の場合のみ。 パケットサイズは問題になりません(ログイン資格情報を含むはるかに大きなパケットがこのサーバーループをうまく通過します)。 "client [self.id] .processData(data)"行をコメントアウトしようとしましたが、例外が発生します(ただしパケット 'A:io-QS#'のみ)。 サーバはデータを受け取った後ではあるが動作する前に例外をスローします。したがって、論理エラーではありません。
私は少し紛失していますが、誰かが私が行方不明になっているものを見たり、どのようにこの問題をさらにテストできるかについての推奨事項はありますか?
ありがとうございます!
ありがとうございました! これは、エラーが実際には 'processData()'関数で呼び出された 'クエストのステータスの更新'にあったタイプミスであることを発見しました。 すべてがもう一度完全に機能しています。ありがとうございます! 私はまた、sys.exc_info()をtry/exceptブロックに保存しました。 –