作业:
编写cs架构的软件,实现客户端可以下载服务端的文件,如图片、视频、文本等
选做:
1、实现上传,下载功能 实现
2、服务端支持并发 实现
3、阿里云服务器应用 设置服务端的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("客户端发来的消息:
", 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("客户端发来的消息:
", 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()