python网络编程linux pdf_Python网络编程:Linux epoll
原文地址:http://scotdoyle.com/python-epoll-howto.html
介绍
Python已于2.6版本添加访问Linux epoll库的API。这篇教程使用Python 3简要介绍如何使用Linux epoll。
阻塞Socket
例1是一个Pyhton服务端程序,它监听8080端口,接收HTTP请求并将其打印到console,然后对HTTP请求进行回复。
#Example 1
import socket
EOL1 = b'\n\n'
EOL2 = b'\n\r\n'
response = b'HTTP/1.0 200 OK\r\nDate: Mon, 1 Jan 1996 01:01:01 GMT\r\n'
response += b'Content-Type: text/plain\r\nContent-Length: 13\r\n\r\n'
response += b'Hello, world!'
#创建socket
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
serversocket.bind(('0.0.0.0', 8080))
serversocket.listen(1)
connectiontoclient, address = serversocket.accept()
request = b''
while EOL1 not in request and EOL2 not in request:
request += connectiontoclient.recv(1024)
print(request.decode())
connectiontoclient.send(response)
connectiontoclient.close()
serversocket.close()
下面的代码添加了一个循环,不断接收客户端的请求直到被我们手动关闭。例2更清楚地展示了服务端创建的socket不直接与客户端进行数据交换,而是服务端socket接收到来自客户端的连接后,创建一个新的socket与该客户端进行通信。
#Example 2
import socket
EOL1 = b'\n\n'
EOL2 = b'\n\r\n'
response = b'HTTP/1.0 200 OK\r\nDate: Mon, 1 Jan 1996 01:01:01 GMT\r\n'
response += b'Content-Type: text/plain\r\nContent-Length: 13\r\n\r\n'
response += b'Hello, world!'
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
serversocket.bind(('0.0.0.0', 8080))
serversocket.listen(1)
try:
while True:
connectiontoclient, address = serversocket.accept()
request = b''
while EOL1 not in request and EOL2 not in request:
request += connectiontoclient.recv(1024)
print('-'*40 + '\n' + request.decode()[:-2])
connectiontoclient.send(response)
connectiontoclient.close()
#确保程序即使出现exception,socket也会被关闭
finally:
serversocket.close()
非阻塞Socket和Linux epoll的好处
上面两个例子展示的都是阻塞socket。Python代码执行到某行会停在那里直到某一事件发生。如16行的accept()会被阻塞直到有一个客户端请求连接。19行的recv()会被阻塞直到客户端发送了数据(或没有数据可读取)。21行的send()会被阻塞直到所有要发送给客户端的数据已经Linux被放入了传输队列。
当一个服务端程序使用阻塞socket时,对于每一个客户端,其经常使用一个线程甚至一个专门的进程进行通讯。服务端程序的主线程则主要包括监听的被用来接受客户端请求的socket。其每次接收一个来自客户端的请求,并把新创建的用于和客户端通信的socket传给另外一个线程与客户端进行交互。因为每个线程只与一个客户端进行通讯,某一个线程出现阻塞不会影响到其他线程执行的任务。
使用多线程和阻塞socket进行网络编程写出的代码更加直观、简单,但是有不少缺点。多线程需要考虑到操作系统关于资源共享的常见问题,并且这种编程方式对单核CPU很不友好。
The C10K Problem讨论了若干种处理并发连接的方法,比如使用异步socket。
python网络编程linux pdf_Python网络编程:Linux epoll相关推荐
- python面向对象编程实例pdf_Python面向对象编程指南 ([美]StevenFLott洛特) 中文pdf扫描版[52MB]...
Python是一种面向对象.解释型的程序设计语言,它已经被成功应用于科学计算.数据分析以及游戏开发等诸多领域. Python面向对象编程指南深入介绍Python语言的面向对象特性,全书分3个部分共18 ...
- IT视频课程集(包含各类Oracle、DB2、Linux、Mysql、Nosql、Hadoop、BI、云计算、编程开发、网络、大数据、虚拟化
马哥Linux培训视频课程:http://pan.baidu.com/s/1pJwk7dp Oracle.大数据系列课程:http://pan.baidu.com/s/1bnng3yZ 天善智能BI培 ...
- Linux下网络编程
Linux下网络编程初步 Linux以其源代码公开闻名于世,并以其稳定性和可靠性雄霸操作系统领域,在网络应用技术方面使用得更加广泛.很久以来它就是Windows的重要对手之一.随着网络时代的来临,Li ...
- 【Linux网络编程】TCP网络编程中connect listen和accept三者之间的关系
00. 目录 文章目录 00. 目录 01. TCP服务端和客户端流程 02. connect函数 03. listen函数 04. 三次握手 05. accept函数 06. 附录 01. TCP服 ...
- 【Linux网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系
基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: connect()函数 对于客户端的 connect() 函数,该函数的功能为客户端主动连接服务器,建立连接是通过三 ...
- Linux底层网络编程--ARP,PING等
一linux系统中获取网卡信息 获取网卡信息有两种方法.一种是读取系统文件.另外一种是通过系统API进行获取. 1. 读取系统文件 程序中通过读取/proc/net/dev文件即可以读取到系统中的所 ...
- Linux网络编程---I/O复用模型之epoll
https://blog.csdn.net/men_wen/article/details/53456474 Linux网络编程-I/O复用模型之epoll 1. epoll模型简介 epoll是Li ...
- 【LINUX/UNIX网络编程】之使用消息队列,信号量和命名管道实现的多进程服务器(多人群聊系统)...
RT,使用消息队列,信号量和命名管道实现的多人群聊系统. 本学期Linux.unix网络编程的第三个作业. 先上实验要求: 实验三 多进程服务器 [实验目的] 1.熟练掌握进程的创建与终止方法: 2 ...
- Linux C高级编程——网络编程之API(5)
Linux C网络编程--API 宗旨:技术的学习是有限的,分享的精神的无限的. 一.基本socket函数 Linux系统是通过提供套接字(socket)来进行网络编程的.网络的so ...
最新文章
- CentOS 安装配置memcached
- 如果类是个泛型类的话dllImport 代码不能编译
- 前1000位粉丝的诞生
- Node.js 官方Path模块简介
- 领航商务之选——金立M5 plus体验札记
- 【Java框架】 Hibernate与Mybatis对比
- 回溯算法-排列/组合/子集
- php把整数拆分成数组,数组拆分处理(整数时的处理),该怎么处理
- python 运算符重载_一锅类似函数重载的小杂烩
- 快捷键截屏_win7截图快捷键是什么 win7截图快捷键怎么按
- RHEL6网络无人值守安装
- 基于遗传算法自动化集装箱码头多载AGV调度(一)—模型搭建
- oracle更新字段为null,OracleORA-01451:要修改为NULL的列无法修改为NULL
- 计算机软件的制作过程,迅捷流程图制作软件
- 求职面试PPT模板推荐
- 仿真Windows_XP画图板的java实现
- “磁碟机”病毒肆虐 数万电脑中招
- Android不同屏幕适配的大神解决方案(转)
- android 文件传输_使用“发送到”轻松将文件传输到您的Android设备
- 把图片放大后还很清晰的办法