Python 네트워크 프로그래밍은 select를 사용하여 소켓 전이중 비동기 통신 기능을 구현합니다.

不言
풀어 주다: 2018-04-09 14:57:36
원래의
3964명이 탐색했습니다.

이 글에서는 주로 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()
로그인 후 복사

지금까지 일대일 전이중 채팅 통신이 이루어졌습니다.

물론 다음에는 다대다 의사소통을 어떻게 달성할 수 있을지 생각해 봐야 겠죠?

우리는 서버가 여러 클라이언트에게 서비스를 제공할 수 있다는 것을 알고 있습니다. 즉, 서버와 클라이언트 자체가 일대다 관계를 가지고 있으므로 서버를 중개자로 사용하여 다대다를 달성할 수 있습니까? 통신?

예를 들어 A가 B와 통신하려고 하면 A는 해당 정보를 서버로 보낸 다음 서버를 통해 B로 전달합니다. 이 아이디어대로 쓰시면 다대다 커뮤니케이션이 가능할 것 같아요. 관심 있으신 분들은 한번 해보세요.

관련 권장 사항:


Python 네트워크 프로그래밍에서 TCP 소켓의 간단한 사용법

위 내용은 Python 네트워크 프로그래밍은 select를 사용하여 소켓 전이중 비동기 통신 기능을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!