前两天学习了网络编程和数据持久化,懵懵懂懂,但是现在弄懂了!作业写得不太好,但是我觉得还是可以冲一冲的!
加上上班的原因,时间也不太够用,博客都没时间更新。
作业一 客户端案例
import socket """ 2. 客户端(Client)类 实例属性: + 服务器端口、服务器地址、socket 实例方法: + start 启动服务器方法(创建socket、链接服务器) + recv_file(发送请求、接收文件方法) """ class Client: def __init__(self): self.server_addr = '127.0.0.1' self.server_port = 8888 self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.file_name = None def start(self): self.socket.connect((self.server_addr, self.server_port)) print("链接成功") self.file_name = input("请输入要下载的文件名:") self.recv_file() def recv_file(self): # 发送文件下载请求 self.socket.send(self.file_name.encode()) recv_data = self.socket.recv(1024 * 1024 * 1024) # 以二进制的方式保存文件 with open('[下载]' + self.file_name, mode='ab+') as f: f.write(recv_data) client = Client() client.start()
作业二 服务端实例
import os import socket """ 1. 服务器(Server)类 实例属性: + 端口、地址、socket 实例方法: - start 启动服务器方法(创建socket、绑定端口、提供服务) - handle_recv 处理客户端请求 - send_file(发送文件方法) """ class Server: """ 服务器类 """ def __init__(self): """实例属性:+ 端口、地址、socket""" self.port = 7788 self.id = '127.0.0.1' self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) def handle_recv(self, connection): """处理请求,判断文件是否存在""" recv_data = connection.recv(1024) file_name = recv_data.decode() if os.path.isfile(file_name): return True, file_name else: return False, file_name def send_file(self, connection, flag, filename): # 如果文件存在 if flag: # 以二进制的方式读取文件 with open(filename, mode='rb') as f: content = f.read() connection.sendall(content) else: connection.sendall('文件不存在,请检查文件名是否正确'.encode()) def start(self): """ 启动服务器 """ # 绑定端口 self.socket.bind(('0.0.0.0', 8888)) # 启用监听 self.socket.listen(10) print('[Server] 服务器正在运行......') # 开始侦听 while True: connection, address = self.socket.accept() print('[Server] 收到一个新连接', connection.getsockname()) # handle_recv 处理客户端请求 flag, filename = self.handle_recv(connection) # send_file(发送文件方法) self.send_file(connection, flag, filename) server = Server() server.start()
作业三 数据持久化版服务端
这个是我写的 但是实力不够 未能实现,以后学完mysql再做修改。
""" 第四次作业可以Server可以发送文件,但是不会记录信息 要求:继承自第四次作业的server类,改写出下面功能 新增类方法 `download_log` 记录客户端的请求的 `ip` 与 `port` 与文件名,并将数据保存 excel、json、csv。 提示:类方法只做记录工作。 (能力强的可以尝试保存到sqlite) """ from server import server import pymysql class ServerLog(server): user_ip_port, file_name = [], [] @classmethod def download_log(cls, connection, flag, filename, address): i = cls.send_file(connection, flag, filename) if i: ServerLog.user_ip_port.append(address) ServerLog.file_name.append(filename) cls.sql_write() def __init__(self): self.db = pymysql.connect("10.0.0.2:3307", "python", "python123", "Python") self.curcor = self.db.cursor() def sql_loader(self): sql = "INSERT INTO TCPSERVERLOG (IP_PORT,FILENAME) VALUES ('{}','{}');".format(ServerLog.user_ip_port[-1], ServerLog.file_name[-1]) return sql def sql_write(self): sql = self.sql_loader() try: self.cursor.execute(sql) self.db.commit() except: self.db.rollback() def send_file(self, connection, flag, filename): # 如果文件存在 if flag: # 以二进制的方式读取文件 with open(filename, mode='rb') as f: content = f.read() connection.sendall(content) return True # 添加判断 else: connection.sendall('文件不存在,请检查文件名是否正确'.encode()) return False def start(self): """ 启动服务器 """ # 绑定端口 self.socket.bind(('0.0.0.0', 8888)) # 启用监听 self.socket.listen(10) print('[Server] 服务器正在运行......') # 开始侦听 while True: connection, address = self.socket.accept() print('[Server] 收到一个新连接', connection.getsockname()) # handle_recv 处理客户端请求 flag, filename = self.handle_recv(connection) # send_file(发送文件方法) ServerLog.download_log(connection, flag, filename, address) # 把address传给楼上用 server = ServerLog() server.curcor.execute( '''CREATE TABLE maoyan(ID INT PRIMARY KEY NOT NULL,IP_PORT CHAR(50),FILENAME CHAR(50));''') server.start() server.db.close() # 数据库表创建BUG 等待修复
退出登录?