服务器向客户端发送图片

【服务器】

1.导入需要的包

import os
import struct
from socket import *
from threading import Thread

2.创建套接字,监听端口,建立连接

if __name__ == '__main__':
    # 建立套接字
    server_socket = socket(AF_INET , SOCK_STREAM)
    # 本机监听端口
    server_socket.bind(("192.168.9.126" , 1112))
    server_socket.listen(5)
    print("等待连接。。。")
    handler(server_socket)
    server_socket.close()

3.处理客户端请求

def handler(server_socket):
    while True:
        # 接受客户端连接请求,返回客户端套接字对象和客户端地址信息
        client_socket, client_info = server_socket.accept()

        # 创建一个线程,并将客户端套接字对象和客户端地址信息作为参数传递给recv_data函数
        t1 = Thread(target=recv_data, args=(client_socket, client_info))

        # 启动线程
        t1.start()

        # 等待线程t1结束
        t1.join()

4.对客户端信息进行判断如果是图片进行图片的打包与发送

def recv_data(client_socket , client_info):
    while True:
        # 最大接收1024字符
        recv_data = client_socket.recv(1024)
        recv_content = recv_data.decode("gbk")
        print(f"客户端信息:{recv_content},来自:{client_info}")
        if recv_content == "图片":
            filepath = "826155566257832172.png"
            fhead = struct.pack(b'128sq',bytes(os.path.basename(filepath),encoding="utf-8"),
                                os.stat(filepath).st_size) #图片以128ssq格式打包
            client_socket.send(fhead)

            fp = open(filepath , 'rb')  #打开传输的图片
            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'))

完整代码展示:

# 服务端

import os
import struct
from socket import *
from threading import Thread

def recv_data(client_socket , client_info):
    while True:
        # 最大接收1024字符
        recv_data = client_socket.recv(1024)
        recv_content = recv_data.decode("gbk")
        print(f"客户端信息:{recv_content},来自:{client_info}")
        if recv_content == "图片":
            filepath = "826155566257832172.png"
            fhead = struct.pack(b'128sq',bytes(os.path.basename(filepath),encoding="utf-8"),
                                os.stat(filepath).st_size) #图片以128ssq格式打包
            client_socket.send(fhead)

            fp = open(filepath , 'rb')  #打开传输的图片
            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)
    # 本机监听端口
    server_socket.bind(("192.168.9.126" , 1112))
    server_socket.listen(5)
    print("等待连接。。。")
    handler(server_socket)
    server_socket.close()

【客户端】

1.导入需要的包

import os
import struct
from socket import *
from threading import Thread

2.创建套接字进行连接

if __name__ == '__main__':
    client_socket = socket(AF_INET , SOCK_STREAM)
    client_socket.connect(("192.168.9.90" ,8888))
    t2 = Thread(target=send_data)
    t2.start()
    t2.join()
    client_socket.close()

3.进行消息发送提出需求

def send_data():
    while True:
        msg = input(">")
        client_socket.send(msg.encode("gbk"))
        deal_image(client_socket)
        if msg == "end":
            print('结束信息发送')
            break

4.接收服务器发送的图片进行图片处理

def deal_image(sock):
    while True:
        fileinfo_size = struct.calcsize('128sq')
        buf = sock.recv(fileinfo_size)       # 接收图片名
        if buf:   #进行判断是否拿到图片
            filename , filesize = struct.unpack('128sq',buf) #以128sq进行图片解压
            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:   #循环条件
                if filesize - recvd_size > 1024 :   # 判断剩余图片数据是否满足1024
                    data = sock.recv(1024)     # 进行赋值
                    recvd_size += len(data)    # 传入数据
                else:                          
                    data = sock.recv(1024)     # 将剩余数据直接传入
                    recvd_size = filesize      
                fp.write(data)                 #写入文件
            print("weite over ...")
            fp.close()                        # 关闭文件
        sock.close()                          # 关闭套接字
        break                                 # 结束循环

完整代码展示:

# 客户端

import os
import struct
from socket import *
from threading import Thread

def deal_image(sock):
    while True:
        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
            fp = open(new_filename , 'wb')
            while not recvd_size == filesize:
                if filesize - recvd_size > 1024 :
                    data = sock.recv(1024)
                    recvd_size += len(data)
                else:
                    data = sock.recv(1024)
                    recvd_size = filesize
                fp.write(data)
            print("weite over ...")
            fp.close()
        sock.close()
        break

def send_data():
    while True:
        msg = input(">")
        client_socket.send(msg.encode("gbk"))
        deal_image(client_socket)
        if msg == "end":
            print('结束信息发送')
            break



if __name__ == '__main__':
    client_socket = socket(AF_INET , SOCK_STREAM)
    client_socket.connect(("192.168.9.90" ,8888))
    t2 = Thread(target=send_data)
    t2.start()
    t2.join()
    client_socket.close()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值