Python 은 서버 가 여러 클 라 이언 트 요청 을 감청 하 는 것 을 실현 합 니 다.

Python 네트워크 통신 을 공부 할 때 책 에 한 서버 만 이 클 라 이언 트 에 대응 하 는 상황 을 발견 하여 자신 이 직접 한 서버 가 여러 클 라 이언 트 에 응답 하 는 것 을 실현 하고 싶 습 니 다.
먼저 서버 의 socket 을 만들어 클 라 이언 트 의 요청 을 감청 합 니 다.

tcpSerSock=socket(AF_INET,SOCK_STREAM) 
tcpSerSock.bind(ADDR) 
tcpSerSock.listen(5) 
이렇게 하면 서버 감청 socket 이 만들어 집 니 다.
다음 사 고 는 여러 클 라 이언 트 를 감청 하려 면

tcpSerSock.accept() #(accept()     ) 
while 순환 을 넣 어야 합 니 다.하지만 여기 에는 문제 가 있다.만약 에 일대일 의 처리 순서에 따라 클 라 이언 트 A 가 연결 되면 프로그램 순서 가 아래로 실 행 됩 니 다.서버 는 while 순환 을 다시 써 서 클 라 이언 트 A 의 요청 을 처리 해 야 합 니 다.이때 클 라 이언 트 B 가 다시 요청 하면 서버 가 받 아들 일 수 없습니다.그래서 자 연 스 럽 게 감청 과 처 리 를 서로 다른 스 레 드 에 두 고 처리 할 생각 이 들 었 다.나 는 감청 을 메 인 스 레 드 에 넣 고 하위 스 레 드 에 넣 는 것 을 선택 했다.이 서버 기능 은 클 라 이언 트 의 데 이 터 를 받 은 후 시간 스탬프 를 추가 하여 클 라 이언 트 에 게 되 돌려 줍 니 다.서버 의 전체 코드 는 다음 과 같 습 니 다.

#coding=utf-8 
#!/usr/bin/env python 
''''' 
author:Mr.Jing 
created on Fri Sep 22 14:29:03 2017 
platfrom:win10,python2.7 
''' 
 
from socket import * 
from time import ctime 
import threading 
import time 
HOST='' 
PORT=2159 
BUFSIZ=1024 
ADDR = (HOST,PORT) 
 
tcpSerSock=socket(AF_INET,SOCK_STREAM) 
tcpSerSock.bind(ADDR) 
tcpSerSock.listen(5) 
socks=[]        #       socket 
 
def handle(): 
 while True: 
  for s in socks: 
   data = s.recv(BUFSIZ) 
   if not data: 
    socks.remove(s) 
    continue 
   s.send('[%s],%s' % (ctime(), data)) #        
 
t = threading.Thread(target=handle)    #    
if __name__ == '__main__': 
 t.start() 
 print u'  %s    ' % threading.current_thread().name #       
 print 'waiting for connecting...' 
 while True: 
  clientSock,addr = tcpSerSock.accept() 
  print 'connected from:', addr 
  socks.append(clientSock) 
두 개의 클 라 이언 트 A 와 B 가 동시에 연결 되 고 서버 출력:

서버 에서 해당 하 는 여러 클 라 이언 트 를 볼 수 있 습 니 다.
클 라 이언 트 A 태엽 메시지 해 볼 까요?

서버 에서 타임 스탬프 가 있 는 메시지 가 돌 아 왔 습 니 다.goodjob.
그럼 다른 하 나 는 요?

잘 했 어.서버 에서 모두 응답 할 수 있 습 니 다.
하나 더 보 내 볼 까요?

서버 가 응답 하지 않 은 것 을 발 견 했 습 니 다.어떻게 된 일 입 니까?
자세히 조사 한 결과 이 말 때 문 이 었 다.

data = s.recv(BUFSIZ) 
recv 방법 은 차단 되 어 있 기 때 문 입 니 다.즉,특정한 클 라 이언 트,예 를 들 어 A.이 말 은 A 가 메 시 지 를 보 내 기 를 기다 리 고 메 시 지 를 보 내지 않 으 면 아래로 내 려 가지 않 기 때문에 이때 B 가 다시 메 시 지 를 보 내 면 서버 에서 받 을 수 없습니다.
그럼 어 떡 하지?
그것 을 비 차단 으로 설정 하면 된다 는 것 을 쉽게 생각 할 수 있다.하지만 인터넷 에서 오랫동안 찾 았 습 니 다.setblocking(0)을 사용 할 수 있 는 것 을 찾 았 지만  소켓 을 비 차단 으로 설정 하지만 구체 적 으로 어떻게 사용 하 는 지 는 밝 히 는 사람 이 별로 없다.자 료 를 찾 은 후에 막 히 지 않 는 recv 방법 은 계속 아래로 실행 되 고 시간 을 초과 하여 데 이 터 를 얻 지 못 하면 이상 을 던 질 수 있다 는 것 을 알 게 되 었 다.
수 정 된 코드 는 다음 과 같 습 니 다.

#coding=utf-8 
#!/usr/bin/env python 
''''' 
author:Mr.Jing 
created on Fri Sep 22 14:29:03 2017 
platfrom:win10,python2.7 
''' 
 
from socket import * 
from time import ctime 
import threading 
import time 
HOST='' 
PORT=2159 
BUFSIZ=1024 
ADDR = (HOST,PORT) 
 
tcpSerSock=socket(AF_INET,SOCK_STREAM) 
tcpSerSock.bind(ADDR) 
tcpSerSock.listen(5) 
socks=[]        #       socket 
 
def handle(): 
 while True: 
  for s in socks: 
   try: 
    data = s.recv(BUFSIZ)  #            
   except Exception, e:   
    continue 
   if not data: 
    socks.remove(s) 
    continue 
   s.send('[%s],%s' % (ctime(), data)) 
 
t = threading.Thread(target=handle)    #    
if __name__ == '__main__': 
 t.start() 
 print u'  %s    ' % threading.current_thread().name #       
 print 'waiting for connecting...' 
 while True: 
  clientSock,addr = tcpSerSock.accept() 
  print 'connected from:', addr 
  clientSock.setblocking(0) 
  socks.append(clientSock) 

이때 다시 시도 하기:

클 라 이언 트 가 마음대로 지면 응답 을 받는다.퀘 스 트 달성!
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기