Python笔记 之 使用socket实现简单的文件传输

使用Python标准库socket模块实现基于服务器,客户端的简单文件下载。

服务端代码

import os,sys,time,_thread,socket

blocksize = 1024
defaultdir = r'/Data/Datas'
defaulthost = ''
defaultport = 5555

def now():
    return time.asctime()

def serverthread(clientsock):
    sockfile = clientsock.makefile('r')
    filename = sockfile.readline()[:-1]
    try:
        file = open(os.path.join(defaultdir,filename),'rb')
        while True:
            bytes = file.read(blocksize)
            if not bytes:
                break
            send = clientsock.send(bytes)
            assert send == len(bytes)
    except:
        print('Error downloading file on server : ',filename)
    clientsock.close()

def server(host=defaulthost,port=defaultport):
    serversock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    serversock.bind((host,port))
    serversock.listen(5)
    while True:
        clientsock,address = serversock.accept()
        print('Server connected by ',address,'at',now())
        _thread.start_new_thread(serverthread,(clientsock,))

if __name__ == '__main__':
    server()

客户端代码

import os,sys,time,socket

blocksize = 1024
defaulthost = '10.10.12.101'
defaultport = 5555

def now():
    return time.asctime()

def client(filename,host=defaulthost,port=defaultport):
    downdir = r'F:/Data/Datas'
    sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    sock.connect((host,port))
    sock.send((filename+'\n').encode())
    filedir = os.path.join(downdir , filename)
    print(filedir)
    file = open(filedir,'wb')
    while True:
        data = sock.recv(blocksize)
        file.write(data)
        if not data:
            break
    sock.close()
    file.close()
    print('Client got ',filename,'at',now())

if __name__ == '__main__':
    while True:
        filename = input('请输入要下载的文件名=>  ')
        client(filename)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python可以使用socket模块来实现文件传输。在客户端和服务器端都需要编写相应的代码来建立连接并传输文件。 在客户端,可以使用socket模块的socket函数创建一个套接字对象,并使用connect函数连接到服务器端的IP地址和端口号。然后,可以使用open函数打开要传输的文件,并使用read函数读取文件数据。接下来,可以使用send函数将文件数据发送给服务器端。最后,使用close函数关闭套接字。 在服务器端,同样使用socket模块的socket函数创建一个套接字对象,并使用bind函数绑定服务器端的IP地址和端口号。然后,使用listen函数监听连接请求,并使用accept函数接受客户端的连接。接下来,可以使用recv函数接收客户端发送的文件数据,并使用write函数将文件数据写入到服务器端的文件中。最后,使用close函数关闭套接字。 需要注意的是,在传输文件时,可以使用struct模块来打包文件的相关信息,如文件名和文件大小,以便在接收端正确地保存文件。 下面是一个示例代码,展示了如何使用socket模块实现文件传输: 客户端client.py: ```python import socket import os import sys import struct def socket_client(): try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('服务器IP地址', 端口号)) except socket.error as msg: print(msg) sys.exit(1) filepath = '要传输的文件路径' if os.path.isfile(filepath): fileinfo_size = struct.calcsize('128sq') fhead = struct.pack('128sq', bytes(os.path.basename(filepath).encode('utf-8')), os.stat(filepath).st_size) s.send(fhead) print('客户端文件路径: {0}'.format(filepath)) with open(filepath, 'rb') as fp: while True: data = fp.read(1024) if not data: print('{0} 文件发送完毕...'.format(filepath)) break s.send(data) s.close() if __name__ == '__main__': socket_client() ``` 服务器端server.py: ```python import socket import os import struct def socket_server(): try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(('服务器IP地址', 端口号)) s.listen(10) except socket.error as msg: print(msg) sys.exit(1) while True: conn, addr = s.accept() print('连接地址:{0}'.format(addr)) while True: fileinfo_size = struct.calcsize('128sq') buf = conn.recv(fileinfo_size) if buf: filename, filesize = struct.unpack('128sq', buf) filename = filename.decode('utf-8').strip('\x00') filename = 'new_' + filename filesize = int(filesize) print('接收的文件名为:{0},文件大小为:{1}'.format(filename, filesize)) with open(filename, 'wb') as fp: while True: data = conn.recv(1024) received_size += len(data) fp.write(data) if received_size >= filesize: break conn.close() break if __name__ == '__main__': socket_server() ``` 请注意,上述代码中的服务器IP地址和端口号需要根据实际情况进行修改。另外,客户端和服务器端的代码需要分别在不同的机器上运行,且需要保证服务器端先运行。 希望对你有帮助! #### 引用[.reference_title] - *1* *2* *3* [Python使用socket传输文件](https://blog.csdn.net/weixin_44219242/article/details/125935964)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值