小陆同学

python 中文名:蟒蛇,设计者:Guido van Rossum

导航

python-局域网内实现web页面用户端下载文件,easy!

好久没有发博客了,但是也没闲着,最近疫情原因一直在家远程办公,分享一下今天的干货

 

先说需求:某个文件压缩之后可以供用户点击下载

没想到特别好的办法,在网上搜索大多都是通过socket实现的,然后我这个好久没写服务端和客户端的家伙开始了奋笔疾书,使劲粘贴,源码附上:

注意!!!启动时:先服务端,后客户端。 关闭时:先客户端后服务端

ps: 说明一下,服务端客户端端口应一致,因为我搞的时候有不正常释放端口的异常,所以频繁切换端口,最后往博客粘的时候出现了不一致端口,想要修改一下的,可是压缩起来的代码编辑时候是点不开的,就很愁哈哈不改了

服务端code:

import socket
import os
def serverSide():

    # 在这里我将os.path的默认路径进行了更改,改到了/mnt/,从/mnt/路径下找文件下载
    os.chdir("/mnt/")
    print(os.getcwd())
    # 创建tcp服务端套接字
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 绑定端口号,ip地址不绑定
    tcp_server_socket.bind(("127.0.0.1", 3344))

    # 程序结束,释放端口号,端口号复用
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

    # 设置监听,把主动套接字变成被动套接字,服务端套接字只负责接收客户端的连接请求
    tcp_server_socket.listen(128)

    while True:
        # 创建信的套接字,等待接收客户端的连接请求
        # clientSide()

        service_client_socket, ip_port = tcp_server_socket.accept()

        print("客户端连接成功了:", ip_port)

        # 接收客户端的请求信息
        file_name_data = service_client_socket.recv(1024)
        print(file_name_data)

        # 对二进制数据进行解码
        file_name = file_name_data.decode("utf-8")
        print(file_name)

        # 判断文件是否存在
        if os.path.exists(file_name):

            # 文件存在
            with open(file_name, "rb") as file:
            # 读取文件数据
             while True:
                # 循环读取文件数据
                file_data = file.read(1024)
                # 表示读到数据
                if file_data:
                    # 然后把数据发送给客户端
                    service_client_socket.send(file_data)
                else:
                    print("请求的文件数据发送完成")
                    break

        else:
            print("您请求下载的文件不存在")

        # 终止和这个客户端服务
        service_client_socket.close()
    # 终止客户端连接请求服务, 服务端的套接字可以不用关闭
    tcp_server_socket.close()

if __name__ == '__main__':
    serverSide()
View Code

 

客户端code:

import socket

def clientSide():
    # serverSide()
    # 创建套接字,AF_INET:ipv4,SOCK_STREAM:TCP协议
    tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 和服务端连接
    tcp_client_socket.connect(("127.0.0.1", 3357))
    # 发送下载文件的请求
    file_name = input("请输入要下载的文件名:")
    # 个人在服务端和客户端都采用utf-8编码
    file_name_data = file_name.encode("utf-8")
    # 发送请求数据
    tcp_client_socket.send(file_name_data)
    # 把数据写入到文件里
    with open('/mnt/' + file_name, "wb") as file:
        while True:
            # 循环接收文件数据
            file_data = tcp_client_socket.recv(1024)
            # 只要接收到数据,就写入
            if file_data:
                file.write(file_data)
                print('====')
            else:
                print("服务端把数据发送完成并关闭了连接")
                break
    # 关闭套接字
    tcp_client_socket.close()

if __name__ == '__main__':
    clientSide()
View Code

 

在把它放到项目中去应用的时候发现每次断开服务之后端口都不能正常释放,所以下一次再调用的时候就是端口占用啦,能耐不够没有解决

 

在下又在网上一通翻找,分享一个python的方法,可以实现局域网内目录文件共享,妙哉。

python2和python3皆可实现

 

1、首先进入你要共享的路径,比如:

cd /data/

 

2、开启共享服务(默认端口是8000,因为我Django项目,避免冲突,手动8888)

# python2
python -m SimpleHTTPServer 8888

# 或者python3
python -m http.server 8888

 

3、访问页面: 开启服务的IP+端口8888,例如:192.168.1.165:8888即可访问/data/目录下的文件,并支持下载

 

=======================================分割线=================================================

 

开启后台运行模式

# 当前终端后台运行
python -m SimpleHTTPServer 8888 &

# 完全后台运行
nohup python -m SimpleHTTPServer 8888 &

 

 

好了,大功告成,差一张成功展示的截图,今天VPN已经没连了,改日再议吧!

最后,天佑中华!世界和平!武汉加油!中国加油

 

posted on 2020-02-12 22:32  小陆同学  阅读(1106)  评论(0编辑  收藏  举报