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的更多相关文章

  1. Python Socket多线程并发

    1.SocketServer模块编写的TCP服务器端代码 Socketserver原理图 服务端: import SocketServer #导入SocketServer,多线程并发由此类实现 cla ...

  2. 老李分享:使用 Python 的 Socket 模块开发 UDP 扫描工具

    老李分享:使用 Python 的 Socket 模块开发 UDP 扫描工具 poptest是业内唯一的测试开发工程师培训机构,测试开发工程师主要是为测试服务开发测试工具,在工作中要求你做网络级别的安全 ...

  3. Python基于socket模块实现UDP通信功能示例

    Python基于socket模块实现UDP通信功能示例 本文实例讲述了Python基于socket模块实现UDP通信功能.分享给大家供大家参考,具体如下: 一 代码 1.接收端     import ...

  4. python socket原理 及socket如何使(tcp udp协议)

    网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API) 主要内容: 1.基于 ...

  5. python之多并发socket

    先看socket多并发的服务端的代码,这里是用多线程实现的多并发socketserver import socketserver # socketserver有四个基本的类,后两个不常用,这4个类处理 ...

  6. python之多并发socket(zz)

    本文转载自:http://www.cnblogs.com/bainianminguo/p/7337210.html 先看socket多并发的服务端的代码,这里是用多线程实现的多并发socketserv ...

  7. Python的网络编程[0] -> socket[2] -> 利用 socket 建立 TCP/UDP 通信

    Socket 目录 socket 的 TCP/IP 通信基本建立过程 socket 的 UDP 通信基本建立过程 socket 的 UDP 广播式通信基本建立过程 socket 的多线程通信建立过程 ...

  8. Python socket进阶 多线程/进程

    #首先,什么场合下用进程,什么场合下用线程: . 计算密集型的用进程. . IO密集型的用进程. xSocket语法及相关 Socket Families(地址簇) socket.AF_UNIX un ...

  9. python socket编程详细介绍

    Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络 ...

随机推荐

  1. firemonkey ListView DynamicAppearance

    Go Up to FireMonkey Application Design Contents [hide]  1 Customizing the List View Appearance Prope ...

  2. 解决Centos7本机时间与实际时间相差8小时

    # timedatectl Local -- :: CST Universal -- :: UTC #相差8小时 RTC -- :: Time zone: Asia/Shanghai (CST, +) ...

  3. 理解 dispatch_get_specific

    这篇文章原来在用 Github Pages 搭建的博客上,现在决定重新用回博客园,所以把文章搬回来. dispatch_queue_set_specific用于给一个队列设置相关的上下文数据,disp ...

  4. spring-boot 多模块化项目和EurekaServer的搭建

    Spring boot由于其 1.易于开发和维护.2.单个微服务启动快.3.局部修改部署容易.4.技术栈不受语言限制等优点受到越来越多公司的重视.spring-boot还集成了许多关于微服务开发的框架 ...

  5. 利用CSS3制作网页动画

    如何在网页中实现动画效果动态图片 flashjavascriptcss3变形是一些效果的集合如平移 旋转 缩放 倾斜效果每个效果都可以称为变形(transfrom) 它们可以分别操控元素发生平移.旋转 ...

  6. Java基础学习笔记十四 常用API之基本类型包装类

    基本类型包装类 Java中有8种基本的数据类型,可是这些数据是基本数据,想对其进行复杂操作,变的很难.怎么办呢?在实际程序使用中,程序界面上用户输入的数据都是以字符串类型进行存储的.而程序开发中,我们 ...

  7. Java并发编程实战(chapter_2)(对象发布、不变性、设计线程安全类)

    一.发布与溢出 "发布(Publish)"一个对象的意思是指,使对象能够在当前作用于之外的代码中使用.这个"之外",尤为关键,各种出问题的地方,都是因为这个&q ...

  8. Welcome to StackEdit!

    Welcome to StackEdit! Hey!our first Markdown document in StackEdit1. Don't delete me, I'm very helpf ...

  9. 第五次作业-需求&原型改进

    需求&原型改进 0. 团队介绍 团队名称:121ComeOn 项目名称:个人博客项目 团队组成: PM:黄金筱(107) 成员:王枫(031),刘烨(255),周明浩(277) github地 ...

  10. 百词斩APP分析

    一.调研 1.第一次上手   第一次使用,可以使用微信和qq登录感觉挺不错的不然又要注册有点麻烦,在功能上,用户可以针对自身选择不同水平的英语背单词,然后有多钟方式对自己的听力和单词翻译进行提升.在u ...