我完全失去了尝试在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()
注意:我最有可能出现多种错误,可能违反了该语言中的几种最佳做法。我真的不知道。
答案 0 :(得分:3)
问题是其中一些调用是阻塞的。特别是,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()
也是一个阻止调用,但在这种情况下可能没问题。
答案 1 :(得分:1)
好像这个库不是异步的,因此您对serve_forever
的第一次调用将不会返回,并且您的客户端永远不会启动。您可以创建一个新线程来启动服务器或将客户端和服务器拆分为单独的进程。