1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Python网络编程之使用select实现socket全双工异步通信功能

Python网络编程之使用select实现socket全双工异步通信功能

时间:2022-02-20 23:49:20

相关推荐

Python网络编程之使用select实现socket全双工异步通信功能

后端开发|Python教程

select,Python,网络编程

后端开发-Python教程在前面一篇《Python网络编程之TCP套接字简单用法》中,我们实现了tcp客户端与服务器的通信,但是功能十分局限,发送消息与接收消息不能同时进行。

分类信息门户网站源码,ubuntu 批量加ip,tomcat端口号是多少,屋里有爬爬虫,php最好的编辑器,框架SEO建站lzw

接下来我将通过select这个模块,来实现全双工通信(随时可以接收信息以及发送信息),当然,用多线程也可以完成,这是后话。

704棋牌游戏源码,yum装vscode,ubuntu sox,tomcat连接代码,sqlite 查询第几行,订单进度条插件,前端开发可以不用框架吗,爬虫运行越来越慢,php mysql锁,珠海360seo,试看20秒非会员网站,网页带,简洁登录界面模板 htmllzw

那么,select为何物?

名片源码php,ubuntu查看未来月历,热门电影信息爬虫,整数php,seo隐藏网页lzw

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

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

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

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

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

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

首先是服务器。

#!/usr/bin/python est TCP serverfrom 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)breakelse: #处理服务器端的发送消息 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 est tcp clientfrom socket import *from time import ctimeimport selectimport sysHOST = localhostPORT = 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 dataif data==88: break else:data = raw_input(>)if data==88: tcpCliSock.send(\%s %(data)) breaktcpCliSock.send([%s] %s %(ctime(), data)) if data==88: breaktcpCliSock.close()

目前为止,已经实现了一对一全双工聊天通信啦。

下面当然要思考下,如何实现多对多通信呢?

我们知道,一个服务器可以为多个客户端服务,即,服务器与客户端本身有着一对多的关系,那么,我们是否可以利用服务器作为中间人,用来传达信息,从而实现多对多通信呢?

举个例子,A想要和B通信,则A将信息发送给服务器,然后再通过服务器转发给B。按照这个思路去写,完成多对多通信应该是可以的,有兴趣的可以尝试一下。

Python网络编程之TCP套接字的简单用法

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。