我一直在尝试在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上)。为什么会这样?从以前我的服务器测试中相同的代码工作正常。由于我对套接字很新,请纠正我的任何错误/不良做法
提前致谢
答案 0 :(得分:1)
+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()