Login
网站首页 > 文章中心 > 其它

数据库:socketserver模块、MySQL_一)

作者:小编 更新时间:2023-09-20 14:14:25 浏览量:267人看过

第一段:socketserver实现并发

基于tcp的套接字,关键就是两个循环,一个链接循环,一个通信循环.

socketserver模块中分两大类:server类(解决链接问题)和request类(解决通信问题)

server类:

数据库:socketserver模块、MySQL_一)

request类:

数据库:socketserver模块、MySQL_一)-图1

数据库:socketserver模块、MySQL_一)

继承关系:

数据库:socketserver模块、MySQL_一)

数据库:socketserver模块、MySQL_一)

以下述代码为例,分析socketserver源码:

ftpserver=socketserver.ThreadingTCPServer(('12⑦0.0.1',8080),FtpServer)

BaseServer

实例化得到ftpserver,先找类ThreadingTCPServer的__init__,在TCPServer中找到,进而执行server_bind,server_active

找ftpserver下的serve_forever,在BaseServer中找到,进而执行self._handle_request_noblock(),该方法同样是在BaseServer中

执行self._handle_request_noblock()进而执行request, client_address = self.get_request()(就是TCPServer中的self.socket.accept()),然后执行self.process_request(request, client_address)

在ThreadingMixIn中找到process_request,开启多线程应对并发,进而执行process_request_thread,执行self.finish_request(request, client_address)

源码分析总结:

基于tcp的socketserver我们自己定义的类中的

self.server即套接字对象

self.request即一个链接

基于udp的socketserver我们自己定义的类中的

import os
import time
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
import socket
import selectors

class selectFtpServer:

    self.dic = {}
    self.hasReceived=0
    self.sel = selectors.DefaultSelector()
    server = socket.socket()
    server.bind(("12⑦0.0.1",8885))
    server.listen(5)
    print("服务端已开启,等待用户连接...")

    while True:
        events = self.sel.select()
        for key, mask in events:
            callback = key.data
    conn, addr = sock.accept()
    print("from %s %s connected"%addr)
    self.dic[conn] = {}

    try:
        if not self.dic[conn] :

            data = conn.recv(1024)
            cmd,filename,filesize = str(data, encoding='utf-8').split('|')
            self.dic={conn:{"cmd": cmd, "filename": filename,"filesize": int(filesize)}}

            if cmd == 'put':
                conn.send(bytes("OK",encoding='utf8'))

            if self.dic[conn]['cmd'] == 'get':
                file = os.path.join(BASE_DIR,"download",filename)

                if os.path.exists(file):
                    fileSize = os.path.getsize(file)
                    send_info = '%s|%s'%('YES',fileSize)
                    conn.send(bytes(send_info, encoding='utf8'))
                else:
                    send_info = '%s|%s'%('NO',0)
                    conn.send(bytes(send_info, encoding='utf8'))
        else:
            if self.dic[conn].get('cmd',None):
                cmd=self.dic[conn].get('cmd')
                if hasattr(self, cmd):
                    func = getattr(self,cmd)
                else:
                    print("error cmd!")
            else:
                print("error cmd!")
    except Exception as e:
        print('error', e)
    fileName = self.dic[conn]['filename']
    fileSize = self.dic[conn]['filesize']
    path = os.path.join(BASE_DIR,"upload",fileName)
    recv_data = conn.recv(1024)
    self.hasReceived += len(recv_data)

    with open(path, 'ab') as f:
    if fileSize == self.hasReceived:
        if conn in self.dic.keys():
            self.dic[conn] = {}
        print("%s上传完毕!"%fileName)

def get(self,conn):

    filename = self.dic[conn]['filename']
    path = os.path.join(BASE_DIR,"download",filename)
    if str(conn.recv(1024), 'utf-8') == "second_active":
        with open(path, 'rb') as f:
            for line in f:
        self.dic[conn] = {}
        print('文件下载完毕!')


if __name__ == '__main__':

selectFtpServer()

FtpServer

以上就是土嘎嘎小编为大家整理的数据库:socketserver模块、MySQL_一)相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章