我一直在尝试在 pygame 中创建一个两人游戏。我对套接字做了一些研究,并一直尝试将它们放入游戏中。这是我在服务器中设置的套接字函数,我不会把所有的游戏代码都放进去,因为它很长:
def create_sockets(self):
self.ip = "192.168.1.68"
self.port = 8888
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_socket.bind((self.ip, self.port))
self.server_socket.listen(5)
self.conn, self.addr = self.server_socket.accept()
但是通过反复试验,当 server_socket.accept() 运行时,我得到一个黑屏和一个色轮(我在 Mac 上)。为什么会发生这种情况?相同的代码在我之前的服务器测试中运行良好。由于我对套接字非常陌生,请纠正我的任何错误/不良做法
提前致谢
最佳答案
+1 到 svk。每当我在 pygame 中使用 Socket 时,我都会使用线程来使其异步。我很确定 .listen() 和 .accept() 都会在循环中卡住您的程序,因为这些方法正在等待发生某些事情。
这是 pygame 中 pong 克隆的完整代码。这是一个“哑”服务器,这意味着它不处理游戏逻辑,只是与客户端共享数据。
这可能不是您整体上首选的方法,但它确实展示了如何处理异步连接/监听。以及使用 pickle 来编码/解码您想要的任何数据类型。这样你就可以踢列表之类的东西。
# Server example:
from threading import Thread
import socket, pickle, logging
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("0.0.0.0", 12354))
logging.basicConfig(format='%(asctime)s:%(levelname)s:%(lineno)s %(message)s', level=logging.DEBUG)
client_list = []
max_clients = 2
global started
started = 0
class Client():
def __init__(self, conn = ''):
self.conn = conn
# add to global clients list
client_list.append(self)
self.client_thread = Thread(target = self.process_messages)
self.client_thread.start()
def process_messages(self):
while True:
try:
data = self.conn.recv(1024)
# send to all in client_list except self
data = pickle.loads(data)
data.append(started)
logging.info("Sending Data: {0}".format(data))
data = pickle.dumps(data)
for client in client_list:
if client != self:
client.conn.sendall(data)
data = ""
except ConnectionResetError:
logging.debug("Client Disconnected")
break
def connection_manager():
while len(client_list) < max_clients:
logging.info('Listening for connections...')
s.listen(1)
conn, addr = s.accept()
logging.info("Client connected: {0}".format(addr))
x = Client(conn)
logging.debug(client_list)
logging.warning("Max clients reached")
logging.info("No longer listening..")
started = 0
accept_connections_thread = Thread(target = connection_manager)
accept_connections_thread.start()
关于python - 使用 Pygame 和 python 套接字,黑屏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20274799/