溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Python怎么使用select實(shí)現(xiàn)socket全雙工異步通信功能

發(fā)布時(shí)間:2022-05-18 10:22:24 來(lái)源:億速云 閱讀:614 作者:zzz 欄目:大數(shù)據(jù)

這篇“Python怎么使用select實(shí)現(xiàn)socket全雙工異步通信功能”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“Python怎么使用select實(shí)現(xiàn)socket全雙工異步通信功能”文章吧。

select  -在單線(xiàn)程網(wǎng)絡(luò)服務(wù)中器程序中,管理多個(gè)套接字連接

select的原型為(rlist,wlist,xlist[,timeout]),其中rlist是等待讀取的對(duì)象,wlist是等待寫(xiě)入的對(duì)象,xlist是等待異常的對(duì)象,最后一個(gè)是可選對(duì)象,指定等待的時(shí)間,單位是s.

select()方法的返回值是準(zhǔn)備好的對(duì)象的三元組,若在timeout的時(shí)間內(nèi),沒(méi)有對(duì)象準(zhǔn)備好,那么返回值將是空的列表。

它采用的是輪詢(xún)的方式來(lái)實(shí)現(xiàn)異步通信的。

在下面程序中,目前主要支持1對(duì)1通信,當(dāng)雙方任何一方發(fā)送字符串‘88'時(shí),表示結(jié)束通信。

下面我們來(lái)看看具體實(shí)現(xiàn):

首先是服務(wù)器。

#!/usr/bin/python
'test TCP server'
from socket import *
from time import ctime
import select
import sys
HOST = ''
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)
tcpSerSock = socket(AF_INET, SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)
input = [tcpSerSock, sys.stdin]   #input是一個(gè)列表,初始有歡迎套接字以及標(biāo)準(zhǔn)輸入
while True:
  print 'waiting for connection...'
  tcpCliSock, addr = tcpSerSock.accept()
  print '...connected from:',addr
  input.append(tcpCliSock)  #將服務(wù)套接字加入到input列表中
  while True:
    readyInput,readyOutput,readyException = select.select(input,[],[]) #從input中選擇,輪流處理client的請(qǐng)求連接(tcpSerSock),client發(fā)送來(lái)的消息(tcpCliSock),及服務(wù)器端的發(fā)送消息(stdin)
    for indata in readyInput:
      if indata==tcpCliSock:  #處理client發(fā)送來(lái)的消息
        data = tcpCliSock.recv(BUFSIZ)
        print data
        if data=='88':
          input.remove(tcpCliSock)
          break
      else:       #處理服務(wù)器端的發(fā)送消息
        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()

以下是客戶(hù)端的代碼,非常類(lèi)似,只是與服務(wù)器相比不需要處理請(qǐng)求信息而已。

#!/usr/bin/python
'test tcp client'
from socket import *
from time import ctime
import select
import sys
HOST = 'localhost'
PORT = 21567
BUFSIZ = 1024
ADDR = (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':
    break
tcpCliSock.close()

以上就是關(guān)于“Python怎么使用select實(shí)現(xiàn)socket全雙工異步通信功能”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI