博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python数据报协议以及sockersever模块的使用
阅读量:5013 次
发布时间:2019-06-12

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

一.基于UDP协议的套接字

UDP协议

  UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。UDP在IP报文的协议号是17。UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。

udp套接字简单示例

udp服务端

import socketserver = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # SOCK_DGRAM基于UDP协议server.bind(('127.0.0.1', 8765))while True:    data, client_addr = server.recvfrom(1024)    print(data.decode('utf-8'))    server.sendto(data.upper(), client_addr)server.close()

udp客户端

import socketclient = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#SOCK_DGRAM基于UDP协议while True:    msg = input(">>:").strip()    client.sendto(msg.encode('utf-8'),('127.0.0.1',8765))    data,server_addr = client.recvfrom(1024)    print(data.decode('utf-8'))

二.socketserver模块的使用

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

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

  server类:

  

  request类:

  

  继承关系:

  

  

  

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

ftpserver=socketserver.ThreadingTCPServer(('127.0.0.1',8080),FtpServer) ftpserver.serve_forever()

查找属性的顺序:ThreadingTCPServer->ThreadingMixIn->TCPServer->BaseServer

    1. 实例化得到ftpserver,先找类ThreadingTCPServer的__init__,在TCPServer中找到,进而执行server_bind,server_active
    2. 找ftpserver下的serve_forever,在BaseServer中找到,进而执行self._handle_request_noblock(),该方法同样是在BaseServer中
    3. 执行self._handle_request_noblock()进而执行request, client_address = self.get_request()(就是TCPServer中的self.socket.accept()),然后执行self.process_request(request, client_address)
    4. 在ThreadingMixIn中找到process_request,开启多线程应对并发,进而执行process_request_thread,执行self.finish_request(request, client_address)
    5. 上述四部分完成了链接循环,本部分开始进入处理通讯部分,在BaseServer中找到finish_request,触发我们自己定义的类的实例化,去找__init__方法,而我们自己定义的类没有该方法,则去它的父类也就是BaseRequestHandler中找....

源码分析总结:

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

    1.   self.server即套接字对象
    2.   self.request即一个链接
    3.   self.client_address即客户端地址

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

    1.   self.request是一个元组(第一个元素是客户端发来的数据,第二部分是服务端的udp套接字对象),如(b'adsf', <socket.socket fd=200, family=AddressFamily.AF_INET, type=SocketKind.SOCK_DGRAM, proto=0, laddr=('127.0.0.1', 8080)>)
    2.   self.client_address即客户端地址

转载于:https://www.cnblogs.com/louyefeng/p/9588040.html

你可能感兴趣的文章
HDOJ1874 ( 畅通工程续 ) 【单源最短路径】
查看>>
java中 用telnet 判断服务器远程端口是否开启
查看>>
Oracle存储过程的异常处理
查看>>
mysql获取子父级节点
查看>>
jzoj5813
查看>>
laravel 5.7 引入Illuminate\Http\Request 在类内调用 Request 提示不存在的问题
查看>>
[BZOJ 1806] Miners 矿工配餐
查看>>
ros问题总结
查看>>
SSL编程(3).NET实现SSL服务端
查看>>
RCU机制
查看>>
webview缓存及跳转时截取url地址、监听页面变化
查看>>
n-tier waf 41 project 层真够多
查看>>
Neo4j--常用的查询语句
查看>>
模式窗口window.showModal
查看>>
不要怕被打断
查看>>
将button置灰
查看>>
线程同步技术
查看>>
求职的坑
查看>>
电脑网络诊断显示Win10无法与设备或资源(DNS)通信解决办法
查看>>
Node.js学习笔记
查看>>