【问题标题】:Python Game ServerPython游戏服务器
【发布时间】:2013-06-09 19:23:59
【问题描述】:

尝试在 python 中为我的游戏创建 UDP 服务器/客户端时,我完全迷失了方向。我是这门语言的新手,在网络方面的经验有限。现在,服务器正在运行,但似乎没有收到来自客户端的任何消息。

服务器:

class GameServer:
    class GameServerUDPHandler(socketserver.BaseRequestHandler):
        def handle(self):
            data = self.request[0].strip()
            socket = self.request[1]
            print("{} wrote:".format(self.client_address[0]))
            print(data)
            socket.sendto(data.upper(), self.client_address)

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

    def start_server(self):
        self.server.serve_forever(

客户:

import socket
import sys

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(1024))
        print("Received:   {}".format(self.numberID))

-主程序/程序启动

import gameserver
import gameclient

if __name__ == "__main__":
    server = gameserver.GameServer(1300)
    server.start_server()
    client = gameclient.GameClient(1300, "localhost")
    client.register()

注意:我最有可能在多处出错,并且可能违反了该语言的几个最佳实践。我真的不知道。

【问题讨论】:

  • 我意识到你刚刚学习了一大堆 Python,很抱歉告诉你,但如果你想做不平凡的网络,你最好再学习一个框架。见Twisted
  • @kirelagin 谢谢。我想我不必这样做,特别是因为我花了几个小时试图安装 Twisted 无济于事(它只安装在我的 mac 上的 python2 上,并且由于错误而无法在 python3 中工作)。
  • 哦,对了。他们有一个plan to make it work with Python 3.3,但我不确定他们的进展如何……我仍然担心你现在最好的选择是切换到 Python 2,因为没有 Twisted 的 ntwork 编程很痛苦。
  • @MikeG:你为什么不把客户端和服务器分成单独的进程?
  • @MikeG 正如我所说,目前我没有关注他们的进展,但移植过程似乎还没有真正接近尾声……还有另一个nice page

标签: python networking python-3.x network-programming


【解决方案1】:

问题是其中一些调用被阻塞了。特别是,serve_forever() 方法将永远运行,因此如果您希望程序的其余部分继续运行,则需要将其放在单独的线程中:

import threading
if __name__ == "__main__":
    server = GameServer(1300)
    server_thread = threading.Thread(target=lambda: server.start_server())
    server_thread.start()

    time.sleep(1) # Give it time to start up; not production quality code of course

    client = GameClient(1300, "localhost")
    client.register()

socket.recv() 也是一个阻塞调用,但在这种情况下可能没问题。

【讨论】:

  • 我只是在提交时将其更改为在线程上运行。一开始,我只是假设它在一个单独的线程上运行。谢谢!
【解决方案2】:

似乎这个库不是异步的,所以您对serve_forever 的第一次调用将不会返回,并且您的客户端永远不会启动。您可以创建一个新线程来启动服务器或将您的客户端和服务器拆分为单独的进程。

【讨论】:

    猜你喜欢
    • 2021-07-05
    • 2013-11-12
    • 2012-06-16
    • 2011-09-23
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多