cs 架构——socket 传输文件
编写cs架构的软件,实现客户端可以下载服务端的文件,如图片、视频、文本等
阿里云服务器应用 设置服务端的ip为阿里云服务器的私网ip,客户端的ip设置为阿里云服务器公网ip,端口号要一致,注意:阿里云服务器要开
放端口,安全组也要设置。就好了,,,
服务端:
from socket import *
import socketserver
import subprocess
import struct
class Myserver(socketserver.BaseRequestHandler):
def handle(self):
while True:
# try:
data = self.request.recv(1024) # 最大接收的数据量为1024Bytes,收到的是bytes类型
if len(data) == 0:
# 在unix系统洗,一旦data收到的是空
# 意味着是一种异常的行为:客户度非法断开了链接
break
data = data.decode('utf-8')
print(data)
cmd, source, file = data.split(' ')
print(cmd, source, file)
if cmd == 'get':
try:
with open(file, 'rb') as f:
data = f.read()
print(data)
self.request.send(struct.pack('i', len(data)))
self.request.send(data)
print("客户端发来的消息:\n", data.decode('utf-8'))
except Exception:
self.request.send('路径不存在'.encode('utf-8'))
elif cmd == 'up':
try:
data_len = self.request.recv(4)
data_len = struct.unpack('i', data_len)
data_now = 0
print(1)
with open(file, 'wb') as f:
while data_now < data_len[0]:
data_new = self.request.recv(1024)
f.write(data_new)
data_now += len(data_new)
self.request.send('传输完成'.encode('utf-8'))
print("客户端发来的消息:\n", data.decode('utf-8'))
except Exception:
self.request.send('路径不存在'.encode('utf-8'))
else:
self.request.send('命令不正确'.encode('utf-8'))
# except Exception:
# # 针对windows系统
# break
# 6、关闭电话连接conn(必选的回收资源的操作)
self.request.close()
# 7、关机(可选操作) 要实现不断地从半连接池中取出连接请求,服务器不能关闭
# phone.close()
phone = socketserver.ThreadingTCPServer(('127.0.0.1',8083),Myserver)
phone.serve_forever()
# phone=socket(AF_INET,SOCK_STREAM) # 流式协议=》tcp协议
# phone.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加
# phone.bind(('127.0.0.1',8083)) # 0-65535, 1024以前的都被系统保留使用172.17.128.175
# phone.listen(5) # 5指的是半连接池的大小
# 服务端应该做两件事
# 第一件事:循环地从板连接池中取出链接请求与其建立双向链接,拿到链接对象
客户端:
import socket
import struct
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 流式协议=》tcp协议
phone.connect(('127.0.0.1',8083)) # '101.200.80.78''127.0.0.1'
print('下载数据')
while True:
# get 文件路径 保存文件路径
# try:
print('命令有:get,up')
msg=input("命令>>>: ").strip() #msg=''
if len(msg) == 0:continue
pwd,source,file = msg.rsplit(' ')
if pwd == 'get':
phone.send(msg.encode('utf-8'))
top = phone.recv(4)
top_len = struct.unpack('i',top)
print(top_len)
size = 0
try:
with open(file,'wb') as f:
while size < top_len[0]:
data=phone.recv(1024)
f.write(data)
size += len(data)
except Exception:
print('保存路径不存在')
if pwd == 'up':
try:
phone.send(msg.encode('utf-8'))
with open(source,'rb') as f:
data = f.read()
size = len(data)
phone.send(struct.pack('i',size))
phone.send(data)
result = phone.recv(100)
print(result.decode('utf-8'))
except Exception:
print('源文件路径不存在')
# except Exception:
# print('命令可能不正确')
#4、关闭连接(必选的回收资源的操作)
phone.close()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现