이 글에서는 주로 select를 사용하여 소켓 전이중 비동기 통신 기능을 구현하는 Python 네트워크 프로그래밍을 소개합니다. 여기 있는 모든 사람과 공유합니다. 필요한 친구가 참조할 수 있습니다.
이 글에서는 select를 사용하여 구현하는 Python 네트워크 프로그래밍의 예를 설명합니다. 소켓 전이중 비동기 통신 기능. 참고할 수 있도록 모든 사람과 공유하세요. 세부 사항은 다음과 같습니다.
이전 기사 "Python 네트워크 프로그래밍에서 TCP 소켓의 간단한 사용법"에서 TCP 클라이언트와 서버 간의 통신을 구현했지만 기능이 매우 제한되어 있습니다. 및 메시지 수신 메시지는 동시에 보낼 수 없습니다.
다음으로 전이중 통신(언제든지 정보를 주고받을 수 있음)을 구현하기 위해 이 모듈을 선택하겠습니다. 물론 멀티스레딩으로도 완료할 수 있다는 이야기는 나중에 하겠습니다.
그럼 셀렉트란 무엇일까요?
select - 단일 스레드 네트워크 서버 프로그램에서 다중 소켓 연결을 관리합니다.
select의 프로토타입은 (rlist, wlist, xlist[, timeout])입니다. 여기서 rlist는 읽기를 기다리는 개체이고 wlist는 개체입니다. 기록 대기 중, xlist는 예외를 기다리는 객체이고, 마지막 객체는 선택적 객체이며, 대기 시간을 지정하며, 단위는 s입니다. 시간 초과 중에 객체가 준비되면 반환 값은 빈 목록이 됩니다.
폴링을 사용하여 비동기 통신을 달성합니다. select()
#!/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 중국어 웹사이트의 기타 관련 기사를 참조하세요!