本文目录导读:

Python HTTP服务器(最简单)
Windows/Linux/macOS通用
# file_share.py
import http.server
import socketserver
import os
import sys
def start_share(port=8000, directory=None):
if directory:
os.chdir(directory)
handler = http.server.SimpleHTTPRequestHandler
with socketserver.TCPServer(("", port), handler) as httpd:
print(f"文件共享服务器已启动")
print(f"局域网访问地址: http://{get_local_ip()}:{port}")
print(f"按 Ctrl+C 停止服务")
httpd.serve_forever()
def get_local_ip():
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
s.connect(('10.255.255.255', 1))
ip = s.getsockname()[0]
except Exception:
ip = '127.0.0.1'
finally:
s.close()
return ip
if __name__ == "__main__":
start_share()
运行方式:
# 共享当前目录 python file_share.py # 共享指定目录 python file_share.py --directory /path/to/share --port 8000
Windows内置SMB共享脚本
PowerShell脚本
# setup-smb-share.ps1
param(
[string]$SharePath,
[string]$ShareName = "SharedFolder",
[string]$Description = "局域网共享文件夹"
)
# 以管理员运行
if (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
{
Write-Host "请以管理员身份运行此脚本" -ForegroundColor Red
pause
exit 1
}
# 创建共享文件夹
if (-not (Test-Path $SharePath)) {
New-Item -ItemType Directory -Path $SharePath -Force
Write-Host "创建文件夹: $SharePath" -ForegroundColor Green
}
# 设置Everyone权限
$acl = Get-Acl $SharePath
$permission = "Everyone","FullControl","ContainerInherit,ObjectInherit","None","Allow"
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $permission
$acl.SetAccessRule($accessRule)
Set-Acl $SharePath $acl
# 创建SMB共享
New-SmbShare -Name $ShareName -Path $SharePath -Description $Description -FullAccess Everyone
# 获取本机IP
$ip = (Get-NetIPAddress -AddressFamily IPv4 | Where-Object {$_.InterfaceAlias -like "*Ethernet*" -or $_.InterfaceAlias -like "*Wi-Fi*"}).IPAddress
Write-Host "`nSMB共享已创建!" -ForegroundColor Green
Write-Host "共享路径: \\$ip\$ShareName" -ForegroundColor Yellow
Write-Host "本地路径: $SharePath" -ForegroundColor Cyan
使用方法:
# 以管理员运行 .\setup-smb-share.ps1 -SharePath "C:\SharedFolder" -ShareName "MyShare"
跨平台Python GUI工具
# lan_file_share.py
import tkinter as tk
from tkinter import filedialog, messagebox
import http.server
import socketserver
import threading
import socket
import os
class FileShareApp:
def __init__(self, root):
self.root = root
self.root.title("局域网文件共享工具")
self.root.geometry("400x300")
self.share_folder = tk.StringVar()
self.port = tk.StringVar(value="8000")
self.server = None
self.create_widgets()
def create_widgets(self):
# 选择文件夹
tk.Label(self.root, text="选择共享文件夹:").pack(pady=5)
frame1 = tk.Frame(self.root)
frame1.pack(pady=5)
tk.Entry(frame1, textvariable=self.share_folder, width=30).pack(side=tk.LEFT, padx=5)
tk.Button(frame1, text="浏览", command=self.browse_folder).pack(side=tk.LEFT)
# 端口设置
tk.Label(self.root, text="端口号:").pack(pady=5)
tk.Entry(self.root, textvariable=self.port, width=10).pack()
# 控制按钮
self.start_btn = tk.Button(self.root, text="启动共享", command=self.toggle_share,
bg="green", fg="white", width=20)
self.start_btn.pack(pady=20)
# 状态显示
self.status_label = tk.Label(self.root, text="状态: 未启动", fg="red")
self.status_label.pack(pady=10)
# IP地址显示
self.ip_label = tk.Label(self.root, text=f"本机IP: {self.get_local_ip()}")
self.ip_label.pack(pady=5)
def browse_folder(self):
folder = filedialog.askdirectory()
if folder:
self.share_folder.set(folder)
def get_local_ip(self):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
s.connect(('10.255.255.255', 1))
ip = s.getsockname()[0]
except:
ip = '127.0.0.1'
finally:
s.close()
return ip
def toggle_share(self):
if self.server is None:
self.start_share()
else:
self.stop_share()
def start_share(self):
folder = self.share_folder.get()
if not folder:
messagebox.showerror("错误", "请选择共享文件夹")
return
try:
port = int(self.port.get())
except:
messagebox.showerror("错误", "端口号必须是数字")
return
if not os.path.exists(folder):
messagebox.showerror("错误", "文件夹不存在")
return
# 在新线程中启动服务器
def run_server():
os.chdir(folder)
handler = http.server.SimpleHTTPRequestHandler
self.server = socketserver.TCPServer(("", port), handler)
self.server.serve_forever()
self.server_thread = threading.Thread(target=run_server, daemon=True)
self.server_thread.start()
self.start_btn.config(text="停止共享", bg="red")
self.status_label.config(text=f"状态: 运行中 - http://{self.get_local_ip()}:{port}", fg="green")
def stop_share(self):
if self.server:
self.server.shutdown()
self.server.server_close()
self.server = None
self.start_btn.config(text="启动共享", bg="green")
self.status_label.config(text="状态: 已停止", fg="red")
if __name__ == "__main__":
root = tk.Tk()
app = FileShareApp(root)
root.mainloop()
Linux快速脚本
#!/bin/bash
# fast-share.sh
# 检查参数
if [ $# -lt 1 ]; then
echo "用法: ./fast-share.sh <共享目录> [端口号]"
echo "示例: ./fast-share.sh /home/user/share 8080"
exit 1
fi
SHARE_DIR="$1"
PORT="${2:-8000}"
# 检查目录
if [ ! -d "$SHARE_DIR" ]; then
echo "错误: 目录 $SHARE_DIR 不存在"
exit 1
fi
# 获取本机IP
IP=$(hostname -I | awk '{print $1}')
# 启动Python HTTP服务器
echo "========================================="
echo " 局域网文件共享已启动"
echo " 共享目录: $SHARE_DIR"
echo " 访问地址: http://$IP:$PORT"
echo " 按 Ctrl+C 停止共享"
echo "========================================="
cd "$SHARE_DIR"
python3 -m http.server $PORT --bind 0.0.0.0
使用Python发送文件的简易工具
# send_file.py
import socket
import os
import threading
def send_file(file_path, host='0.0.0.0', port=9999):
"""发送文件到局域网"""
def handle_client(conn, addr):
print(f"客户端连接: {addr}")
try:
file_size = os.path.getsize(file_path)
file_name = os.path.basename(file_path)
# 发送文件名和文件大小
conn.send(f"{file_name}:{file_size}".encode())
# 等待确认
conn.recv(1024)
# 发送文件内容
with open(file_path, 'rb') as f:
while True:
data = f.read(4096)
if not data:
break
conn.send(data)
print(f"文件 {file_name} 发送完成")
except Exception as e:
print(f"发送错误: {e}")
finally:
conn.close()
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((host, port))
server.listen(5)
print(f"文件服务器启动在 {host}:{port}")
print("等待客户端连接...")
while True:
conn, addr = server.accept()
thread = threading.Thread(target=handle_client, args=(conn, addr))
thread.start()
def receive_file(save_dir='.', host='localhost', port=9999):
"""接收文件"""
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((host, port))
# 接收文件名和大小
data = client.recv(1024).decode()
file_name, file_size = data.split(':')
file_size = int(file_size)
# 发送确认
client.send(b'OK')
# 接收文件
save_path = os.path.join(save_dir, file_name)
received = 0
with open(save_path, 'wb') as f:
while received < file_size:
data = client.recv(4096)
if not data:
break
f.write(data)
received += len(data)
print(f"文件 {file_name} 接收完成")
client.close()
if __name__ == "__main__":
import sys
if len(sys.argv) < 2:
print("用法:")
print(" 发送: python send_file.py send <文件路径>")
print(" 接收: python send_file.py receive <保存目录>")
sys.exit(1)
if sys.argv[1] == "send":
send_file(sys.argv[2])
elif sys.argv[1] == "receive":
save_dir = sys.argv[2] if len(sys.argv) > 2 else "."
receive_file(save_dir)
使用说明
- 最简方案:使用Python HTTP服务器,无需安装额外软件
- Windows专用:使用PowerShell SMB共享,性能更好
- 图形界面:适合不熟悉命令行的用户
- 快速传输:使用socket直接传输文件
根据您的需求选择合适的方案即可,最推荐使用Python HTTP服务器方案,因为它简单、跨平台、无需额外软件。