Я создаю настольную игру на python, которая требует, чтобы я отправлял объекты, созданные пользовательским классом Hex (), который является подклассом кортежа. Проблема, с которой я сталкиваюсь, заключается в том, что, когда сервер получает рассмотренное сообщение (кортеж, содержащий строку и шестнадцатеричный объект), он выдает следующую ошибку:
Ошибка типа: __new __ () отсутствует 2 обязательных позиционных аргумента: 'r' и 's'
Я относительно новичок в ООП, но я полагаю, что сервер пытается создать объект Hex, когда он распаковывает сообщение кортежа, однако у него, очевидно, нет необходимой информации для воссоздания исходного объекта, поскольку он все упакован в самом объекте.
Если бы кто-нибудь мог предложить способ, которым я могу успешно отправить мой объект Hex с клиента на сервер и обратно, это будет оценено.
Код ниже:
server.py
import socket
import pickle
HOST = '127.0.0.1'
PORT = 57343
SOCK = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
SOCK.bind((HOST, PORT))
SOCK.listen()
print('Server active, waiting for connections...')
conn, addr = SOCK.accept()
print('Connected to:', addr)
conn.send(pickle.dumps('conn test'))
print('test message sent to', conn)
while True:
try:
print('waiting for data')
data = pickle.loads(conn.recv(2048))
command, info = data
if command == 'move':
print('Received message', data)
elif command == 'get':
pass
conn.sendall(pickle.dumps('game'))
except (EOFError, ConnectionResetError) as err:
print(err)
break
print('Lost connection')
conn.close()
client.py
import tmp_hex_lib as hl
from network import Network
def main():
game_over = False
moves = []
attack_switch = False
net = Network()
net.get_player()
while not game_over: # main game loop
try:
net.send(('get', None))
except:
game_over = True
print("Couldn't find game")
break
selected_hex = hl.Hex(-13, 10, 3)
print('selected_hex has type:', type(selected_hex))
moves.append(selected_hex)
if attack_switch:
net.send(('attack', None))
else:
net.send(('move', 'this message works'))
net.send(('move', selected_hex)) # if any other type is sent, game runs fine
attack_switch = False
if __name__ == '__main__':
main()
network.py
import socket
import pickle
class Network:
def __init__(self):
self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server = "127.0.0.1"
self.port = 57343
self.addr = (self.server, self.port)
self.player = self.connect()
def get_player(self):
return self.player
def connect(self):
try:
self.client.connect(self.addr)
print('connecting to server')
data = pickle.loads(self.client.recv(2048))
print('Received data:', data)
return data
except EOFError as err:
print(err)
def send(self, data):
try:
self.client.send(pickle.dumps(data))
return pickle.loads(self.client.recv(2048))
except socket.error as err:
print(err)
tmp_hex_lib.py
class Hex(tuple):
def __new__(self, q, r, s):
return tuple.__new__(self, (q, r, s))
def __init__(self, q, r, s):
self.q = q
self.r = r
self.s = s
assert not (round(q + r + s) != 0), "q + r + s must be 0"