python network programming--the client sends a message to the server and the server returns a picture

client code

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@File    :client2.0.py
@IDE     :PyCharm 
@Author  :杰的烂笔头
@Date    :2023/7/15 16:35 
"""
import os
import struct
from socket import *
from threading import Thread


def deal_image(sock):
    while True:
        # 接收服务端发送过来的数据,
        fileinfo_size = struct.calcsize('128sq')
        but = sock.recv(fileinfo_size)
        if but:
            # 解析为图片名和图片内容
            filename, filesize = struct.unpack('128sq', but)
            # 解析文件名,并取出图片名的前后空格和0
            fn = filename.decode().strip("\x00")
            # 重新命名图片名
            new_filename = os.path.join('./', 'client_' + fn)
            # 定义一个空变量,用来接图片内容
            recvd_size = 0
            # 写入二进制内容
            fp = open(new_filename, 'wb')
            # 如果图片内容和变量内容不相等
            while not recvd_size == filesize:
                # 图片内容长度减去变量长度如果大于1024字节
                if filesize - recvd_size > 1024:
                    # 接收字节内容赋值data
                    data = sock.recv(1024)
                    # 写入空变量
                    recvd_size += len(data)
                else:
                    # 接收字节内容赋值data
                    data = sock.recv(1024)
                    # 把剩余的图片内容直接赋值给变量
                    recvd_size = filesize
                # 写入图片内容
                fp.write(data)
            print("----------")
            # 关闭写入
            fp.close()
        # 关闭套接字
        sock.close()
        break


def send_data():
    while True:
        # 要向服务端发送的数据
        msg = input(">")
        # 向服务端发送数据并加密
        client_socket.send(msg.encode('gbk'))
        if msg == 'end':
            print("结束发送")
            break
        deal_image(client_socket)


if __name__ == '__main__':
    # 创建套接字
    client_socket = socket(AF_INET, SOCK_STREAM)
    # 连接的地址和端口
    client_socket.connect(("172.20.10.3", 8888))
    # 创建多线程,并指定线程函数,并传递参数
    t2 = Thread(target=send_data)
    # 启动线程,并执行目标线程函数
    t2.start()
    # 使主线程执行完,继续进行下一次循环
    t2.join()
    # 关闭套接字
    client_socket.close()



 Server code

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@File    :server2.0.py
@IDE     :PyCharm 
@Author  :杰的烂笔头
@Date    :2023/7/15 16:35 
"""
import os
import struct
from threading import Thread
from socket import *


def recv_data(client_socket, client_info):
    while True:
        # 接收客户端传递的数据
        recv_data = client_socket.recv(1024)
        if not recv_data:
            print("客户端已断开连接")
            break
        # 把数据进行解码
        recv_connent = recv_data.decode("gbk")
        print(f"客户端:{recv_connent},来自:{client_info}")
        # 如果数据为图片
        if recv_connent == "图片":
            # 给一个当前目录的图片路径
            file_image = "0824de2cade4c0288bb040a262737d9.jpg"

            fhead = struct.pack(b'128sq', bytes(os.path.basename(file_image), encoding="utf-8"),
                                  os.stat(file_image).st_size)
            # 向客户端发送图片名
            client_socket.send(fhead)
            # 读取二进制数据
            fp = open(file_image, 'rb')
            while True:
                # 读取并赋值data
                data = fp.read(1024)
                if not data:
                    print("{0} send over....".format(file_image))
                    break
                # 向客户端发送图片数据
                client_socket.send(data)
        # 如果客户端发送的数据为end
        elif recv_connent == "end":
            # 向客户端发送end并加密,表示结束
            client_socket.send("end".encode("gbk"))
            print("断开连接")
            break
        else:
            client_socket.send("你好,我是菜狗!".encode('gbk'))


def handler(server_socket):
    while True:
        # 接收客户端发送过来的数据
        # 内容            客户端地址
        client_socket, client_info = server_socket.accept()
        # 创建多线程并指定线程函数给函数传参
        t1 = Thread(target=recv_data, args=(client_socket, client_info))
        # 启动线程,并执行目标函数
        t1.start()
        # 使主线程执行完,继续进行下一次循环
        t1.join()


if __name__ == '__main__':
    # 创建套接字
    server_socket = socket(AF_INET, SOCK_STREAM)
    # 绑定地址端口
    server_socket.bind(("172.20.10.3", 8888))
    # 设置最大连接次数
    server_socket.listen(5)
    print("等待连接")
    handler(server_socket)
    # 关闭连接
    server_socket.close()



Guess you like

Origin blog.csdn.net/weixin_72059344/article/details/131742002