
Python socket上传文件的服务端和客户端实现
发布日期:2021-05-07 21:44:58
浏览次数:21
分类:精选文章
本文共 4444 字,大约阅读时间需要 14 分钟。
socket编程入门及实践指南
socket编程是网络编程中最基础而又最重要的核心技术之一。本文将从基础概念出发,逐步介绍socket编程的实现方法,并提供实践案例。
socket编程基础
socket是计算机网络通信中的核心机制,它类似于内核中的信号门口,负责不同进程之间的通信。socket编程通常涉及客户端和服务器端的实现。
socket客户端
创建socket
import sockets = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.AF_INET
:指定使用IPv4地址族。socket.SOCK_STREAM
:指定使用流式 socket(TCP)。
连接到服务器
s.connect(('127.0.0.1', 6666))
发送数据
s.send(b'Hello, World!')
接收数据
data = s.recv(1024)print(data.decode())
关闭socket
s.close()
socket服务器端
服务器端的实现步骤如下:
创建socket
import socketimport threadings = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)s.bind(('127.0.0.1', 6666))s.listen(10)
接收连接
conn, addr = s.accept()print(f'Connected by {addr}')t = threading.Thread(target=deal_data, args=(conn, addr))t.start()
处理数据
def deal_data(conn, addr): print(f'Accept new connection from {addr}') conn.send(b'Hi, Welcome to the server!') while True: data = conn.recv(1024) if not data: break print(f'{addr} client send data is {data.decode()}') conn.send(b'Hello, {data.decode()}') conn.close()
socket文件传输
文件传输是socket编程中的常见场景之一,通常分为以下几个步骤:
文件传输流程
发送文件信息
发送端首先发送文件的元信息,包括文件名和大小。发送文件内容
按照发送的大小读取文件内容并逐块发送。接收文件
接收端根据接收到的元信息准备接收空间,并将接收到的数据写入文件。发送端代码示例
import socketimport osimport structdef socket_client(): try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('127.0.0.1', 6666)) except socket.error as msg: print(msg) sys.exit(1) print(s.recv(1024).decode()) while True: filepath = input('please input file path: ') if os.path.isfile(filepath): fileinfo_size = struct.calcsize('128sl') fhead = struct.pack('128sl', os.path.basename(filepath), os.stat(filepath).st_size) s.send(fhead) print(f'client filepath: {filepath}') fp = open(filepath, 'rb') while True: data = fp.read(1024) if not data: print(f'{filepath} file send over...') break s.send(data) s.close() break else: print('invalid file path!') s.close()if __name__ == '__main__': socket_client()
接收端代码示例
import socketimport threadingimport osimport structdef socket_service(): try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(('127.0.0.1', 6666)) s.listen(10) except socket.error as msg: print(msg) sys.exit(1) print('Waiting connection...') while True: conn, addr = s.accept() t = threading.Thread(target=deal_data, args=(conn, addr)) t.start() def deal_data(conn, addr): print(f'Accept new connection from {addr}') conn.send(b'Hi, Welcome to the server!') while True: fileinfo_size = struct.calcsize('128sl') buf = conn.recv(fileinfo_size) if buf: filename, filesize = struct.unpack('128sl', buf) filename = filename.strip(b'\x00') new_filename = os.path.join('./', f'new_{filename}') print(f'file new name is {new_filename}, filesize: {filesize}') recvd_size = 0 fp = open(new_filename, 'wb') print('start receiving...') while recvd_size < filesize: if (filesize - recvd_size) > 1024: data = conn.recv(1024) recvd_size += len(data) else: data = conn.recv(filesize - recvd_size) recvd_size = filesize fp.write(data) fp.close() print('end receive...') conn.close() break if __name__ == '__main__': socket_service()
测试与验证
在本地测试
运行service.py
后,打开两个终端窗口分别运行 client.py
。 跨机器测试
将service.py
上传到目标服务器,修改服务端监听地址为目标服务器IP地址,客户端连接地址也修改为目标服务器IP地址。 文件传输测试
在发送端输入文件路径,系统会自动处理文件传输过程。工具推荐
为了更高效地管理多个终端窗口,可以安装终端增强工具 Terminator:
- Ubuntu/Debian:
sudo apt-get install terminator
- CentOS:
yum -y install terminator
注意事项
-
端口冲突
如果服务端启动失败,可能是因为端口被占用。可以在服务端代码中添加s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
来避免端口冲突。 -
网络环境
确保客户端和服务器端位于同一网络中,且防火墙设置允许端口通信。 -
异常处理
在socket操作中,始终使用try-except块处理可能的异常,确保程序健壮性。
通过以上内容,可以逐步掌握socket编程的基础知识,并通过实践案例提升编程能力。
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年04月13日 23时26分41秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
[模板] 带修莫队
2019-03-05
abstract关键字的使用
2019-03-05
算法题:获取一个字符串在另一个字符串中出现的次数
2019-03-05
算法题:获取两个字符串中的最大相同子串
2019-03-05
Asp.Net Core&Jenkins持续交付到Windows Server
2019-03-05
自我总结和学习表单提交的几种方式 (一)
2019-03-05
.NET微信网页开发之使用微信JS-SDK调用微信扫一扫功能
2019-03-05
.NET微信网页开发之使用微信JS-SDK获取当前地理位置
2019-03-05
Android Studio在android Emulator中运行的项目黑屏
2019-03-05
Python写代码的时候为什么要注释?Sun因此被Oracle收购
2019-03-05
JAVA高并发集合详解
2019-03-05
解决Spirng注入时名称下的红色波浪线
2019-03-05
操作系统知识概述
2019-03-05
读懂操作系统(x64)之堆栈帧(过程调用)
2019-03-05
仓储模式到底是不是反模式?
2019-03-05
ASP.NET MVC之JsonResult(六)
2019-03-05
SQL Server之深入理解STUFF
2019-03-05