作业 选做

作业:
编写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()
原文地址:https://www.cnblogs.com/pythonwl/p/12762893.html