python--socket/Socketerver并发/udp
Socketerve并发
基于tcp套接字,关键就是两个循环,一个链接循环,一个通讯循环
Socketserver模块中分两个大类:server类(解决链接问题)和request类(解决通信问题)
server类:

request类:

继承关系:



以下述代码为例,分析socketserver源码:
ftpserver=socketserver.ThreadingTCPServer(('127.0.0.1',8080),FtpServer)
ftpserver.serve_forever()
查找属性的顺序:
ThreadingTCPServer-->ThreadingMixIn-->TCPServer-->BaseServer
1.实例化得到tfpserver,先找类ThreadingTCPServer的_init_,在TCPServer中找到,进而执行Server_bind,server_active
2.找ftpsever下的server_forever,在BaseServer中找到,进而执行self._handle_request_noblock(),该方法同样是在BaseServer中
3.执行self._handle_request_noblcok()进而执行request,client_address=self.get_request()(就是TCPServer中的self.socket.accept()),然后执行self.process_request(request,client_address)
4.在ThreadingMiIn中找到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_adderss即客户端地址
#服务端:
import socketserver
class FTPserver(socketserver.BaseRequestHandler):#定义一个类 继承BaseRequestHandler #进行通讯
def handle(self):
# print(self)
# print(self.request) #拿到一个conn链接循环
while True: #通信循环
data=self.request.recv(1024)
print(data.decode("utf-8"))
self.request.send(data.upper()) if __name__ == '__main__':
obj=socketserver.ThreadingTCPServer(("127.0.0.1",8000),FTPserver) #自己的类名
obj.serve_forever()#链接循环 #客户端1
import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("127.0.0.1",8000)) while True:
msg=input(">>").strip()
if not msg:continue
s.send(msg.encode("utf-8"))
data=s.recv(1024)
s.close() #客户端2
import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("127.0.0.1",8000)) while True:
msg=input(">>").strip()
if not msg:continue
s.send(msg.encode("utf-8"))
data=s.recv(1024)
s.close() #客户端3
import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("127.0.0.1",8000)) while True:
msg=input(">>").strip()
if not msg:continue
s.send(msg.encode("utf-8"))
data=s.recv(1024)
s.close()
基于UDP的套接字
udp:sendto发消息,recvfrom收消息
udp是基于数据报
sendinto:
sendinto(bytes_data,ip_port):发送数据报,bytes_data为空,还有ip_port,所有即便是发送空的bytes_data,数据报其实也不是空的,自己这端的缓冲区收到内容,操作系统就会控制udp协议发包
recvfrom:
udp协议
(1)如果如果收消息缓冲区里的数据为“空”,recvfrom也会阻塞
(2)只不过udp协议的客户端sendinto一个空数据并不是真的空数据(包含:空数据+地址信息,得到的报仍然不会为空),所以客户端只要有一个sendinto(不管是否发送空数据,都不是真的空数据),服务端就可以recvfrom到数据。
(3)udp无链接
无链接,因而无需listen(backlog),更加没有什么连接池之说了
无链接,udp的sendinto不用管是否有一个正在运行的服务端,可以己端一个劲的发消息,只不过数据丢失
recvfrom收的数据小于sendinto发送的数据时,在mac和linux系统上数据直接丢失,在windows系统上发送的比接收的大直接报错
只有sendinto发送数据没有recvfrom收数据,数据丢失
udp套接字简单示例:
#udp服务端
import socket
ip_port=("127.0.0.1",8000)
buffer_size=1024
udp_server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #数据报
udp_server.bind(ip_port)
while True: #通信循环
data,addr=udp_server.recvfrom(buffer_size)
print(data.decode("utf-8"),addr)
msg=input(">>:")
udp_server.sendto(msg.encode("utf-8"),addr)
udp_server.sendto(data.upper(),addr)
udp_serve.close() #udp客户端
import socket
ip_port=("127.0.0.1",8000)
buffer_size=1024
udp_client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #数据报
while True: #通信循环
msg=input(">>:").strip()
udp_client.sendto(msg.encode("utf-8"),ip_port) #每次发包都要指定端口 data,addr= udp_client.recvfrom(buffer_size)
print(data.decode("utf-8"))
udp_client.close() #udp客户端1
import socket
ip_port=("127.0.0.1",8000)
buffer_size=1024
udp_client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #数据报
while True: #通信循环
msg=input(">>:").strip()
udp_client.sendto(msg.encode("utf-8"),ip_port) #每次发包都要指定端口 data,addr= udp_client.recvfrom(buffer_size)
print(data.decode("utf-8"))
udp_client.close() #udp客户端2 import socket
ip_port=("127.0.0.1",8000)
buffer_size=1024
udp_client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #数据报
while True: #通信循环
msg=input(">>:").strip()
udp_client.sendto(msg.encode("utf-8"),ip_port) #每次发包都要指定端口 data,addr= udp_client.recvfrom(buffer_size)
print(data.decode("utf-8"))
udp_client.close()
python--socket/Socketerver并发/udp的更多相关文章
- Python Socket多线程并发
1.SocketServer模块编写的TCP服务器端代码 Socketserver原理图 服务端: import SocketServer #导入SocketServer,多线程并发由此类实现 cla ...
- 老李分享:使用 Python 的 Socket 模块开发 UDP 扫描工具
老李分享:使用 Python 的 Socket 模块开发 UDP 扫描工具 poptest是业内唯一的测试开发工程师培训机构,测试开发工程师主要是为测试服务开发测试工具,在工作中要求你做网络级别的安全 ...
- Python基于socket模块实现UDP通信功能示例
Python基于socket模块实现UDP通信功能示例 本文实例讲述了Python基于socket模块实现UDP通信功能.分享给大家供大家参考,具体如下: 一 代码 1.接收端 import ...
- python socket原理 及socket如何使(tcp udp协议)
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API) 主要内容: 1.基于 ...
- python之多并发socket
先看socket多并发的服务端的代码,这里是用多线程实现的多并发socketserver import socketserver # socketserver有四个基本的类,后两个不常用,这4个类处理 ...
- python之多并发socket(zz)
本文转载自:http://www.cnblogs.com/bainianminguo/p/7337210.html 先看socket多并发的服务端的代码,这里是用多线程实现的多并发socketserv ...
- Python的网络编程[0] -> socket[2] -> 利用 socket 建立 TCP/UDP 通信
Socket 目录 socket 的 TCP/IP 通信基本建立过程 socket 的 UDP 通信基本建立过程 socket 的 UDP 广播式通信基本建立过程 socket 的多线程通信建立过程 ...
- Python socket进阶 多线程/进程
#首先,什么场合下用进程,什么场合下用线程: . 计算密集型的用进程. . IO密集型的用进程. xSocket语法及相关 Socket Families(地址簇) socket.AF_UNIX un ...
- python socket编程详细介绍
Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络 ...
随机推荐
- Android Studio报错:the selected directory is not a valid home for unknow sdk
今天在使用Android Studio的时候不知道怎么了,没有import module,视图里面也没有android视图,查看project设置.提示我的SDK路径无效:the selected d ...
- PHP实现KMP算法
KMP算法是一种比较高效的字符串匹配算法,关于其讲解,可参考文章 字符串匹配的KMP算法,本文只给出具体的PHP代码实现. /** * @desc构建next数组 * @param string $s ...
- 从源码浅析Java中的Lock和AbstractQueuedSynchronizer
在之前的文章中我也曾经介绍过Lock,像ReentrantLock(可重入锁)和ReentrantReadWriteLock(可重入读写锁),这些所我们在说的时候并没有详细的说明它们的原理,仅仅说明了 ...
- ASUS T100TA 换屏要记
建议完整阅读后再执行操作! 参考: [图片]华硕T100换触摸屏详细教程,全网第一发[平板电脑吧]_百度贴吧 [图片]我是这么修T100的……换外屏[win8平板吧]_百度贴吧 淘宝信息: 选择适用型 ...
- js前端读写文件的方法(json、excel)
1.前端读取文件的实现 关键:利用文件上传对话框预览本地文件.利用FileReader读取文件 前端预览本地文件 <input tabindex="-1" id=" ...
- Android一个小巧的记录app(便签或者日记 随心)
入驻博客园两个月今天第一次发随笔,,话不多说,直接上图展示效果 主界面用的RecyclerView的瀑布流(StaggeredGridLayoutManager),同时加上Floatbutton悬浮按 ...
- sql模糊查询效率
在数据库量比较大的时候通常有一些查询,例如查询文本类型的数据,存储量大,用like进行模糊查询效率实在太低 select * from stdcontent where content like ' ...
- PHP对大小写敏感问题
1. 变量名区分大小写 1 <?php 2 $abc = 'abcd'; 3 echo $abc; //输出 'abcd' 4 echo $aBc; //无输出 5 echo $ABC; //无 ...
- selenium2自动化测试学习笔记(四)
今天是学习selenium2第四天.总结下今天的学习成果,自动登录网易邮箱并写信发送邮件. 知识点or坑点: 1.模块化编写测试模块(类似java里的抽象方法,js的函数编写) from 包名 imp ...
- 基于Multiple treatment的营销评估算法
营销是发现或挖掘准消费者和众多商家需求,通过对自身商品和服务的优化和定制,进而推广.传播和销售产品,实现最大化利益的过程.例如,银行可通过免息卡或降价对处在分期意愿边缘的用户进行营销,促使其分期进而提 ...