python-select

服务端:

importselect

importsocket

importsys

importQueue

# Create a TCP/IP socket

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

server.setblocking(False)

# Bind the socket to the port

server_address = ('localhost',9999)

print(sys.stderr,'starting up on %s port %s'% server_address)

server.bind(server_address)

# Listen for incoming connections

server.listen(5)

# Sockets from which we expect to read

inputs = [server]

# Sockets to which we expect to write

outputs = []

message_queues = {}

whileinputs:

# Wait for at least one of the sockets to be ready for processing

print('\nwaiting for the next event')

readable, writable, exceptional = select.select(inputs, outputs, inputs)

# Handle inputs

forsinreadable:

ifsisserver:

# A "readable" server socket is ready to accept a connection

connection, client_address = s.accept()

print('new connection from', client_address)

connection.setblocking(False)

inputs.append(connection)

# Give the connection a queue for data we want to send

message_queues[connection] = Queue.Queue()

else:

data = s.recv(1024)

ifdata:

# A readable client socket has data

print(sys.stderr,'received "%s" from %s'% (data, s.getpeername()))

message_queues[s].put(data)

# Add output channel for response

ifsnot inoutputs:

outputs.append(s)

else:

# Interpret empty result as closed connection

print('closing', client_address,'after reading no data')

# Stop listening for input on the connection

ifsinoutputs:

outputs.remove(s)# 既然客户端都断开了,我就不用再给它返回数据了,所以这时候如果这个客户端的连接对象还在outputs列表中,就把它删掉

inputs.remove(s)# inputs中也删除掉

s.close()# 把这个连接关闭掉

# Remove message queue

delmessage_queues[s]

# Handle outputs

forsinwritable:

try:

next_msg = message_queues[s].get_nowait()

exceptQueue.Empty:

# No messages waiting so stop checking for writability.

print('output queue for', s.getpeername(),'is empty')

outputs.remove(s)

else:

print('sending "%s" to %s'% (next_msg, s.getpeername()))

s.send(next_msg)

# Handle "exceptional conditions"

forsinexceptional:

print('handling exceptional condition for', s.getpeername())

# Stop listening for input on the connection

inputs.remove(s)

ifsinoutputs:

outputs.remove(s)

s.close()

# Remove message queue

delmessage_queues[s]


客户端:

importsocket

importsys

messages = ['This is the message. ',

'It will be sent ',

'in parts.',

]

server_address = ('localhost',9999)

# Create a TCP/IP socket

socks = [socket.socket(socket.AF_INET, socket.SOCK_STREAM),

socket.socket(socket.AF_INET, socket.SOCK_STREAM),

]

# Connect the socket to the port where the server is listening

print>> sys.stderr,'connecting to %s port %s'% server_address

forsinsocks:

s.connect(server_address)

formessageinmessages:

# Send messages on both sockets

forsinsocks:

print>> sys.stderr,'%s: sending "%s"'% (s.getsockname(), message)

s.send(message)

# Read responses on both sockets

forsinsocks:

data = s.recv(1024)

print>> sys.stderr,'%s: received "%s"'% (s.getsockname(), data)

if notdata:

print>> sys.stderr,'closing socket', s.getsockname()

s.close()


原文:http://pymotw.com/2/select/

经过实验,其实windows也是支持的。

注:

select()方法接收并监控3个通信列表, 第一个是所有的输入的data,就是指外部发过来的数据,第2个是监控和接收所有要发出去的data(outgoing data),第3个监控错误信息。

当你把inputs,outputs,exceptional(这里跟inputs共用)传给select()后,它返回3个新的list,我们上面将他们分别赋值为readable,writable,exceptional, 所有在readable list中的socket连接代表有数据可接收(recv),所有在writable list中的存放着你可以对其进行发送(send)操作的socket连接,当连接通信出现error时会把error写到exceptional列表中。


Readable list 中的socket 可以有3种可能状态,第一种是如果这个socket是main "server" socket,它负责监听客户端的连接,如果这个main server socket出现在readable里,那代表这是server端已经ready来接收一个新的连接进来了,为了让这个main server能同时处理多个连接,在下面的代码里,我们把这个main server的socket设置为非阻塞模式。

第二种情况是这个socket是已经建立了的连接,它把数据发了过来,这个时候你就可以通过recv()来接收它发过来的数据,然后把接收到的数据放到queue里,这样你就可以把接收到的数据再传回给客户端了。

第三种情况就是这个客户端已经断开了,所以你再通过recv()接收到的数据就为空了,所以这个时候你就可以把这个跟客户端的连接关闭了。


对于writable list中的socket,也有几种状态,如果这个客户端连接在跟它对应的queue里有数据,就把这个数据取出来再发回给这个客户端,否则就把这个连接从output list中移除,这样下一次循环select()调用时检测到outputs list中没有这个连接,那就会认为这个连接还处于非活动状态


最后,如果在跟某个socket连接通信过程中出了错误,就把这个连接对象在inputs\outputs\message_queue中都删除,再把连接关闭掉

注解转自http://www.cnblogs.com/alex3714/p/4372426.html。

部分源码有问题我已自行修改。

本文为菜鸟学习笔记,如有错误,请各位大神帮忙指出,感激不尽。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容

  • http://python.jobbole.com/85231/ 关于专业技能写完项目接着写写一名3年工作经验的J...
    燕京博士阅读 7,566评论 1 118
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,647评论 18 139
  • https://nodejs.org/api/documentation.html 工具模块 Assert 测试 ...
    KeKeMars阅读 6,320评论 0 6
  • Java程序员进阶三条必经之路:数据库、虚拟机、异步通信。 前言 从零单排高性能问题,这次轮到异步通信了。这个领域...
    MountainKing阅读 7,928评论 0 15
  • 代码不好排版,可以到微信订阅号(xuanhun521)查看原文。 Python黑帽编程2.8套接字编程 套接字编程...
    玄魂阅读 653评论 1 2