使用Pygame与python套接字,黑屏

时间:2013-11-28 21:11:30

标签: 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 个答案:

答案 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()