【问题标题】:Python sockets: ValueError: invalid literal for int() with base 10: ''Python套接字:ValueError:int()的无效文字,基数为10:''
【发布时间】: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
  • 找到了,谢谢你的帮助! :)

标签: python sockets pygame


【解决方案1】:

发现问题。在移动精灵时,我将 sprite1.x 和 sprite1.y 更改为小数位,因此不发送整数,但很可能是双精度/浮点值。因此我将精灵移动的速度从 0.3 更改为 1,现在我没有收到此错误消息。

【讨论】:

  • 很高兴你找到它!
猜你喜欢
  • 1970-01-01
  • 2017-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
  • 2018-09-05
  • 2021-12-18
相关资源
最近更新 更多