저는 파이썬 프로그래밍과 소켓에서 새롭기 때문에 비동기 (쓰레딩) SocketServer 예제를 http://docs.python.org/2/library/socketserver.html에서 시작했습니다.파이썬을 가진 쓰레드 된 TCP 소켓
각각의 새로운 연결이 잘, 새 스레드를 생성합니다
ThreadingMixIn 클래스의 예 그러나 나는 전문가를위한 2 개 질문이, 잘 작동합니다. 그러나 스레드 번호가 증가함에 따라 상대방의 연결이 닫히더라도 스레드가 종료되지 않는 것처럼 보입니다.
두 번째 질문은 핸들 방법에 대한 것입니다. 내 클라이언트에서 sendall 함께 2 연속 된 메시지를 보내려고했지만 두 번째 보내기 실패합니다 ... 그것은 실제로 첫 번째 메시지를 기다린 후 처리 메서드를 나타납니다. 나는 일하기 위해 '1 : while'을 추가해야했다.
결론적으로,이 예제는 단지 하나의 메시지 만 수신 할 수있는 스레드를 생성하므로이 예제가 쓸모없고 좋지 않다는 느낌이 들었습니다. 적어도 그것이 그 자체로 종료 될 것이지만 그것은 나를위한 경우 인 것처럼 보입니다 ...
당신의 의견을 보내 주셔서 감사합니다! 당신이 볼 수 있듯이, 때마다 클라이언트의 코드를 실행, 새로운 스레드는 생각도 만들어
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost', 13009))
try:
sock.sendall('hello\n')
response = sock.recv(1024)
print "Received: {}".format(response)
# A second 'send' will generate an error on Windows.
# On Mac, no error but the received message is empty as the
# handle method in the server isn't called for each new message
sock.sendall('how are you?')
response = sock.recv(1024)
print "Received: {}".format(response)
except socket.error, (value,message):
print "Error: " + message
finally:
sock.close()
:
import threading
import SocketServer
class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):
def handle(self):
data = self.request.recv(1024)
cur_thread = threading.current_thread()
response = "{}: {}".format(cur_thread.name, data)
self.request.sendall(response)
class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
pass
if __name__ == "__main__":
server = ThreadedTCPServer(('localhost', 13009), ThreadedTCPRequestHandler)
# Start a thread with the server -- that thread will then start one
# more thread for each request
server_thread = threading.Thread(target=server.serve_forever)
# Exit the server thread when the main thread terminates
server_thread.daemon = True
server_thread.start()
print "Server loop running in thread:", server_thread.name
raw_input("Hit enter to stop the server")
server.shutdown()
그리고 클라이언트의 코드 : 여기
은 서버에 대한 코드입니다 이전 소켓이 닫혔거나 적어도 threading.current_thread()는 새 ID를 반환합니다. 이전 스레드가 중지되었는지 어떻게 확인할 수 있습니까?
작성한 코드를 포함 할 수 있습니까? – dano