python发送byte数据组到tcp的server

前一段时间需要和一个tcp服务端进行数据交互,有约定好的数据报文格式,但是是以十六进制形式定义的的,所以在测试数据反馈的时候用python写了一个byte[]数据发送的tcp clinet端的测试demo
代码如下:

from socket import *
import struct
import time
import sys
def init(x):#初始化需要发送的list数组
    lists = [[0]*8 for i in range(7)]#定义list的行列大小
    for i in range(7):
        lists[i].append(0)#填充0
        lists[i][3] = 5
        lists[i][4] = int(x)#填充序号
    lists[0][7] = 16#填充指令id
    lists[1][7] = 17
    lists[2][7] = 18
    lists[3][7] = 19
    lists[4][7] = 20
    lists[5][7] = 24
    lists[6][7] = 25
    return lists

def main():
    # 1.创建tcp_client_socket 套接字对象
    tcp_client_socket = socket(AF_INET,SOCK_STREAM)
    # 作为客户端,主动连接服务器较多,一般不需要绑定端口

    # 2.连接服务器
    tcp_client_socket.connect(("127.0.0.1",7001))
    a = sys.argv[1]
    while True:
        for i in range(7):
            print(init(a)[i])
            """无限循环可以实现无限发送"""
            # 3.向服务器发送数据
            cmd = init(a)[i]
            to_server = ""
            for i in range(len(cmd)):
                to_server += chr(cmd[i])
            print(repr(to_server))
            print("发送的消息为:",to_server.encode())
            tcp_client_socket.send(to_server.encode())# 在linux中默认是utf-8编码
        # 在udp协议中使用的sendto() 因为udp发送的为数据报,包括ip port和数据,           # 所以sendto()中需要传入address,而tcp为面向连接,再发送消息之前就已经连接上了目标主机
        #time.sleep(1)
        # 4.接收服务器返回的消息
            recv_data = tcp_client_socket.recv(1024)  # 此处与udp不同,客户端已经知道消息来自哪台服务器,不需要用recvfrom了
            if recv_data:
                print("返回的消息为:",recv_data)
            else:
                print("对方已离线。。")
                break

    tcp_client_socket.close()


if __name__ == '__main__
	main()
Python中,你可以通过socket库来建立一个服务器,并将结构体数据转换成可以传输的字节流。而在Unity中,你需要创建一个客户端来连接并解析接收到的数据。这里是一个简单的示例: 首先,我们假设你有一个Python结构体(struct),例如: ```python import struct class DataStruct: def __init__(self, field1, field2, field3): self.field1 = field1 self.field2 = field2 self.field3 = field3 ``` 然后,我们将这个结构体序列化到字节流: ```python def pack_data(data_struct): return struct.pack("<iii", data_struct.field1, data_struct.field2, data_struct.field3) # 发送5数据 for i in range(5): data = DataStruct(i * 10, i * 100, i * 1000) byte_data = pack_data(data) # 发送给Unity的socket socket.send(byte_data) ``` 在Unity方面,你需要创建一个Socket连接,并解析接收到的数据: ```csharp using System.Net; using System.IO; public class ClientManager : MonoBehaviour { private Socket _clientSocket; void Start() { // 连接到Python服务器 IPAddress ipAddress = IPAddress.Parse("your_server_ip"); int port = your_server_port; _clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); _clientSocket.Connect(ipAddress, port); for (int i = 0; i < 5; i++) { byte[] receivedData = ReceiveAll(_clientSocket); // 从socket读取所有数据 int[] unpackedData = ReadIntsFromBytes(receivedData); // 解析字节流为整数数 ProcessReceivedData(unpackedData); // 处理数据 } } private byte[] ReceiveAll(Socket socket) { byte[] buffer = new byte[4096]; List<byte> bytes = new List<byte>(); while (true) { int bytesRead = socket.Receive(buffer, 0, buffer.Length, SocketFlags.None); if (bytesRead == 0) break; bytes.AddRange(buffer.Take(bytesRead)); } return bytes.ToArray(); } private int[] ReadIntsFromBytes(byte[] bytes) { using (MemoryStream memoryStream = new MemoryStream(bytes)) using (BinaryReader reader = new BinaryReader(memoryStream)) { return reader.ReadInt32阵列(3); // 假设每个数据都是三个整数 } } private void ProcessReceivedData(int[] data) { Debug.Log($"Received: Field1={data[0]}, Field2={data[1]}, Field3={data[2]}"); } } ``` 这只是一个基础的示例,实际应用中可能需要处理网络错误、连接断开等问题。同时,在Unity中,如果你的数据不是固定的三元,`ReadIntsFromBytes`函数也需要相应调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值