Python实现服务端向客户端发送图片

客户端代码

import os  # 导入操作系统模块,用于文件操作
import struct  # 导入struct模块,用于处理字节和数据结构之间的转换
from socket import *  # 导入socket模块,用于网络通信
from threading import Thread  # 导入线程模块,用于多线程处理


def receive_image(sock):
    fileinfo_size = struct.calcsize('128sq')  # 计算接收文件名和文件大小的字节大小
    buf = sock.recv(fileinfo_size)  # 接收图片名
    if buf:
        filename, filesize = struct.unpack('128sq', buf)  # 解析文件名和文件大小
        fn = filename.decode().strip('\x00')  # 将文件名解码并去掉空字符
        new_filename = os.path.join('./', 'client_' + fn)  # 在当前目录下构建新文件名
        recvd_size = 0
        with open(new_filename, 'wb') as fp:  # 以二进制写模式打开文件
            while recvd_size < filesize:
                data = sock.recv(1024)  # 接收数据
                if not data:
                    break
                fp.write(data)  # 写入接收到的数据
                recvd_size += len(data)  # 统计已接收的数据大小
            print('写入完成')
    sock.close()  # 关闭连接


def send_data():
    while True:
        msg = input(">")  # 接收用户输入的消息
        client_socket.send(msg.encode('gbk'))  # 发送消息给服务器
        if msg == "end":
            print("结束发送消息")
            break


if __name__ == '__main__':
    client_socket = socket(AF_INET, SOCK_STREAM)  # 创建客户端套接字对象(IPv4和TCP协议)
    client_socket.connect(("127.0.0.1", 6551))  # 连接指定的服务器 IP 地址和端口号
    t2 = Thread(target=send_data)  # 创建线程,用于发送消息
    t2.start()  # 启动线程
    receive_image(client_socket)  # 接收图片数据
    t2.join()  # 等待线程结束
    client_socket.close()  # 关闭套接字连接

服务端代码

import os  # 导入操作系统模块,用于文件操作
import struct  # 导入struct模块,用于处理字节和数据结构之间的转换
from socket import *  # 导入socket模块,用于网络通信
from threading import Thread  # 导入线程模块,用于多线程处理


def recv_data(client_socket, client_info):
    while True:
        recv_data = client_socket.recv(1024)  # 最大接收1024字节的数据
        recv_content = recv_data.decode("gbk")  # 解码接收到的消息
        print(f"客户端:{recv_content}, 来自:{client_info}")
        if recv_content == "图片":
            filepath = "new_123.jpg"
            fhead = struct.pack(b'128sq', bytes(os.path.basename(filepath), encoding='utf-8'),
                                os.stat(filepath).st_size)  # 将文件名和文件大小以128sq的格式打包
            client_socket.send(fhead)  # 发送文件头信息

            with open(filepath, 'rb') as fp:  # 打开要传输的图片文件
                while True:
                    data = fp.read(1024)  # 读取图片数据
                    if not data:
                        print("{0} send over...".format(filepath))
                        break
                    client_socket.send(data)  # 以二进制格式发送图片数据
        elif recv_content == '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)  # 创建服务器套接字对象(IPv4和TCP协议)
    server_socket.bind(("127.0.0.1", 6551))  # 绑定服务器的IP地址和端口号
    server_socket.listen(5)  # 开始监听客户端连接请求
    print("等待连接!")
    handler(server_socket)  # 处理客户端连接和数据接收
    server_socket.close()  # 关闭服务器套接字连接
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在Python实现WebSocket服务端客户端,可以使用Python websockets库。该库基于asyncio异步IO构建,提供了基于协程的API。 首先,你需要安装websockets库,可以使用pip命令进行安装:pip3 install websockets。 对于服务端实现,你可以创建一个Python文件,并引入websockets和asyncio模块。使用async关键字定义一个async函数,例如叫做handle_client,这个函数将处理客户端连接并处理接收到的消息。在函数内部,使用async with语句创建一个WebSocket服务器对象,传入服务器的地址和端口。然后,使用一个无限循环来等待并处理客户端连接。在循环中,使用await关键字接收客户端发送的消息,并根据需要进行处理。最后,使用await关键字向客户端发送消息。下面是一个简单的示例代码: ```python import asyncio import websockets async def handle_client(websocket, path): async for message in websocket: # 处理接收到的消息 # ... # 发送消息给客户端 response = "Hello, client!" await websocket.send(response) start_server = websockets.serve(handle_client, 'localhost', 8765) asyncio.get_event_loop().run_until_complete(start_server) asyncio.get_event_loop().run_forever() ``` 对于客户端实现,你可以创建一个Python文件,并引入websockets和asyncio模块。使用async关键字定义一个async函数,例如叫做connect_to_server,这个函数将连接到服务器并发送消息。在函数内部,使用async with语句创建一个WebSocket客户端对象,传入服务器的地址和端口。然后,使用await关键字向服务器发送消息,并等待服务器的响应。最后,打印接收到的消息。下面是一个简单的示例代码: ```python import asyncio import websockets async def connect_to_server(): async with websockets.connect('ws://localhost:8765') as websocket: message = "Hello, server!" await websocket.send(message) response = await websocket.recv() print(response) asyncio.get_event_loop().run_until_complete(connect_to_server()) ``` 需要注意的是,以上示例只是一个简单的示例,你可以根据自己的需求进行修改和扩展。另外,确保你的Python版本是大于等于3.6的版本,因为websockets库对于较低版本的Python可能会有兼容性问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值