socket通信 python实现(基础功能)

文章描述了一个使用C++的socket编程实现的服务端与客户端通信,用于文件传输,特别是图像文件,并涉及到数据结构如`struct`和文件头信息的处理。同时提到的YOLOv5可能与图像识别有关,但文章主体并未详细展开。
摘要由CSDN通过智能技术生成

项目没有用到,没做深入学习,不想多做注解了。代码没得问题

服务端代码:

import socket,struct
from PIL import Image
# 创建socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定IP地址和端口号
server_address = ('localhost', 9999)
server_socket.bind(server_address)
# 监听连接
server_socket.listen(1)
# 等待C++连接并接收数据
print('等待客户端连接...')
# 接受C++连接
client_socket, client_address = server_socket.accept()
fileinfo_size = struct.calcsize('128sq')  #计算给定的格式(fmt)占用多少字节的内存
print('客户端已连接:', client_address)
while True:
    # print('等待客户端连接...')
    # # 接受C++连接
    # client_socket, client_address = server_socket.accept()
    # fileinfo_size = struct.calcsize('128sq')
    # print('客户端已连接:', client_address)
    try:
        data= client_socket.recv(fileinfo_size)
        if data:
            # 将接收到的数据流转换为图像
            filename, filesize = struct.unpack('128sq', data)  #将外部压缩的格式字符串进行解压,返回一个数组
            fn = filename.decode().strip('\x00')
            print(fn)
            result=Detect().infer_image(fn)
            client_socket.send(str(result).encode())  #数据要保证不是list,不然会报错
        else:
            # C++断开连接
            print('客户端已断开连接:', client_address)
            break
    except Exception as e:
        print('发生错误:', str(e))
        break
    # 关闭C++连接
client_socket.close()
# 关闭服务端socket
server_socket.close()

客户端:

import socket,threading
import struct,os
class Client:
    def __init__(self):
        # 创建socket对象
        self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 连接服务端
        self.server_address = ('127.0.0.1', 9999)
        self.client_socket.connect(self.server_address)
        self.fileinfo_size = struct.calcsize('128sq')
        # # 创建一个线程来接收服务器发送的数据
        # t = threading.Thread(target=self.Receive)
        # t.start()
        while True:
            message = 'D:/project/yolov5-6.0/data/images/car.jpg' 
            # fileinfo_size = struct.calcsize('128sq')
            # 定义文件头信息,包含文件名和文件大小
            fhead = struct.pack('128sq', bytes(message.encode('utf-8')), os.stat(message).st_size)
            print(fhead)
            self.client_socket.send(fhead)
            response = self.client_socket.recv(1024)
            print('服务端回复:', response.decode())
    # def Receive(self):
    #     while True:
    #         # 接收服务端回复的数据
    #         response = self.client_socket.recv(1024)
    #         print('服务端回复:', response.decode())
if __name__=="__main__":
    client = Client()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值