千家信息网

Python怎么使用select实现socket全双工异步通信功能

发表于:2024-12-12 作者:千家信息网编辑
千家信息网最后更新 2024年12月12日,这篇"Python怎么使用select实现socket全双工异步通信功能"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能
千家信息网最后更新 2024年12月12日Python怎么使用select实现socket全双工异步通信功能

这篇"Python怎么使用select实现socket全双工异步通信功能"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"Python怎么使用select实现socket全双工异步通信功能"文章吧。

select -在单线程网络服务中器程序中,管理多个套接字连接

select的原型为(rlist,wlist,xlist[,timeout]),其中rlist是等待读取的对象,wlist是等待写入的对象,xlist是等待异常的对象,最后一个是可选对象,指定等待的时间,单位是s.

select()方法的返回值是准备好的对象的三元组,若在timeout的时间内,没有对象准备好,那么返回值将是空的列表。

它采用的是轮询的方式来实现异步通信的。

在下面程序中,目前主要支持1对1通信,当双方任何一方发送字符串'88'时,表示结束通信。

下面我们来看看具体实现:

首先是服务器。

#!/usr/bin/python'test TCP server'from socket import *from time import ctimeimport selectimport sysHOST = ''PORT = 21567BUFSIZ = 1024ADDR = (HOST, PORT)tcpSerSock = socket(AF_INET, SOCK_STREAM)tcpSerSock.bind(ADDR)tcpSerSock.listen(5)input = [tcpSerSock, sys.stdin]   #input是一个列表,初始有欢迎套接字以及标准输入while True:  print 'waiting for connection...'  tcpCliSock, addr = tcpSerSock.accept()  print '...connected from:',addr  input.append(tcpCliSock)  #将服务套接字加入到input列表中  while True:    readyInput,readyOutput,readyException = select.select(input,[],[]) #从input中选择,轮流处理client的请求连接(tcpSerSock),client发送来的消息(tcpCliSock),及服务器端的发送消息(stdin)    for indata in readyInput:      if indata==tcpCliSock:  #处理client发送来的消息        data = tcpCliSock.recv(BUFSIZ)        print data        if data=='88':          input.remove(tcpCliSock)          break      else:       #处理服务器端的发送消息        data = raw_input('>')        if data=='88':          tcpCliSock.send('%s' %(data))          input.remove(tcpCliSock)          break        tcpCliSock.send('[%s] %s' %(ctime(), data))    if data=='88':      break  tcpCliSock.close()tcpSerSock.close()

以下是客户端的代码,非常类似,只是与服务器相比不需要处理请求信息而已。

#!/usr/bin/python'test tcp client'from socket import *from time import ctimeimport selectimport sysHOST = 'localhost'PORT = 21567BUFSIZ = 1024ADDR = (HOST, PORT)tcpCliSock = socket(AF_INET, SOCK_STREAM)tcpCliSock.connect(ADDR)input = [tcpCliSock,sys.stdin]while True:  readyInput,readyOutput,readyException = select.select(input,[],[])  for indata in readyInput:    if indata==tcpCliSock:      data = tcpCliSock.recv(BUFSIZ)      print data      if data=='88':        break    else:      data = raw_input('>')      if data=='88':        tcpCliSock.send('%s' %(data))        break      tcpCliSock.send('[%s] %s' %(ctime(), data))  if data=='88':    breaktcpCliSock.close()

以上就是关于"Python怎么使用select实现socket全双工异步通信功能"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。

0