zoukankan      html  css  js  c++  java
  • 作业 选做

    作业:
    编写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()
    
  • 相关阅读:
    HTML5元素标记释义
    Mvc使用Partial View 来封装上传控件
    订单页过滤,sql写法
    防止提交重复订单的方法
    查询数据库所有列
    asp.net 异常处理
    7. DateTime,TimeSpan
    8.1.thread
    8.2.Task
    2.2. Array
  • 原文地址:https://www.cnblogs.com/pythonwl/p/12762893.html
Copyright © 2011-2022 走看看