将字节正确发送到客户端

时间:2019-08-11 15:28:26

标签: python-3.x byte binary-data

在python中,我正在尝试构建一个简单的服务器/客户端应用程序,该应用程序将视频字节发送到客户端。

几个月来我一直在努力解决这个问题。

服务器正在侦听连接,并且每秒接收到这么多数据,长度为1316

例如: 数据=(sock_reciever.recv(16000000))

如果我打印(数据),我会得到这个

b'G \ x05 \ x14 \ x1e \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xffG \ x05 \ x14 \ x1f \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xffG \ x05 \ x14 \ x10 \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xffG \ x05 \ x14 \ x11 \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xf fG \ x05 \ x14 \ x12 \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xffG \ x05 \ x14 \ x13 \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xff \ xffG \ x05 \ x17 \ x12 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ r \ xff \ xe0 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ X 00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00'

输入后,我可以通过发送回去,并在VLC播放器中观看视频... sock_sender.sendto(数据,(SENDMCAST_GRP,SENDMCAST_PORT))

Ultimatley,我要获取此数据,然后通过套接字将其发送给客户端。 conn.send(数据)


但是,在客户端,我认为数据输入顺序错误

我已经比较了服务器和客户端之间的数据,它看起来是相同的,但是它是在客户端建立的,这可能会导致某种程度的溢出。

在客户端,我接收传入的数据...

数据=(sock_reciever.recv(16000000))\

并通过发送回去 sock_sender.sendto(数据,(SENDMCAST_GRP,SENDMCAST_PORT))

但是在客户端,与服务器端,我没有得到相同的结果...

如何向这些数据添加标头以确保其按顺序到达客户端?

如果可能的话,请向我解释一下,就像您解释一条鱼中的氧气一样。

这里没有提到我使用的是哪个套接字,我会尽力解释。

我正在尝试在服务器和客户端之间使用TCP套接字,我认为使用流套接字会更可靠,我可能是错的

唯一的原因是,我想做一个反向连接,以便客户端连接到服务器然后接收数据

我还使用sock_sender.sendto(data,(SENDMCAST_GRP,SENDMCAST_PORT))只是在客户端中继传入的数据,而不是在服务器和客户端之间的实际连接

用于服务器/客户端之间通信的套接字 被称为sock_client

sock_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

从客户端接收连接

conn,地址= sock_client.accept()

将数据发送到客户端

conn.send(数据)

客户端已设置为-------------------- /

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

data = s.recv(2400000)

然后将数据中继回传给其他应用程序,通过

sock_sender.sendto(数据,(SENDMCAST_GRP,SENDMCAST_PORT))

我需要确保客户端/服务器套接字连接之间的数据准确且完整。

1 个答案:

答案 0 :(得分:0)

让我解释一下。可以借助struct以字节形式发送视频。它是python标准库字符串服务的一部分。 它将字符串解释为打包的二进制数据,并在Python值和以Python字符串表示的C结构之间执行转换。这有助于处理文件,套接字网络连接和其他来源中的二进制数据。在server.py中,将帧矩阵作为变量a中的字符串进行酸洗转储,然后使用struct.pack添加参考有效负载大小(对于a中的字符串)。有效载荷大小使用+附加到a,然后.sendall发送整个帧。为了简单说明,假设我们的帧只是3x3矩阵:

frame = np.array([[1,2,3],[4,5,6],[7,8,9]]

a = pickle.dumps(frame)

框架的腌制形式如下所示:

b'\ x80 \ x03cnumpy.core.multiarray \ n_reconstruct \ nq \ x00cnumpy \ nndarray \ nq \ x01K \ x00 \ x85q \ x02C \ x01bq \ x03 \ x87q \ x04Rq \ x05(K \ x01K \ x03K \ x03 \ x86q \ x06cumpy \ ndtype \ nq \ x07X \ x02 \ x00 \ x00 \ x00i4q \ x08K \ x00K \ x01 \ x87q \ tRq \ n(K \ x03X \ x01 \ x00 \ x00 \ x00

有效载荷大小:len(a)为193,其字符串表示形式为4字节“ L”格式为b'\ xc1 \ x00 \ x00 \ x00'。 然后,message = struct.pack(“ L”,len(a))+ a

b'\ xc1 \ x00 \ x00 \ x00 \ x80 \ x03cnumpy.core.multiarray \ n_reconstruct \ nq \ x00cnumpy \ nndarray \ nq \ x01K \ x00 \ x85q \ x02C \ x01bq \ x03 \ x87q \ x04Rq \ x05(K \ x01K \ x03K \ x03 \ x86q \ x06cumpy \ ndtype \ nq \ x07X \ x02 \ x00 \ x00 \ x00i4q \ x08K \ x00K \ x01 \ x87q \ tRq \ n(K \ x03X \ x01 \ x00 \ x00 \ x00

现在,该消息还包含数据前面的有效载荷大小。 len(消息)= 197。 在client.py中,s.recv(4096)表示最多将通过阻塞调用接收到4096个字节。 数据以每个数据包4096字节的形式附加到字符串中。其余部分非常明显。 供参考的server.py和client.py工作版本如下。首先运行server.py,然后在另一个命令窗口中运行client.py。将显示已发送和已接收的帧。您可以增加最大字节数。我希望这可以解决您的问题!

server.py

    import socket,cv2,pickle
    import struct
    serversocket = socket.socket(
                socket.AF_INET, socket.SOCK_STREAM)
    host = socket.gethostname()
    port = 9999
    serversocket.bind((host, port))
    serversocket.listen(5)

    while True:
        clientsocket,addr = serversocket.accept()

        print("Got a connection from %s" % str(addr))
        if clientsocket:
            vid = cv2.VideoCapture(0)
            while(vid.isOpened()):
                img, frame = vid.read()
                gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
                print(frame)
                a = pickle.dumps(frame)
                message =struct.pack("L", len(a))+a
                clientsocket.sendall(message)
                cv2.imshow('Transmitted',frame)
                key = cv2.waitKey(1) & 0xFF
                if key == ord("q"):
                    clientsocket.close()

client.py

    import socket,cv2,pickle
    import struct
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    host = socket.gethostname()
    port = 9999
    s.connect((host, port))
    data = b""
    payload_size = struct.calcsize("L") 
    while True:
        while len(data) < payload_size:
            packet= s.recv(4096)
            if not packet: break
            data += packet
        packed_msg_size = data[:payload_size]
        data = data[payload_size:]
        msg_size = struct.unpack("L", packed_msg_size)[0]
        while len(data) < msg_size:
            data += s.recv(4096)
        frame_data = data[:msg_size]
        data = data[msg_size:]
        frame=pickle.loads(frame_data)
        cv2.imshow('Received',frame)
        key = cv2.waitKey(1) & 0xFF
        if key == ord("q"):
            break
    s.close()
相关问题