php io select,Python IO多路复用之——select方案服务端和客户端代码【python源码详解】...
準(zhǔn)備文件:
IO.py? 服務(wù)端代碼
tcp_c.py?客戶端代碼
IO.py?代碼:
from select import * #引入 select 模塊
from socket import * #引入 socket 模塊
s = socket() #實(shí)例化一個(gè)socket 對(duì)象
s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #設(shè)置端口可重用
s.bind(('0.0.0.0',8888)) #綁定端口號(hào) 8888
s.listen(5) #設(shè)置監(jiān)聽隊(duì)列
rlist = [s] #設(shè)置讀列表(被動(dòng)列表)
wlist = [] #設(shè)置寫列表(主動(dòng)列表)
xlist = [] #設(shè)置出錯(cuò)列表
while True: #循環(huán)等待客戶端連接
rs,ws,xs = select(rlist, wlist, xlist) #將三個(gè)列表托管給select 對(duì)象
for r in rs: #遍歷 讀列表(收到客戶端請(qǐng)求的對(duì)象)
if r is s: # 如果是 s 套接字對(duì)象接收到請(qǐng)求,則說(shuō)明是新的用戶連接
c,addr = s.accept() #處理客戶端請(qǐng)求,將連接套接字賦值給 c 用戶地址賦值給 addr
print(addr,'連接至s') #打印連接提示信息
rlist.append(c) #將連接套接字添加進(jìn) 讀列表,以便保持持續(xù)的連接
else: #如果不是 s 套接字對(duì)象接收的請(qǐng)求,則說(shuō)明是已有的現(xiàn)成連接
data = r.recv(1024) #接收客戶端傳過(guò)來(lái)的數(shù)據(jù)
if not data:#如果沒(méi)有發(fā)送過(guò)來(lái)任何數(shù)據(jù)
r.close() #將當(dāng)前套接字關(guān)閉
rlist.remove(r) #將當(dāng)前套接字移除出rlist列表,使 select 不再監(jiān)管此對(duì)象
else: #如果有發(fā)送過(guò)來(lái)的數(shù)據(jù)
print(data.decode()) #打印出客戶端發(fā)送過(guò)來(lái)的數(shù)據(jù)
r.send('已收到你的消息'.encode()) #給客戶端回復(fù)數(shù)據(jù)
for w in ws: #遍歷 寫列表(主動(dòng)發(fā)起的列表)? 只要此列表有對(duì)象,會(huì)馬上觸發(fā)
pass #由于基本上用不到這個(gè)列表,所以此處不寫任何代碼
for x in xs: #遍歷 發(fā)生錯(cuò)誤的套接字列表
pass #由于基本上用不到這個(gè)列表,所以此處不寫任何代碼
tcp_c.py代碼:
from socket import *
import time
#創(chuàng)建套接字
sockfd = socket(AF_INET,SOCK_STREAM)
#發(fā)起連接
server_addr = ('127.0.0.1',8888)
sockfd.connect(server_addr)
i = 0
while True:
data = input('發(fā)送>>')
#data = '哈哈'+str(i)
sockfd.send(data.encode())
data = sockfd.recv(1024)
print('接收到:',data.decode(),i)
i += 1
sockfd.close()
運(yùn)行結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的php io select,Python IO多路复用之——select方案服务端和客户端代码【python源码详解】...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 中级通信工程师证书有什么用
- 下一篇: 动态规划算法php,php算法学习之动态