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)
이때 다시 시도 하기:클 라 이언 트 가 마음대로 지면 응답 을 받는다.퀘 스 트 달성!
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.