python - 使用 Pygame 和 python 套接字,黑屏

标签 python sockets pygame

我一直在尝试在 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/

相关文章:

python - pykinect2深度帧被截断

python - 在用 pygame 制作的游戏中实现菜单

python - Pygame: key.get_pressed() 与事件队列不一致

python - 如何更改或访问 pandas MultiIndex 列标题?

python - Beautifulsoup find 得到结果,但是 findall 得到空列表

c - 如何添加扫描端口ip

java - 由对等方或套接字重置的连接无中生有地关闭

python - 如何将 'for x in myresult: print(x[0])' 的结果放入变量中

python - AUTO_INCREMENT 在 sqlite 问题与 python

java - 服务器套接字不接受客户端