前两天学习了网络编程和数据持久化,懵懵懂懂,但是现在弄懂了!作业写得不太好,但是我觉得还是可以冲一冲的!

加上上班的原因,时间也不太够用,博客都没时间更新。

作业一 客户端案例

 

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 等待修复