国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python網絡編程使用select實現socket全雙工異步通信功能示例

2020-02-22 23:39:15
字體:
來源:轉載
供稿:網友

本文實例講述了Python網絡編程使用select實現socket全雙工異步通信功能。分享給大家供大家參考,具體如下:

在前面一篇《Python網絡編程之TCP套接字簡單用法》中,我們實現了tcp客戶端與服務器的通信,但是功能十分局限,發送消息與接收消息不能同時進行。

接下來我將通過select這個模塊,來實現全雙工通信(隨時可以接收信息以及發送信息),當然,用多線程也可以完成,這是后話。

那么,select為何物?

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()            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 汝城县| 平果县| 嘉黎县| 怀化市| 兴国县| 新干县| 洪泽县| 富阳市| 尉犁县| 榆中县| 常德市| 荥经县| 信阳市| 广汉市| 石嘴山市| 岑巩县| 元氏县| 西和县| 新巴尔虎左旗| 梁河县| 绥江县| 天等县| 郓城县| 永城市| 卢湾区| 贡觉县| 沙湾县| 荣成市| 封开县| 如皋市| 富宁县| 盱眙县| 武宁县| 漠河县| 利辛县| 黄山市| 简阳市| 英吉沙县| 青铜峡市| 长泰县| 无锡市|