Heim  >  Artikel  >  Backend-Entwicklung  >  Die Python-Netzwerkprogrammierung verwendet Select, um die asynchrone Socket-Vollduplex-Kommunikationsfunktion zu implementieren

Die Python-Netzwerkprogrammierung verwendet Select, um die asynchrone Socket-Vollduplex-Kommunikationsfunktion zu implementieren

不言
不言Original
2018-04-09 14:57:364017Durchsuche

Dieser Artikel stellt hauptsächlich die Verwendung von select in der Python-Netzwerkprogrammierung vor, um die Socket-Vollduplex-Kommunikationsfunktion zu realisieren. Er wird hier mit allen geteilt. Freunde in Not können sich darauf beziehen.

Die Beispiele hier Der Artikel beschreibt die Verwendung der Python-Netzwerkprogrammierung. Select implementiert die asynchrone Socket-Vollduplex-Kommunikationsfunktion. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:

Im vorherigen Artikel „Einfache Verwendung von TCP-Sockets in der Python-Netzwerkprogrammierung“ haben wir die Kommunikation zwischen TCP-Client und -Server implementiert, aber die Funktion ist Das Senden und Empfangen von Nachrichten kann nicht gleichzeitig erfolgen.

Als nächstes werde ich dieses Modul auswählen, um eine Vollduplex-Kommunikation zu erreichen (Informationen können jederzeit empfangen und gesendet werden, natürlich kann es auch mit Multithreading vervollständigt werden, was eine Geschichte später ist).

Also, was ist „Auswählen“?

select – Verwalten Sie in einem Single-Threaded-Netzwerkserverprogramm mehrere Socket-Verbindungen

Der Prototyp von select ist (rlist,wlist,xlist[,timeout ]), Dabei ist rlist das Objekt, das darauf wartet, gelesen zu werden, wlist ist das Objekt, das darauf wartet, geschrieben zu werden, xlist ist das Objekt, das auf eine Ausnahme wartet, und das letzte ist ein optionales Objekt, das die Wartezeit angibt, die Einheit ist s.

select()Der Rückgabewert der Methode ist ein Triplett vorbereiteter Objekte. Wenn innerhalb des Timeout-Zeitraums kein Objekt bereit ist, ist der Rückgabewert eine leere Liste.

Es nutzt Polling, um eine asynchrone Kommunikation zu erreichen.

Im folgenden Programm wird derzeit hauptsächlich die 1-zu-1-Kommunikation unterstützt. Wenn eine Partei die Zeichenfolge „88“ sendet, zeigt dies das Ende der Kommunikation an.

Werfen wir einen Blick auf die spezifische Implementierung:

Zuerst ist der Server.

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

Das Folgende ist der Clientcode, der sehr ähnlich ist, außer dass er im Vergleich zum Server keine Anforderungsinformationen verarbeiten muss.

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

Bisher wurde eine Eins-zu-eins-Vollduplex-Chat-Kommunikation erreicht.

Natürlich müssen wir darüber nachdenken, wie wir eine Many-to-Many-Kommunikation erreichen können?

Wir wissen, dass ein Server mehrere Clients bedienen kann, d über Viele-zu-Viele-Kommunikation?

Wenn A beispielsweise mit B kommunizieren möchte, sendet A die Informationen an den Server und leitet sie dann über den Server an B weiter. Wenn Sie nach dieser Idee schreiben, sollte es möglich sein, eine Viele-zu-Viele-Kommunikation durchzuführen. Wenn Sie interessiert sind, können Sie es versuchen.

Verwandte Empfehlungen:

Einfache Verwendung von TCP-Sockets in der Python-Netzwerkprogrammierung

Das obige ist der detaillierte Inhalt vonDie Python-Netzwerkprogrammierung verwendet Select, um die asynchrone Socket-Vollduplex-Kommunikationsfunktion zu implementieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn