前两天学习了网络编程和数据持久化,懵懵懂懂,但是现在弄懂了!作业写得不太好,但是我觉得还是可以冲一冲的!
加上上班的原因,时间也不太够用,博客都没时间更新。
作业一 客户端案例
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 等待修复
评论 (0)