Maison  >  Article  >  développement back-end  >  La programmation réseau Python utilise select pour implémenter la fonction de communication asynchrone full-duplex du socket

La programmation réseau Python utilise select pour implémenter la fonction de communication asynchrone full-duplex du socket

不言
不言original
2018-04-09 14:57:364034parcourir

Cet article présente principalement l'utilisation de select dans la programmation réseau Python pour réaliser la fonction de communication asynchrone full-duplex du socket. Il est partagé avec tout le monde ici. Les amis dans le besoin peuvent s'y référer

Les exemples contenus dans cet article. L'article décrit l'utilisation de la programmation réseau Python. Select implémente la fonction de communication asynchrone full-duplex du socket. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :

Dans l'article précédent "Utilisation simple du socket TCP dans la programmation réseau Python", nous avons implémenté la communication entre le client TCP et le serveur, mais la fonction est très limité. L’envoi et la réception de messages ne peuvent pas avoir lieu en même temps.

Ensuite, je sélectionnerai ce module pour réaliser une communication full-duplex (les informations peuvent être reçues et envoyées à tout moment, bien sûr, elles peuvent également être complétées par du multi-thread, ce qui sera une histoire plus tard).

Alors, qu'est-ce que la sélection ?

select - Dans un programme serveur réseau monothread, gérez plusieurs connexions socket

Le prototype de select est (rlist,wlist,xlist[,timeout ]), où rlist est l'objet en attente de lecture, wlist est l'objet en attente d'écriture, xlist est l'objet en attente d'exception et le dernier est un objet facultatif, spécifiant le temps d'attente, l'unité est s.

select()La valeur de retour de la méthode est un triplet d'objets préparés. Si aucun objet n'est prêt dans le délai d'attente, la valeur de retour sera une liste vide.

Il utilise le sondage pour réaliser une communication asynchrone.

Dans le programme suivant, il prend actuellement principalement en charge la communication 1-to-1. Lorsque l'une des parties envoie la chaîne « 88 », cela signifie que la communication est terminée.

Jetons un coup d'œil à l'implémentation spécifique :

Le premier est le serveur.

#!/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()

Ce qui suit est le code client, qui est très similaire, sauf qu'il n'a pas besoin de traiter les informations de la demande par rapport au serveur.

#!/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()

Jusqu'à présent, une communication par chat en duplex intégral a été réalisée.

Bien sûr, nous devons réfléchir à la manière de parvenir à une communication plusieurs-à-plusieurs ?

Nous savons qu'un serveur peut servir plusieurs clients, c'est-à-dire que le serveur a une relation un-à-plusieurs avec le client lui-même. Pouvons-nous donc utiliser le serveur comme intermédiaire pour transmettre des informations afin de réaliser quoi. à propos de la communication plusieurs-à-plusieurs ?

Par exemple, si A souhaite communiquer avec B, alors A envoie les informations au serveur, puis les transmet à B via le serveur. Si vous écrivez selon cette idée, il devrait être possible d'effectuer une communication plusieurs-à-plusieurs. Si vous êtes intéressé, vous pouvez l'essayer.

Recommandations associées :

Utilisation simple des sockets TCP dans la programmation réseau Python

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn