Python网络编程(http协议,IO多路复用、select内核监听)
前言:
补充昨天HTTP:
- from socket import *
- # 接收请求
- # 查看请求
- # 返回客户端段请求内容
- def handleClient(connfd):
- request = connfd.recv(4096)
- # print("***********")
- # print(request)
- # print("************")
- # 按照行切割请求
- request_lines = request.splitlines()
- for line in request_lines:
- print(line.decode())
- try:
- f = open('index.html')
- except IOError:
- response = "HTTP/1.1 303 Not Found\r\n"
- response += "\r\n" # 空行
- response += '''
- **************************
- Sorry, not found the page.
- **************************
- '''
- else:
- response = "HTTP/1.1 200 OK\r\n"
- response += '\r\n'
- response += f.read()
- finally:
- # 发送给浏览器
- connfd.send(response.encode())
- # 创建套接字,调用handleClient完成功能
- def main():
- # 创建tcp套接字
- sockfd = socket()
- sockfd.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
- sockfd.bind(('0.0.0.0', 8000))
- sockfd.listen()
- while True:
- print("Listen the port 8000...")
- connfd, addr = sockfd.accept()
- # 处理浏览器发来的请求
- handleClient(connfd)
- connfd.close()
- if __name__ == "__main__":
- main()
- from socket import *
- from select import *
- s = socket()
- s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
- s.bind(('0.0.0.0',8888))
- s.listen(5)
- #创建poll对象
- p = poll()
- #创建地图
- fdmap = {s.fileno():s}
- #添加关注
- p.register(s,POLLIN | POLLERR)
- while True:
- #进行IO监控
- #[(fileno,evnet),...]
- events = p.poll()
- for fd,event in events:
- if fd == s.fileno():
- #从地图中找到fd对应的对象
- c,addr = fdmap[fd].accept()
- print("Connect from",addr)
- #注册新的IO 维护地图
- p.register(c,POLLIN)
- fdmap[c.fileno()] = c
- else:
- data = fdmap[fd].recv(1024)
- if not data:
- p.unregister(fd) #从关注移除
- fdmap[fd].close()
- del fdmap[fd] #从地图删除
- else:
- print(data.decode())
- fdmap[fd].send('收到了'.encode())
- from socket import *
- from select import select
- # 创建套接字
- s = socket()
- # 设置端口重用
- s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
- # 绑定地址
- s.bind(('0.0.0.0', 8888))
- # 设置队列
- s.listen(5)
- # 注册监听套接字
- rlist = [s]
- wlist = []
- xlist = [s]
- while True:
- print("等待IO发生")
- rs, ws, xs = select(rlist, wlist, xlist)
- # 循环遍历rs准备就绪列表
- for r in rs:
- # 如果有新的客户端链接请求
- if r is s:
- # 链接客户端并返回客户端套接字
- connfd, addr = r.accept() # r==s 原套接字
- print("Connect from", addr)
- # 将绑定客户端套接字加入监听列表
- rlist.append(connfd)
- # 表示客户端连接套接字准备就绪
- else:
- # 如果是客户端套接字发送数据 则接收
- data = r.recv(1024)
- if not data: # 如果客户端断开链接
- # 从关注列表移除connfd
- rlist.remove(r)
- r.close() # 关闭套接字
- else:
- print("Receive:", data.decode())
- # 讲客户端套接字放入wlist
- wlist.append(r)
- # wlist列表会直接返回
- # 循环遍历ws准备就绪列表
- for w in ws:
- # 消息回复
- w.send("这是一条回复消息".encode())
- # 删除并取消监听已处理消息
- wlist.remove(w)
- # xs列表:待处理异常
- for x in xs:
- if x is s:
- s.close()

- from socket import *
- # 创建套接字
- sockfd = socket()
- # 发起连接
- sockfd.connect(('127.0.0.1', 8888))
- while True:
- # 消息收发
- msg = input("Msg>>")
- if not msg:
- break
- sockfd.sendall(msg.encode())
- data = sockfd.recv(1024)
- print(data.decode())
- sockfd.close()
- # myserver.py
- # 应用 :
- # select服务端,同时关注客户端连接
- # 客户端发送和终端输入。将客户端发送和终端输入的内容全都写入到一个文件中
- from socket import *
- from select import *
- from sys import stdin
- sock = socket()
- sock.getsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
- sock.bind(("127.0.0.1", 6666))
- sock.listen(5)
- rlist = [sock, stdin]
- wlist = []
- xlist = []
- file = open("selectdemo.txt", "w+b")
- while True:
- rs, ws, xs, = select(rlist, wlist, xlist)
- for r in rs:
- if r == sock:
- connfd, addr = r.accept()
- print("已连接......")
- rlist.append(connfd)
- elif r == stdin:
- data = stdin.readline()
- file.write(data.encode())
- file.flush()
- else:
- data = r.recv(4096)
- if not data:
- rlist.remove(r)
- r.close()
- else:
- file.write(data + "\n".encode())
- file.flush()
- print("已经接收内容并写如select>>>.txt文件内\n 内容:", data.decode())
- r.send("接收成功!".encode())
- file.close()
- from socket import *
- # 创建套接字
- sockfd = socket()
- # 发起连接
- sockfd.connect(('127.0.0.1', 6666))
- while True:
- # 消息收发
- msg = input("Msg>>")
- if not msg:
- break
- sockfd.sendall(msg.encode())
- data = sockfd.recv(1024)
- print(data.decode())
- sockfd.close()

Python网络编程(http协议,IO多路复用、select内核监听)的更多相关文章
- 网络编程socket 结合IO多路复用select; epool机制分别实现单线程并发TCP服务器
select版-TCP服务器 1. select 原理 在多路复用的模型中,比较常用的有select模型和epoll模型.这两个都是系统接口,由操作系统提供.当然,Python的select模块进行了 ...
- python 网络编程 -- Tcp协议
Socket是网络编程的一个抽象概念.通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可. 客户端 大多数连接都是可靠 ...
- python网络编程-TCP协议中的三次握手和四次挥手(图解)
建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资 ...
- Python网络编程:IO多路复用
io多路复用:可以监听多个文件描述符(socket对象)(文件句柄),一旦文件句柄出现变化,即可感知. sk1 = socket.socket() sk1.bind(('127.0.0.1',8001 ...
- python网络编程——SocketServer/Twisted/paramiko模块
在之前博客C/S架构的网络编程中,IO多路复用是将多个IO操作复用到1个服务端进程中进行处理,即无论有多少个客户端进行连接请求,服务端始终只有1个进程对客户端进行响应,这样的好处是节省了系统开销(se ...
- 第五十五节,IO多路复用select模块加socket模块,伪多线并发
IO多路复用select模块加socket模块,伪多线并发,并不是真正的多线程并发,实际通过循环等待还是一个一个处理的 IO多路复用,lo就是文件或数据的输入输出,IO多路复用就是可以多用户操作 IO ...
- python网络编程——IO多路复用之select
1 IO多路复用的概念 原生socket客户端在与服务端建立连接时,即服务端调用accept方法时是阻塞的,同时服务端和客户端在收发数据(调用recv.send.sendall)时也是阻塞的.原生so ...
- python 网络编程 IO多路复用之epoll
python网络编程——IO多路复用之epoll 1.内核EPOLL模型讲解 此部分参考http://blog.csdn.net/mango_song/article/details/4264 ...
- Python实战之IO多路复用select的详细简单练习
IO多路复用 I/O多路复用指:通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作. select 它通过一个select()系统调用来 ...
随机推荐
- 软件的依赖关系:类图关系:is-a has-a use-a
基本描述: 类图关系:is-a has-a use-a: 依赖规则: 依赖倒置: 依赖注入: 接口隔离: 无环依赖: 稳定依赖: 依赖倒置描述: 底层抽象-->高层抽象 ^ ^ ...
- Linux ELF格式分析
http://www.cnblogs.com/hzl6255/p/3312262.html ELF, Executable and Linking Format, 是一种用于可执行文件.目标文件.共享 ...
- IBM带库加磁带操作
1.查询要弹出磁带的信息 可查询media日志,冻结,可用等,详情可查 查看带库空闲槽位 vmcheckxxx -rt tld -rn 0(0为带库名) 磁带详细信息: bpmedialist -m ...
- c++参数传递的三种方式
一般来说C++中参数传递有三种方式:值传递.指针传递.引用传递 1.值传递——传值 值传递是最常见的一种参数传递的方式,但是对初学者来说也最容易出错.如下例: #include<iostream ...
- EF Database first 中,实现 多个表对应一个 实体的 查询
1.首先 创建好 数据 库. hobby表 major 表 student 表 外键 关系如下 2. 实现将 数据库 映射到EDM中 视图如下 在VS中 生成了 3个实体类 ,对应的是 数据库中的3 ...
- ceph-块存储客户端
ceph块存储 ceph块设备,以前称为RADOS块设备,为客户机提供可靠性.分布式和高性能的块存储磁盘.RADOS块设备利用librbd库并以顺序的形式在ceph集群的多个osd上存储数据块.RBD ...
- Vuex基础-Action
在文章开始之前,再次强调一句:Vuex会把getter mutations action不管是在模块定义的还是在根级别定义的 都会注册在全局 官网API地址:https://vuex.vuejs.or ...
- 居中未知元素(翻译https://css-tricks.com/centering-in-the-unknown/)
在web开发中,当你遇到居中元素时,知道越多关于元素本身和父级元素的信息,居中做起来就很轻松.但是,当遇到你一点都不知道的元素该怎么办? It's still kinda doable. 不会很难:已 ...
- C# 操作符与表达式
C#保留了C++所有的操作符,其中指针操作符(*和->)与引用操作符(&)需要有unsafe的上下文.C#摈弃了范围辨析操作符(::),一律改为单点操作符(.).我们不再阐述那些保留的C ...
- 关于 Angular引用Material出现node_modules/@angular/material/button-toggle/typings/button-toggle.d.ts(154,104): error TS2315: Type 'ElementRef' is not generic.问题
百度了好久 ,,,最后谷歌出来了.. 该错误可能来自于您将@ angular / material设置为6.0.0, 但所有其他Angular包都是5.x.您应该始终确保Material主要版本与An ...