【发布时间】:2021-08-11 22:12:53
【问题描述】:
我正在设置一个简单的服务器和客户端。我在没有连接到服务器的情况下尝试了客户端代码,pygame 加载并且一切正常。我做了一个额外的步骤,服务器接收到第一个精灵的起始位置,游戏加载和起始位置应该是什么。现在下一步将是在接收其他玩家的同时不断发送玩家位置。现在我得到了错误:
File "test.py", line 89, in <module>
p2Pos = read_pos(send_package(make_pos((sprite1.x, sprite1.y))))
File "test.py", line 50, in read_pos
return int(str[0]), int(str[1])
ValueError: invalid literal for int() with base 10: ''
这告诉我客户端和服务器没有正常通信。套接字是字节流而不是消息流。所以我显然不会在起始位置之后发送和/或接收更多包裹。但不知如何应对这个问题?我需要以某种方式告诉服务器它可以预期多少数据,但我不知道如何?它发送的第一个字节是否应该是包的长度,当它收到它时是否应该进入循环并从流中读取,直到它读取到它期望的包的长度?我该怎么做?之前关于此的主题都没有对我有足够的帮助......
服务器.py:
import threading
import sys
server = "127.0.0.1"
port = 2300
pos = [(0, 0), (200, 200)]
playerr = 0
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.bind((server, port))
except socket.error as e:
str(e)
s.listen(2)
print("Waiting for a connection, Server Started")
sys.stdout.flush()
def read_pos(str):
str = str.split(",")
return int(str[0]), int(str[1])
def make_pos(tup):
return str(tup[0]) + "," + str(tup[1])
def threaded_client(conn, player):
conn.sendall(str.encode(make_pos(pos[player])))
reply = ""
while True:
try:
data = read_pos(conn.recv(2048).decode())
pos[player] = data
if not data:
print("Disconnected")
break
else:
if player == 0:
reply = pos[1]
else:
reply = pos[0]
print("Received: ", data)
print("Sending : ", reply)
conn.sendall(str.encode(make_pos(reply)))
except:
break
print("Lost connection")
conn.close()
while True:
conn, addr = s.accept()
print("Connected to:", addr)
t = threading.Thread(target=threaded_client, args=(conn, playerr))
t.start()
playerr += 1
test.py(客户端):
import pygame as pg
import socket
def connect():
try:
client.connect(addr)
return client.recv(2048).decode()
except:
pass
def send_package(data):
try:
client.sendall(str.encode(data))
return client.recv(2048).decode()
except socket.error as e:
print(e)
def get_pos():
keys = pg.key.get_pressed()
if keys[pg.K_LEFT]:
sprite1.vx = -0.3
if keys[pg.K_RIGHT]:
sprite1.vx = 0.3
if keys[pg.K_UP]:
sprite1.vy = -0.3
if keys[pg.K_DOWN]:
sprite1.vy = 0.3
def update_pos():
sprite1.x += sprite1.vx
sprite1.y += sprite1.vy
sprite1.vx, sprite1.vy = 0, 0
sprite1.rect = pg.Rect(sprite1.x, sprite1.y, 75, 75)
def update_other():
sprite2.rect = pg.Rect(sprite2.x, sprite2.y, 75, 75)
def stop_unboud():
if sprite1.x < 0:
sprite1.x = 0
if sprite1.y < 0:
sprite1.y = 0
if sprite1.x > 724:
sprite1.x = 724
if sprite1.y > 524:
sprite1.y = 524
def read_pos(str):
str = str.split(",")
return int(str[0]), int(str[1])
def make_pos(tup):
return str(tup[0]) + "," + str(tup[1])
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server = "127.0.0.1"
port = 2300
addr = (server, port)
pos = read_pos(connect())
pg.init()
window = pg.display.set_mode((800, 600))
sprite1 = pg.sprite.Sprite()
sprite1.image = pg.Surface((75, 75))
sprite1.image.fill((255, 0, 0))
sprite1.x = pos[0]
sprite1.y = pos[1]
sprite1.vx, sprite1.vy = 0,0
sprite1.rect = pg.Rect(sprite1.x, sprite1.y, 75, 75)
sprite2 = pg.sprite.Sprite()
sprite2.image = pg.Surface((75, 75))
sprite2.image.fill((255, 0, 0))
sprite2.x = 200
sprite2.y = 200
sprite2.vx, sprite2.vy = 0,0
sprite2.rect = pg.Rect(sprite2.x, sprite2.y, 75, 75)
all_group = pg.sprite.Group([sprite1, sprite2])
run = True
while run:
for event in pg.event.get():
if event.type == pg.QUIT:
run = False
p2Pos = read_pos(send_package(make_pos((sprite1.x, sprite1.y))))
sprite2.x = p2Pos[0]
sprite2.y = p2Pos[1]
update_other()
get_pos()
stop_unboud()
update_pos()
window.fill(0)
all_group.draw(window)
pg.display.flip()
pg.quit()
exit()````
【问题讨论】:
-
str[0]和str[1]之间有一个''。 -
嗯,所以它包含一个长度为零的字符?这是否意味着它什么也没有收到?
-
可能,检查代码中的某处
''可能会传递给 str -
找到了,谢谢你的帮助! :)