【问题标题】:Trouble Sending integer over Socket Server通过 Socket 服务器发送整数时遇到问题
【发布时间】:2013-06-11 02:35:37
【问题描述】:

当尝试使用 socketserver 和端口发送和解码整数时,我收到以下错误 ValueError: invalid literal for int() with base 10: ''(结束时的完整堆栈跟踪)。我在客户端用#<-----标记了错误的地方。请注意,我已经尝试了以下所有方法:增加缓冲区大小,将其作为字符串发送,尝试我能想到的每个种姓(先字符串然后 int,浮动,在发送之前先到 int,先到字节然后再到 int,等等)虽然我可能错过了一个。

这是我的服务器的代码:

import socketserver
import threading
import gameplayer


class GameServer:
    class GameServerUDPHandler(socketserver.BaseRequestHandler):
        def handle_register(self, socket, client_address):
            number = len(self.server.base.players)  # Zero based
            number = number + 1  # One based
            socket.sendto(bytes(number), client_address)
            self.server.base.players[number] = gameplayer.GamePlayer(id=number)
            print(self.server.base.players)

        def handle(self):
            data = self.request[0].strip()
            data = str(data, 'utf-8')
            print(data)
            socket = self.request[1]
            data = data.split('\n')
            option = data[0]
            print(option)
            c_add = self.client_address
            if option == "register":
                self.handle_register(socket, c_add)
                print("test")
            elif option == "get_postion":
                handle_get_postion(socket, c_add, data[1])
            elif option == "change_postion":
                hande_changed_postion(socket, c_add, data[1])
            # print("{} wrote:".format(self.client_address[0]))
            # socket.sendto(data.upper(), self.client_address)

    def __init__(self, port):
        self.server = socketserver.UDPServer(("localhost", port), self.GameServerUDPHandler)
        self.server.base = self
        self.players = {}

    def start_server(self):
        threading.Thread(target=self.server.serve_forever).start()

还有我的客户(错误所在):

class GameClient:
    def __init__(self, port, host):
        self.port = port
        self.host = host
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    def register(self):
        self.socket.sendto(bytes("register\n", "utf-8"), (self.host, self.port))
        self.numberID = int(self.socket.recv(10240).strip()) #<- WHERE ISSUE IS
        print("Received:   {}".format(self.numberID))

完整输出(错误从标记的部分开始):

register
register
{1: <gameplayer.GamePlayer object at 0x10078e390>}
test
Traceback (most recent call last): #<---- Where the error starts in the output.
  File "main.py", line 8, in <module>
    client.register()
  File "/Users/Mike/Desktop/Main/Programming/Work Space/Python/Game/gameclient.py", line 12, in register
    self.numberID = int(self.socket.recv(10240))
ValueError: invalid literal for int() with base 10: ''

【问题讨论】:

  • print(self.socket.recv(10240)) 看看传递给int 的内容可能是个好主意

标签: python networking python-3.x socketserver


【解决方案1】:

在服务器代码中更改以下行:

socket.sendto(bytes(number), client_address)

与:

socket.sendto(str(number).encode('utf-8'), client_address)

>>> bytes(3)
b'\x00\x00\x00'
>>> str(3)
'3'
>>> str(3).encode('utf')
b'3'

以及回溯的原因

>>> int(bytes(3))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: ''

【讨论】:

  • @MikeG,数字应该是字符串。如果 number 为 int,则忽略 'utf-8'。尝试帮助(字节)
猜你喜欢
  • 2021-07-30
  • 2019-12-16
  • 1970-01-01
  • 2016-03-31
  • 2021-12-21
  • 2021-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多