国产探花免费观看_亚洲丰满少妇自慰呻吟_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()            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 星子县| 宝清县| 顺义区| 太康县| 昭苏县| 木兰县| 濮阳县| 贵港市| 红河县| 新源县| 邹平县| 岱山县| 新乡县| 杭州市| 新泰市| 通化市| 延安市| 阳江市| 永新县| 汪清县| 丹巴县| 稷山县| 秭归县| 韩城市| 仙游县| 贵阳市| 柯坪县| 阿尔山市| 巴中市| 玉树县| 原平市| 九龙城区| 临沧市| 麻栗坡县| 资兴市| 咸丰县| 达日县| 肇东市| 芒康县| 武安市| 武冈市|