Python使用socket实现文件传输

一、环境说明

  • Centos7.6 上测试使用
系统环境Python版本目标
CentOS 7.6python 2.7.5实现文件传输

思路:

  • 分为server端和client端,client端发送,server端接收
  • client端发送文件名,文件数据;server端接收文件名和文件数据

不足:

  • 未实现加密传输
  • 没有加入校验机制,需要文件传输完成后手动校验文件是否一致

二、代码

  1. socket_client.py
#!/usr/bin/python
# _*_ coding: UTF-8 _*_

import socket
import time, os, base64, os.path
import argparse

def SendFile(s, filename):
    print('Sending %s' % filename)
    s.sendall('filename:%s::::' % filename)
    f = open(dirname + filename, 'rb')
    while True:
        chunk = f.read(chunksize)
        if not chunk:
            f.close()
            print('%s Successfully Sent %s\n' %(time.ctime(), filename))
            break
        s.sendall(chunk)
    time.sleep(1)
    s.sendall('EOF')
    s.close()

def main(dirname, IP, Port, MB = 16):
    print('main function is start!')
    for filename in os.listdir(dirname):
        if os.path.isfile(dirname + filename):
            print filename
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.connect((IP, Port))
            SendFile(s, filename)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Manual to the script')
    parser.add_argument('-d',type=str,default='/opt/test/',help='input directory')
    parser.add_argument('--host',type=str,required=True,help='input connecting host\'s ip')
    parser.add_argument('-p',type=int,required=True,help='input host port')
    args = parser.parse_args()
    dirname = args.d
    IP = args.host
    Port = args.p
    MB = 16
    chunksize = int(MB*1024*1024)
    main(dirname, IP, Port, MB)
  1. socket_server.py
#!/usr/bin/python
# _*_ coding: UTF-8 _*_

import socket, time, os, base64, re
import argparse

def main(IP, Port, log):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((IP, Port))
    s.listen(12)
    print 'Listened on ', IP, Port
    reg = re.compile('filename:(.*?)::::')

    while True:
        conn, addr = s.accept()
        print(time.ctime(), 'Connected from ', addr)
        recvd = conn.recv(1024)
        if  recvd:
            ss = reg.findall(recvd)
            filename = ss[0]
            f = open(filename, 'wb')
            while True:
                data = conn.recv(1024)
                if not data:
                    break
                if data == 'EOF':
                    f.close()
                    log.write('%s Received %s\n'%(time.ctime(), filename))
                    log.flush()
                else:
                    f.write(data)
                    f.flush()
            conn.close()
    s.close()


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='Manual to the script')
    parser.add_argument('--host',type=str,default='localhost',help='input listening host')
    parser.add_argument('-p',type=int,required=True,help='input listening host\'s port')
    args = parser.parse_args()
    IP = args.host
    Port =args.p
    log = open('log.txt','w+')
    main(IP, Port, log)

三、测试

两台机器:192.168.0.21 和 192.168.0.27

21作client端,27作server端

27上监听:

python socket_server.py --host '192.168.0.27' -p 12345

在这里插入图片描述

21上连接:

python socket_client.py -d '/root/test/' --host '192.168.0.27' -p 12345

在这里插入图片描述

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现Python使用socket传输指定文件,可以按照以下步骤进行操作。 首先,需要创建一个服务器端和一个客户端。服务器端代码如下所示: ```python import socket server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(("127.0.0.1", 8000)) server.listen(3) while True: sock, addr = server.accept() data = sock.recv(1024) print(data.decode("utf8") + "\n") if data.decode("utf8") == "111": print("dsfaf") server.close() sock.close() ``` 客户端代码如下所示: ```python import socket import struct import os client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(("127.0.0.1", 3008)) filepath = "1.png" size = os.stat(filepath).st_size f = struct.pack("l", os.stat(filepath).st_size) client.send(f) img = open(filepath, "rb") client.sendall(img.read()) img.close() client.close() ``` 在客户端代码中,首先连接到服务器端,然后打开要传输的文件,并将文件内容发送给服务器端。 在服务器端代码中,首先创建一个socket对象,并绑定到指定的IP地址和端口号。然后通过调用`listen()`方法开始监听客户端的连接请求。在一个无限循环中,使用`accept()`方法接受客户端的连接,并接收客户端发送的数据。根据接收到的数据进行相应的处理。 需要注意的是,服务器端和客户端的IP地址和端口号需要保持一致,以确保能够正确建立连接和传输数据。 以上就是使用Python实现socket指定文件传输的方法。 #### 引用[.reference_title] - *1* *2* *3* [python socket传输大文件的方法](https://blog.csdn.net/sirobot/article/details/121831235)[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 ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值