簡體   English   中英

如何通過python中的套接字發送類?

[英]How to send classes through sockets in python?

我正在編寫一個國際象棋在線游戲,但問題是json不會發送類數組......(每個類都是一種類型)

如何通過套接字將電路板(填充“無”和對象的二維列表)發送到客戶端?

import os
from pawn import Pawn
from rook import Rook
from queen import Queen
from bishop import Bishop
from king import King
from knight import Knight
from playsound import playsound
import socket
import json

LISTEN_PORT = 46

def send_to_serv(sock, msg):
    sock.sendall(json.dumps(msg).encode())

def recv_from_serv(sock):
    return json.loads(sock.recv(1024).decode())


board = [0] * 8

for i in range(8):
    board[i] = [None] * 8  # initiating board

for i in range(8):  # initiating pawns
    board[6][i] = Pawn('white')
    board[1][i] = Pawn('black')

board[0][0] = Rook('black')
board[0][7] = Rook('black')
board[0][1] = Knight('black')
board[0][6] = Knight('black')
board[0][2] = Bishop('black')
board[0][5] = Bishop('black')
board[0][3] = Queen('black')
board[0][4] = King('black')

board[7][0] = Rook('white')
board[7][7] = Rook('white')
board[7][1] = Knight('white')
board[7][6] = Knight('white')
board[7][2] = Bishop('white')
board[7][5] = Bishop('white')
board[7][3] = Queen('white')
board[7][4] = King('white')

listening_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('127.0.0.1', LISTEN_PORT)
listening_sock.bind(server_address)
listening_sock.listen(1)
client_soc, client_address = listening_sock.accept()

while (True):
    client_msg = recv_from_serv(client_soc)
    msg = board
    send_to_serv(client_soc, msg)

我得到的錯誤是這樣的:

raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type Rook is not JSON serializable

有幾種方法可以解決這個問題。 一種是使用具有與 JSON 相同接口但支持(幾乎)任何 Python 對象的pickle

小心如何將它用作 pickle 本質上允許執行傳遞給它的任意代碼,因此僅對受信任的連接執行此操作。 如果這個套接字對互聯網開放,任何了解它的人都可以在您的服務器上執行任意代碼。

首先,我們導入它。 如果在 Python 2 中你會想要導入cPickle因為它更快 - 在 Python 3 中導入pickle默認為cPickle如果可用:

# python 3
import pickle

#python 2
import cPickle as pickle

然后我們可以使用它來發送數據:

def send_to_serv(sock, msg):
    sock.sendall(pickle.dumps(msg))

def recv_from_serv(sock):
    return pickle.loads(sock.recv(1024).decode())

另一種選擇是將類解構為字典。 它有點復雜,但允許與非 Python 接口共享信息。 但是,如果沒有類定義,我無法提供示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM