python中使用socket编程实现图片或者其他文件的传输

2022-08-18 09:16:44

客户端:

import os
import cv2
import json
import socket
import threading
#读取文件的最大数
max_len=1024

#端口号和IP地址
remote_PORT=5555
remote_IP='127.0.0.1'
remote_addr=(remote_IP,remote_PORT)

#绑定端口号和IP地址
socket_Client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
socket_Client.connect(remote_addr)

defClient_Send_File(socket_Client,filename):""":param socket: 客户端套接字:param filename: 要传输的文件:param root:主窗口:return:"""
    #首先将消息头发送至服务端
    file,class_file=os.path.splitext(filename)
    #获取文件大小#file_size=os.path.getsize(filename)
    file_Size=os.stat(filename).st_size
    msg_header={'filename':file,'msg_type':class_file,'msg_len':file_Size}
    msg_header_bytes=bytes(json.dumps(msg_header),encoding='utf-8')
    #当消息头的长度不满1024时,使用空格填充
    msg_header_bytes+=b''*(max_len-len(msg_header_bytes))
    socket_Client.send(msg_header_bytes)
    file_len=0
    recv_count=0
    #发送的文件头大小print('msg_header_bytes: {}'.format(len(msg_header_bytes)))
    #发送的文件大小print('file_size: {}'.format(file_Size))
    withopen(filename,'rb') as fp:while file_len!=file_Size:
            message=fp.read(max_len)
            socket_Client.send(message)
            file_len+=len(message)print(file_len)
            recv_count+=1print('发送次数: {}'.format(recv_count))

    socket_Client.close()print('发送完成...')if __name__=='__main__':print('Pycharm')
    #第二个参数为图片或者其他文件的路径Client_Send_File(socket_Client,'hometown.jpg')

服务端:


import cv2
import os
import json
import socket
import threading
#读取文件的最大数
max_len=1024

#端口号和IP地址
remote_PORT=5555
remote_IP='127.0.0.1'
remote_addr=(remote_IP,remote_PORT)

#绑定IP地址和端口号PORT
socket_Server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
socket_Server.bind(remote_addr)

#监听
socket_Server.listen()print('正在监听来自客户端的消息......')

defServer_Recv_File(socket):""":param socket: 服务端套接字:param root: 主窗口:return:"""
    #获取客户端发送的消息头
    msg_header=socket.recv(max_len)
    header=json.loads(msg_header.decode('utf-8'))
    #输出客户端发送的消息头信息print(header)
    #保存接收文件的地方
    curr_path=os.getcwd()
    filename=curr_path+'\\recv_'+header['filename']+header['msg_type']
    get_file_Size=header['msg_len']
    file_size=0
    #输出文件名和文件大小print('文件名: {}'.format(filename))print('file_size: {}'.format(get_file_Size))
    recv_count=0
    #如果文件不存在则创建if os.path.exists(filename)==False:
        withopen(filename,'wb') as fp:while file_size!=get_file_Size:
                message=socket.recv(max_len)
                fp.write(message)
                file_size+=len(message)print(file_size)
                recv_count+=1else:
        withopen(filename,'wb') as fp:while file_size!= get_file_Size:
                message= socket.recv(max_len)
                fp.write(message)
                file_size+=len(message)print(file_size)
                recv_count+=1print('接收次数: {}'.format(recv_count))
    socket.close()print('接收完成...')if __name__=='__main__':print('Pycharm')
    new_socket,addr=socket_Server.accept()Server_Recv_File(new_socket)
  • 作者:Keep_Trying_Go
  • 原文链接:https://mydreamambitious.blog.csdn.net/article/details/123161776
    更新时间:2022-08-18 09:16:44