Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何为未勾选的列表编制索引?_Python_Sockets_Networking_Pygame_Pickle - Fatal编程技术网

Python 如何为未勾选的列表编制索引?

Python 如何为未勾选的列表编制索引?,python,sockets,networking,pygame,pickle,Python,Sockets,Networking,Pygame,Pickle,我正在使用pygame和sockets制作一个局域网多人竞技场射击游戏,在将腌渍对象数据从服务器传输到客户端时遇到了麻烦。我有两个物体,玩家和子弹。我不知道如何一次发送多个对象,所以我决定将这两个对象放在一个列表中并对它们进行pickle处理。但当取消勾选时,我无法为列表编制索引,因为我一直在获取“EOFError:输入用完” 因此,我想取消勾选我收到的列表,并分离出该列表中的2个对象。但是python不允许我在取消勾选列表后为其编制索引。任何帮助都将不胜感激。 这是我的密码: #instant

我正在使用pygame和sockets制作一个局域网多人竞技场射击游戏,在将腌渍对象数据从服务器传输到客户端时遇到了麻烦。我有两个物体,玩家和子弹。我不知道如何一次发送多个对象,所以我决定将这两个对象放在一个列表中并对它们进行pickle处理。但当取消勾选时,我无法为列表编制索引,因为我一直在获取“EOFError:输入用完”

因此,我想取消勾选我收到的列表,并分离出该列表中的2个对象。但是python不允许我在取消勾选列表后为其编制索引。任何帮助都将不胜感激。 这是我的密码:

#instantiating instances for Player and Projectile classes

players=[Player(450,400,"sprite1.png",1),Player(500,400,"sprite2.png",2)]
bullets=[Projectile(50,50,5,"right","projectile.png",0)]  

def threaded_client(conn, player):
    player_data=(players[player])
    bullet_data=(bullets[player])
    alldata=[player_data,bullet_data]    #putting the 2 objects in a list.
    conn.send(pickle.dumps(alldata))     #pickling list

    reply = ""
    while True:
    try:
        alldata = pickle.loads(conn.recv(2048))
        players[player] = alldata[0]
...

self.client.connect(self.addr)
alldata=pickle.loads(self.client.recv(2048)) #unpickling the list
return alldata[0]   #trying to return the first object 

您需要做出安排,以确保在取消勾选之前拥有整个对象。您正在执行conn.recvXXX,但这并不意味着您实际收到了所有XXX字节。成功时,它意味着您获得了1到XXX字节(含)之间的数据。如果它是一个小的缓冲区,您通常会在一个块中获得整个内容,但您永远不应该指望它

通常,您会希望使用struct模块以固定大小的二进制格式发送字节计数,然后在检索字节计数后,继续接收,直到获得所有预期字节或出现错误,即您的对等机断开连接

在发送端类似这样的内容:

import struct

pickled_bytes = pickle.dumps(thing_youre_sending)
p_size = len(pickled_bytes)                # Size of pickled buffer
p_size_buf = struct.pack("!I", p_size)     # Packed binary size (4 byte field)
conn.sendall(p_size_buf)                   # Send length (Note sendall!)
conn.sendall(pickled_bytes)                # Send actual pickled object
在接收端,您将执行以下操作:

import struct

...
def recv_all(conn, rlen):
    """ Function to receive all bytes """
    recvd = 0
    buf = b''
    while recvd < rlen:
        rbuf = conn.recv(rlen - recvd)
        if not rbuf:
            # Client disconnected. Handle error in whatever way makes sense
            raise ClientDisconnected()
        recvd += len(rbuf)
        buf += rbuf

...
p_size_buf = recv_all(conn, 4)                 # Receive entire binary length field
p_size = struct.unpack("!I", p_size_buf)[0]    # (Unpack returns an array)

pickled_bytes = recv_all(conn, p_size)         # Receive actual pickled object
thing_you_sent = pickle.loads(pickled_bytes)

self.client.recv2048*3的值用于什么?你把它印出来了吗?接收的这个套接字程序也有Player类吗?这是我从客户端到服务器发送和接收的比特2048的数量self.client.recv'是客户端在发送数据时从服务器访问数据的位置。这就是为什么我将变量命名为“alldata”,并将所有数据播放器和投射物对象存储在该变量中。我知道这是什么意思,我问你从中得到的值是多少。该值是一个包含播放器和投射物对象的pickle列表。我已将这两个对象放在一个列表中,并对它们进行pickle,然后通过网络发送它们。这就是我从“pickle.loadsself.client.recv2048”收到的信息。我只是想知道如何取消勾选并将对象重新分离,python不会让我取消勾选并索引它们。哦,好吧,我不知道如何使用struct。我会试试看会发生什么。谢谢你的时间和帮助。