python创建tftp server

# -*- coding: utf-8 -*-

"""
Time:     2022.01.17
Author:   Athrunsunny
Version:  V 0.1
File:     tftpServer.py
Describe:
"""
from socket import *
import struct


class TFTPServer:
    _DOWNLOAD = 1
    _UPLOAD = 2
    _DATA = 3
    _ACK = 4
    _ERROR = 5

    def __init__(self):
        self.serverSocket = socket(AF_INET, SOCK_DGRAM)
        self.serverSocket.bind(("", 69))

    def run(self):
        while True:
            print("Wait for client")
            self.listen()

            if self.cmdType == self._DOWNLOAD:
                self.download()
            elif self.cmdType == self._UPLOAD:
                self.upload()

    def listen(self):
        # 等待client链接
        self.recvData, self.recvAddr = self.serverSocket.recvfrom(1024)
        self.cmdType = struct.unpack("!H", self.recvData[:2])[0]

    # 客户端请求下载
    def download(self):
        # 新建随机端口
        udpSocket = socket(AF_INET, SOCK_DGRAM)
        fileReq = None
        try:
            fileReqName = self.recvData[2:-7].decode()
            print("client download file :%s" % fileReqName)
            try:
                fileReq = open(fileReqName, "rb")
            except:
                print("file %s does not exit" % fileReqName)
                errInfo = struct.pack("!HHHb", 5, 5, 5, 0)
                udpSocket.sendto(errInfo, self.recvAddr)
                return False
            frameNum = 1

            while True:
                fileData = fileReq.read(512)
                # 打包
                frameData = struct.pack(str("!HH"), 3, frameNum) + fileData
                # 发送
                for i in range(0, 3):
                    udpSocket.sendto(frameData, self.recvAddr)
                    if len(fileData) < 512:
                        print("file send done")
                        fileReq.close()
                        fileReq = None
                        return True

                    # 等待client响应
                    self.recvData, self.recvAddr = udpSocket.recvfrom(1024)
                    cmdType, recvFrameNum = struct.unpack("!HH", self.recvData[:4])
                    if cmdType == self._ACK and recvFrameNum == frameNum:
                        break
                    elif i == 3:
                        print("link error")
                        errInfo = struct.pack("!HHHb", 5, 5, 5, 0)
                        udpSocket.sendto(errInfo, self.recvAddr)
                        exit()
                frameNum += 1
        finally:
            if fileReq is not None:
                fileReq.close()

    # 客户端请求上传
    def upload(self):
        # 新建随机端口
        udpSocket = socket(AF_INET, SOCK_DGRAM)
        ack = struct.pack("!HH", self._ACK, 0)
        udpSocket.sendto(ack, self.recvAddr)
        fileReqName = self.recvData[2:-7].decode()
        recvFrameNum = 1
        while True:
            recvData, recvAddr = udpSocket.recvfrom(1024)
            # 数据帧
            cmdType, frameNum = struct.unpack("!HH", recvData[:4])
            if cmdType == self._DATA and frameNum == recvFrameNum:
                # 打开文件
                if frameNum == 1:
                    fileRecv = open(fileReqName, "ab")
                fileRecv.write(recvData[4:])

                # 响应
                ack = struct.pack("!HH", self._ACK, frameNum)
                udpSocket.sendto(ack, recvAddr)
                if len(recvData) < 516:
                    fileRecv.close()
                    fileRecv = None
                    print("done")
                    break
                recvFrameNum += 1
            elif cmdType == self._ERROR:
                print("client link error")
                break


if __name__ == "__main__":
    server = TFTPServer()
    server.run()

client端的创建可以见另一篇博文:python创建tftp client_athrunsunny的博客-CSDN博客 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
下面是一个使用Python创建SQL Server连接池的示例代码: ```python import pyodbc from queue import Queue from threading import Lock class SQLServerConnectionPool: def __init__(self, server, database, username, password, max_connections=5): self.server = server self.database = database self.username = username self.password = password self.max_connections = max_connections self.connection_queue = Queue(maxsize=max_connections) self.lock = Lock() self._create_connections(max_connections) def _create_connections(self, max_connections): for i in range(max_connections): connection = pyodbc.connect(f"Driver={{SQL Server}};Server={self.server};Database={self.database};UID={self.username};PWD={self.password}") self.connection_queue.put(connection) def get_connection(self): connection = self.connection_queue.get() return connection def release_connection(self, connection): self.connection_queue.put(connection) def close_all_connections(self): with self.lock: while not self.connection_queue.empty(): connection = self.connection_queue.get() connection.close() ``` 这个类的构造函数接收SQL Server的服务器名、数据库名、用户名和密码,以及最大连接数。它使用Python标准库中的队列(Queue)来存储连接,并使用锁(Lock)来确保线程安全。在初始化时,它创建max_connections个连接,并将它们放入队列中。当需要连接时,可以使用get_connection方法从队列中获取连接;使用release_connection方法将连接释放回队列中。最后,使用close_all_connections方法可以关闭所有连接并清空队列。 使用此类的示例代码: ```python pool = SQLServerConnectionPool(server='localhost', database='test', username='sa', password='password', max_connections=2) def query_database(): connection = pool.get_connection() cursor = connection.cursor() cursor.execute('SELECT * FROM test_table') rows = cursor.fetchall() pool.release_connection(connection) return rows for i in range(4): print(query_database()) pool.close_all_connections() ``` 在这个示例中,我们创建了一个连接池,最大连接数为2。我们定义了一个query_database函数,它从连接池中获取连接,执行SQL查询,然后释放连接。我们使用循环4次调用此函数,以测试连接池的行为。最后,我们使用close_all_connections方法关闭所有连接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

athrunsunny

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值