当前位置: 首页 > 后端技术 > Python

《是碰巧还是执着?python所阅读的每一场知识点,唯一的共同点就是——参赛选手中,有python之socket编程!》

时间:2023-03-26 19:40:59 Python

本章内容  1、socket  2、IO多路复用  3、socketserverSocketsocket起源于Unix,Unix/Linux的基本哲学之一就是“一切皆文件”。打开][读写][关闭]模式进行操作。Socket就是这种模式的一种实现。socket是一个特殊的文件,一些socket函数就是对它的操作(read/writeIO,open,close)。基本上,Socket是任何一种计算机网络通信中最基本的。内容。比如当你在浏览器地址栏输入http://www.cnblogs.com/,你会打开一个socket,然后连接并读取响应页面,然后显示出来。gtalk、skype等其他一些聊天客户端也类似。任何网络通信都是通过Socket完成的。所以想学习的同学,听听这位老师的课,领取python福利还是很有必要的。想学的同学可以去猛子老师的微信(同读音):前排是:762,中排是:459,后排一组是:510,把上面三组组合起来就可以了字母顺序。她会安排学习。套接字和文件的区别:  1。文件模块是对指定文件【打开】【读写】【关闭】  2。socket模块就是要【打开】【为服务端和客户端的Sockets】读写】【关闭】那么我们先创建一个socket服务器。ServerViewCodesocket功能更多,功能更多注:高手知道大家都懒,所以在每个功能下标出所有功能的汉字。让我们在下面列出一些常用的。sk.bind(address)  s.bind(address)将套接字绑定到地址。地址格式取决于地址族。在AF_INET下,地址以元组(主机,端口)的形式表示。sk.listen(backlog)  开始监听传入的连接。backlog指定在连接被拒绝之前可以挂起的最大连接数。backlog等于5,表示内核已经收到连接请求,但是服务器还没有调用accept处理连接。最大连接数为5,这个值不能无限大,因为kernelsk中必须维护连接队列。是否阻塞(默认True),如果设置为False,那么一旦accept和recv没有数据,就会报错。sk.accept()  接受连接并返回(conn,address),其中conn是一个新的socket对象,可以用来接收和发送数据。地址是连接客户端的地址。  接收TCP客户端连接(阻塞)等待连接的到来sk.connect(address)  连接到address的socket。通常,地址的格式是一个元组(主机名,端口)。如果连接失败,将返回socket.error。所以想学习的同学,听听这位老师的课,领取python福利还是很有必要的。想学的同学可以去猛子老师的微信(同读音):前排是:762,中排是:459,后排一组是:510,把上面三组组合起来就可以了字母顺序。她会安排学习。sk.connect_ex(address)  同上,只是会有一个返回值。连接成功时返回0,连接失败时返回代码,例如:10061sk.close()  关闭socketsk.recv(bufsize[,flag])  接受数据从套接字。数据以字符串形式返回,bufsize指定可以接收的最大数量。标志提供有关消息的附加信息,通常可以忽略。sk.recvfrom(bufsize[.flag])  类似于recv(),但返回值为(data,address)。其中data是包含接收到的数据的字符串,address是发送数据的套接字的地址。sk.send(string[,flag])  将字符串中的数据发送到连接的套接字。返回值是要发送的字节数,可能小于字符串的字节大小。也就是说,并非所有指定的内容都可以被发送。sk.sendall(string[,flag])  将字符串中的数据发送到连接的套接字,但会在返回之前尝试发送所有数据。成功返回None,失败则抛出异常。在内部,所有内容都是通过递归调用send来发送的。sk.sendto(string[,flag],address)  向socket发送数据,address是(ipaddr,port)形式的元组,指定远程地址。返回值是发送的字节数。该函数主要用于UDP协议。sk.settimeout(timeout)  设置socket操作的超时时间,timeout是一个浮点数,单位是秒。None值表示没有超时期限。一般在socket刚创建的时候就应该设置超时时间,因为它们可能用于连接操作(比如客户端连接等待最多5s)sk.getpeername()  返回连接socket的远程地址。返回值通常是一个元组(ipaddr,port)。sk.getsockname()  返回套接字自己的地址。通常一个元组(ipaddr,port)sk.fileno()  socket文件描述符TCP:Case1机器人聊天Case2上传文件UdPudp传输WEB服务application:!/usr/bin/envpythoncoding:utf-8importsocketdefhandle_request(客户端):buf=client.recv(1024)client.send("HTTP/1.1200OK\r\n\r\n")client.send("Hello,World")defmain():sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)sock.bind(('localhost',8080))sock.listen(5)whileTrue:connection,address=sock.accept()handle_request(connection)connection.close()如果name=='__main__':main()IO多路复用I/O(input/output),即输入/输出端口。每个设备都会有一个专用的I/O地址来处理自己的输入和输出信息。首先,什么是I/O:I/O分为磁盘io和网络io。这里是网络ioIO多路复用:I/O多路复用指的是:通过一种机制,可以监听多个描述符(套接字),一旦一个描述符就绪(通常是读就绪或者写就绪),就可以通知程序执行相应的读和写操作。LinuxLinux中的select、poll、epoll都是IO多路复用机制。Linux下的网络I/O使用socket套接字进行通信。普通I/O模型只能监控一个socket,而I/O多路复用可以同时监控多个socket。I/O多路复用避免阻塞在Onio上,消息原来是多进程或多线程接收多个连接,改为单进程或单线程保存多个socket的状态,然后轮询处理。所以想学的同学,一定要听听这位老师的课,领取python福利,想学的同学可以去猛子老师的微信(同读音):前排是:762,中间排是:459,后排是:510,把上面三组字母依次组合起来,她就会安排学习。PythonPython中有一个select模块,它提供了select、poll、epoll三种方法,分别调用系统的select、poll、epoll来实现IO多路复用。WindowsPython:提供:selectMacPython:提供:selectLinuxPython:提供:select,poll,epoll对于select模块操作方法:handlelist11,handlelist22,handlelist33=select.select(handlesequence1,handlesequence2,handlesequence3,timeout)参数:可接受的四个参数(前三个必须)返回值:三个列表select方法用于监听文件句柄,如果句柄发生变化,获取句柄。1、当参数1的序列中的句柄可读(accetp和read)时,获取变化后的句柄,将其加入到返回值1的序列中。2、当参数2的序列中包含句柄时,将参数2中的所有句柄sequence会将句柄添加到返回值2sequence3。当参数3sequence中的句柄发生错误时,将错误句柄添加到返回值3sequence4。未设置超时时,select将一直阻塞,直到监听句柄发生变化5.当超时时间=1时,如果监听句柄没有变化,select会阻塞1秒,然后返回三个空列表。如果监听句柄发生变化,则直接执行。使用select监听终端操作示例使用select实现多个Socket客户端请求的伪同时处理使用select实现多个Socket客户端请求的伪同时处理读写分离socketserverSocketServer使用IO多路复用和“多线程”和“多进程“内部”,从而实现并发处理多个客户端请求的Socket服务器。即:当每个客户端请求连接服务器时,Socket服务器都会在服务器上创建一个“线程”或“进程”来处理当前客户端的所有请求。ThreadingTCPServerThreadingTCPServer实现的Soket服务器内部为每个客户端创建一个“线程”,用于与客户端进行交互。1、ThreadingTCPServer以ThreadingTCPServer为基础:创建一个继承自SocketServer.BaseRequestHandler的类。必须在类中定义一个名为handle的方法来启动ThreadingTCPServer服务器客户端。2、ThreadingTCPServer源码分析ThreadingTCPServer的类图关系如下:内部调用过程为:启动服务器程序执行TCPServer.__init__方法,创建服务器Socket对象并绑定IP和端口执行BaseServer.__init__方法,并将继承自SocketServer.BaseRequestHandler的自定义类MyRequestHandle赋值给self.RequestHandlerClass来执行BaseServer.server_forever方法,while循环一直监听是否有客户端请求到达...当客户端连接到达服务器时,执行ThreadingMixIn.process_request方法,创建一个“线程”来处理请求,执行ThreadingMixIn.process_request_thread方法,执行BaseServer.finish_request方法,执行self.RequestHandlerClass()即:执行自定义MyRequestHandler的构造方法(自动调用基类BaseRequestHandler的构造方法,并调用该构造方法中MyRequestHandler的handle方法)。所以想学的同学,一定要听老师讲课领PythonFurio,想学的同学可以去猛子老师的微信(同读音):前排是:762,中间排是:459,后排是:510,把上面三组字母依次放在一起,她就会安排学习。对应源码如下:BaseserverTCPserverThreadingMix在SocketServer.BaseRequestHandlerSocketServer的ThreadingTCPServer可以同时处理请求得益于select和Threading这两个东西。实际上,它本质上是在服务器端为每个客户端创建一个线程。当前线程用来处理对应客户端的请求,所以可以同时支持n个客户端连接(长连接)。所以想学习的同学,听听这位老师的课,领取python福利还是很有必要的。想学的同学可以去猛子老师的微信(同读音):前排是:762,中排是:459,后排一组是:510,把上面三组组合起来就可以了字母顺序。她会安排学习。