ホームページ >バックエンド開発 >Python チュートリアル >Python ネットワーク プログラミングでは select を使用してソケット全二重非同期通信機能を実装します

Python ネットワーク プログラミングでは select を使用してソケット全二重非同期通信機能を実装します

不言
不言オリジナル
2018-04-09 14:57:364072ブラウズ

この記事では、select を使用してソケット全二重非同期通信機能を実装するための Python ネットワーク プログラミングを主に紹介します。必要な友達は参考にしてください。この記事では、select を使用して実装する Python ネットワーク プログラミングの例を説明します。ソケット全二重 非同期通信機能。参考のために皆さんと共有してください。詳細は次のとおりです。

前回の記事「Python ネットワーク プログラミングにおける TCP ソケットの簡単な使用法」では、TCP クライアントとサーバー間の通信を実装しましたが、その機能は非常に限定されており、送信メッセージの送信とメッセージの受信を同時に行うことはできません。

次に、全二重通信(いつでも情報を送受信できる)を実現するためにこのモジュールを選択します。もちろん、後の話になりますが、マルチスレッドでも実現できます。

それで、セレクトとは何ですか?

select - シングルスレッドのネットワークサーバープログラムで、複数のソケット接続を管理します

select のプロトタイプは (rlist, wlist, xlist[, timeout]) です。ここで、rlist は読み取りを待機しているオブジェクト、wlist はオブジェクトです書き込みを待機しています。xlist は例外を待機しているオブジェクトで、最後のものは待機時間を指定するオプションのオブジェクトです。単位は s です。

メソッドの戻り値は、準備されたオブジェクトのトリプレットです。タイムアウト中に準備ができているオブジェクトがない場合、戻り値は空の​​リストになります。

select()ポーリングを使用して非同期通信を実現します。

次のプログラムでは、現在主に 1 対 1 の通信をサポートしています。どちらかが文字列「88」を送信すると、通信が終了します。

具体的な実装を見てみましょう:

最初はサーバーです。

#!/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是一个列表,初始有欢迎套接字以及标准输入
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 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()

これまでのところ、1対1の全二重チャット通信が実現されています。

もちろん、次に考える必要があるのは、多対多の通信をどのように実現するかということです。

サーバーが複数のクライアントにサービスを提供できることはわかっています。つまり、サーバーとクライアント自体は 1 対多の関係にあるため、多対多を実現するための情報を伝達する仲介者としてサーバーを使用できますか。毛織物?

たとえば、A が B と通信したい場合、A はその情報をサーバーに送信し、サーバー経由で B に転送します。この考え方に従って書けば多対多の通信ができるはずですので、興味のある方は試してみてください。

関連する推奨事項:


Python ネットワーク プログラミングにおける TCP ソケットの簡単な使用法

以上がPython ネットワーク プログラミングでは select を使用してソケット全二重非同期通信機能を実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。