python 利用socket 实现udp文件传输

tcp进行文件传输看这里–python 实现TCP文件接发

UDP实现文件传输

这里实现的接收方一直接收,发送方每次发送一个文件,方便我在其他函数中调用发送文件。

使用udp 容易出现丢包现象需要处理

要注意 tcp 和udp的套接字不一样

# udp:
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# tcp
tcp_socketr = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

1、发送

# import socket
# import tqdm
# import os
# import threading
#
# # 由客户端向服务器传数据,文件

import threading
import socket
import tqdm
import os
import cv2
from time import ctime, sleep

def send(address, filename):

    # 传输数据间隔符
    SEPARATOR = '<SEPARATOR>'
    # 服务器信息
    host, port = address

    # 文件缓冲区
    Buffersize = 4096*10
    # 传输文件名字
    filename = filename
    # 文件大小)
    file_size = os.path.getsize(filename)
    # 创建socket链接
    s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    print(f'服务器连接中{host}:{port}')
    s.connect((host, port))
    print('与服务器连接成功')

    # 发送文件名字和文件大小,必须进行编码处理
    # s.sendto(f'{filename}{SEPARATOR}{file_size}'.encode(), ("127.0.0.1", 1234))
    s.send(f'{filename}{SEPARATOR}{file_size}'.encode('utf-8'))

    # 文件传输
    progress = tqdm.tqdm(range(file_size), f'发送{filename}', unit='B', unit_divisor=1024)


    with open(filename, 'rb') as f:
        # 读取文件
        for _ in progress:
            bytes_read = f.read(Buffersize)
            # print(bytes_read)
            if not bytes_read:
                print('exit退出传输,传输完毕!')
                s.sendall('file_download_exit'.encode('utf-8'))
                break
            # sendall 确保络忙碌的时候,数据仍然可以传输
            s.sendall(bytes_read)
            progress.update(len(bytes_read))
            sleep(0.001)

    # 关闭资源
    s.close()




if __name__ == '__main__':
    address = ('127.0.0.1', 1234)
    # host = '127.0.0.1'
    # port = 1234
    filename = input('请输入文件名:')
    t = threading.Thread(target=send, args=(address, filename))
    t.start()
    # received(address, filename)

2、接收

import socket
import tqdm
import os
import threading

# 使用UDP传输视频,全双工,但只需一方接,一方收即可

# 设置服务器的ip和 port
# 服务器信息
# sever_host = '127.0.0.1'
# sever_port =1234

def recvived(address, port):

    # 传输数据间隔符
    SEPARATOR = '<SEPARATOR>'
    # 文件缓冲区
    Buffersize = 4096*10

    while True:
        print('准备接收新的文件...')

        udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
        udp_socket.bind((address, port))
        recv_data = udp_socket.recvfrom(Buffersize)
        recv_file_info = recv_data[0].decode('utf-8')  # 存储接收到的数据,文件名
        print(f'接收到的文件信息{recv_file_info}')
        c_address = recv_data[1]  # 存储客户的地址信息
        # 打印客户端ip
        print(f'客户端{c_address}连接')
        # recv_data = udp_socket.recv()
        # 接收客户端信息
        # received = udp_socket.recvfrom(Buffersize).decode()
        filename ,file_size = recv_file_info.split(SEPARATOR)
        # 获取文件的名字,大小
        filename = os.path.basename(filename)
        file_size = int(file_size)


        # 文件接收处理
        progress = tqdm.tqdm(range(file_size), f'接收{filename}', unit='B', unit_divisor=1024, unit_scale=True)

        with open('8_18_'+filename,'wb') as f:
            for _ in progress:
                # 从客户端读取数据

                bytes_read = udp_socket.recv(Buffersize)
                # 如果没有数据传输内容
                # print(bytes_read)
                if bytes_read == b'file_download_exit':
                    print('完成传输!')
                    print(bytes_read)
                    break
                # 读取写入
                f.write(bytes_read)
                # 更新进度条
                progress.update(len(bytes_read))
        udp_socket.close()

if __name__ == '__main__':

    # address = ("127.0.0.1", 1234)
    port = 1234
    address = "127.0.0.1"
    t = threading.Thread(target=recvived, args=(address, port))
    t.start()
    # send(address)



  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Python Socket 文件传输是指使用Python Socket编程实现文件的传输。通过Python Socket编程,可以实现在网络上进行文件的传输,包括文件的发送和接收。在Python Socket编程中,可以使用TCPUDP协议进行文件传输。其中,TCP协议是面向连接的协议,可以保证数据的可靠传输,而UDP协议则是无连接的协议,传输速度较快,但不保证数据的可靠传输。通过Python Socket编程实现文件传输,可以实现不同计算机之间的文件共享,方便快捷。 ### 回答2: Pythonsocket库是实现网络通信最常用的库之一。通过socket库,我们可以使用TCPUDP等协议建立客户端和服务器之间的连接,实现数据传输和交互。在Python中,通过socket实现文件传输的方法也非常简单。 要实现文件传输,我们可以使用TCP协议,具体包括以下步骤: 1. 服务器端使用socket函数创建一个TCP套接字,并绑定IP地址和端口号。然后调用listen方法监听连接请求。 2. 客户端使用socket函数创建一个TCP套接字,并调用connect方法连接服务器的IP地址和端口号。 3. 服务器端调用accept方法接收连接请求,并返回一个新的socket对象和连接的客户端地址。 4. 客户端调用send方法发送要传输的文件数据,服务器端调用recv方法接收数据。可以先发送文件名或文件长度等信息,然后根据信息大小来逐个读取文件块并发送。 5. 服务器端接收完数据后,可以将文件写入本地磁盘并关闭连接。 6. 客户端发送完数据后,可以调用close方法关闭连接。 下面是一个基本的示例代码: 服务器端: ``` import socket HOST = '' PORT = 50007 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind((HOST, PORT)) s.listen(1) conn, addr = s.accept() with conn: print('Connected by', addr) data = conn.recv(1024) with open('received_file', 'wb') as f: while data: f.write(data) data = conn.recv(1024) print('File received') ``` 客户端: ``` import socket HOST = 'localhost' PORT = 50007 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((HOST, PORT)) with open('file_to_send', 'rb') as f: data = f.read(1024) while data: s.send(data) data = f.read(1024) print('File sent') ``` 注意事项: 1. 数据传输过程中文件数据容易被破坏或者被篡改,因此在实际使用中应该对数据进行加密和校验。 2. 在传输大文件时,应该分块多次传输,并且在传输内容中包含每个块的信息,以便在传输中断时可以使用断点续传。 总之,Pythonsocket库为我们提供了便利的网络通信功能,可以轻松实现文件传输功能。但是需要注意数据的安全性和可靠性,以保证传输数据的完整性和正确性。 ### 回答3: Python Socket 文件传输 Python Socket 是一种基于网络编程的方式,可以用来进行丰富多彩的网络通讯操作。在 Python 中,我们可以使用 Socket 来完成文件的传输。 下面,我们来看一下具体的操作步骤: 1. 创建服务端 首先,我们需要创建一个服务端实例。在 Python 代码中,我们可以使用 socket.socket() 方法来创建 Socket 实例。如下: ``` import socket from threading import Thread server = socket.socket() server.bind(('0.0.0.0', 8000)) server.listen(5) ``` 在上面的代码中,我们首先导入 socket 和 threading 模块,并创建了一个 Socket 实例 server。使用 server.bind() 方法将 Socket 绑定到本地 ip 地址和端口号 8000 上,并使用 server.listen(5) 来启动服务端并监听客户端连接。 2. 创建客户端 接下来,我们需要创建客户端实例。同样,我们可以使用 socket.socket() 方法来创建 Socket 实例。如下: ``` client = socket.socket() client.connect(('服务器的ip地址', 8000)) ``` 在上面的代码中,我们创建了一个 Socket 实例 client,并使用 client.connect() 方法将客户端连接到服务端。 3. 文件传输 当客户端成功连接到服务端之后,我们就可以开始进行文件的传输了。在 Python 中,我们可以使用文件管道方式来进行文件的传输。具体的操作代码如下: ``` def handle(client): fileobj = client.makefile(mode='rb') line = fileobj.readline() filename = line.strip().decode() filedata = fileobj.read() with open(filename, 'wb') as f: f.write(filedata) print('文件传输完成') while True: client_, addr = server.accept() t = Thread(target=handle, args=(client_,)) t.start() ``` 在上面的代码中,我们使用了 makefile() 方法创建一个新的文件对象 fileobj,并指定文件打开模式为 'rb'。然后,我们从连接的客户端读取第一行,获取需要传输的文件名。接下来,我们从 fileobj 中读取文件数据,并将其写入指定的文件中。当文件传输完成后,我们会在控制台输出一个提示信息。 总结: 以上就是 Python Socket 文件传输的具体操作步骤。在实际开发中,我们还需要考虑如何处理各种异常情况,以确保文件传输的安全性和稳定性。同时,在文件传输过程中,我们还需要注意数据加密和网络安全等方面。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值