博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Socketserver 笔记
阅读量:6501 次
发布时间:2019-06-24

本文共 1891 字,大约阅读时间需要 6 分钟。

引入Socketserver的背景:

我们之前使用socket编程的时候,Server端创建一个连接循环(建立连接)+一个通信循环(基于一次连接建立通信循环),(这里的黏包问题我们的实现方式是:我们在发送数据之前我们计算出这个数据的字节流的长度,然后我们把信息封装起来,自定义head头,我们通过struct.pack 的方式),但是这里无法实现并发访问,因为我们的这里的结构是我们创建一个连接之后立马进入通信循环,我们的通信循环不结束的话,我们这里没法建立新的连接(也即是说无法走到连接循环)

创建一个socketserver 至少分以下几步:

  1. First, you must create a request handler class by subclassing the class and overriding its  method; this method will process incoming requests.   
  2. Second, you must instantiate one of the server classes, passing it the server’s address and the request handler class.
  3. Then call the  or method of the server object to process one or many requests.
  4. Finally, call  to close the socket.
实现原理:
import socketserverclass MyServer(socketserver.BaseRequestHandler): #这里我们过来一个连接,就创建一个连接实例    def handle(self):        '''        这个是固定的,就要定义一个handle的函数,这里的self代表的就是过来的一个连接实例,这一步操作就相当于之前的tcp_server.accept()操作        :return:        '''        print('conn is: ',self.request)   #conn        print('addr is: ',self.client_address) #addr        while True: # 这里就是一个通信循环            try:            #收消息                data=self.request.recv(1024)                if not data:break                print('收到客户端的消息是',data,self.client_address)                #发消息                self.request.sendall(data.upper())            except Exception as e:                print(e)                breakif __name__ == '__main__':    s=socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyServer) #多线程的Tcp服务端(实现并发,开启多个任务来给客户端链接)    s.serve_forever()    #socketserver.ThreadingTCPServer  +  serve_forever 实现连接循环,连接循环里面我们套了一个通信循环MyServer'''工作原理:ThreadingTCPServer(多线程处理连接) +  serve_forever(连接循环)  +  MyServer(通信循环)ThreadingTCPServer  是多线程的那么当每过来一个客户端请求的时候,都会通过MyServer进行实例化得到一个结果去和客户端通信。当第二个连接过来的额时候,因为我们是多线程的,所以其他的线程就拿着MyServer类进行实例得到一个对象,然后用MyServer里的handle方法进行通信'''

 实现原理图解:

 笔记整理来自海峰老师的视频:

外加一个Alex的链接 http://www.cnblogs.com/alex3714/articles/5830365.html

你可能感兴趣的文章
MYSQL体系结构-来自期刊
查看>>
PHP——图片上传
查看>>
mysql的基本知识
查看>>
exchange 2003配置ASSP 反垃圾邮件
查看>>
CQRS学习——最小单元的Cqrs(CommandEvent)[其一]
查看>>
webpack入门(二)what is webpack
查看>>
UnitOfWork以及其在ABP中的应用
查看>>
学习C语言必须知道的理论知识(第一章)
查看>>
for语句内嵌例题与个人理解
查看>>
眠眠interview Question
查看>>
Linux C++/Java/Web/OC Socket网络编程
查看>>
[转]CSS hack大全&详解
查看>>
c语言第八次作业
查看>>
RPC-client异步收发核心细节?
查看>>
POJ-1753 Flip Game 枚举 状态压缩
查看>>
〖Linux〗使用Qt5.2.0开发Android的NDK应用程序
查看>>
idea快捷键
查看>>
Finalize/Dispose/Destructor
查看>>
33.搜索插件——autocomplete
查看>>
使用XML在MSSQL把字串分解
查看>>