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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现增删好友功能的关键是要维护一个好友列表,并且能够对好友列表进行增删操作。下面是一个简单的示例代码,实现了基于 socket 通信的服务端增删好友功能。 ```python import socket # 创建 socket 对象 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定端口号 server_socket.bind(('localhost', 8888)) # 监听客户端连接 server_socket.listen(5) # 定义好友列表 friends = ['Alice', 'Bob', 'Charlie'] while True: # 接受客户端连接 client_socket, client_address = server_socket.accept() # 接收客户端请求 request = client_socket.recv(1024).decode('utf-8') # 解析请求 parts = request.split() command = parts[0] if command == 'list': # 列出好友列表 response = ' '.join(friends) elif command == 'add': # 添加好友 friend = parts[1] if friend not in friends: friends.append(friend) response = 'OK' else: response = 'Already exists' elif command == 'remove': # 删除好友 friend = parts[1] if friend in friends: friends.remove(friend) response = 'OK' else: response = 'Not found' else: # 无效命令 response = 'Invalid command' # 发送响应 client_socket.send(response.encode('utf-8')) # 关闭连接 client_socket.close() ``` 客户端可以通过发送以下命令来与服务端进行交互: - `list`:列出好友列表。 - `add <name>`:添加名为 `<name>` 的好友。 - `remove <name>`:删除名为 `<name>` 的好友。 例如,要添加名为 `David` 的好友,客户端可以发送以下请求: ``` add David ``` 服务端返回 `OK` 表示添加成功。 要列出当前所有好友,客户端可以发送以下请求: ``` list ``` 服务端返回一个以空格分隔的字符串,包含所有好友的名字。 要删除名为 `Charlie` 的好友,客户端可以发送以下请求: ``` remove Charlie ``` 服务端返回 `OK` 表示删除成功。如果要删除的好友不存在,服务端返回 `Not found`。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值