2013-01-15 1 views
0

스레드 된 http 서버를 만들려고합니다. 웹 브라우저를 통해이 서버에 연결할 때 서버가 멈추기 전에 단 한가지를 얻을 수 있습니다. 이것이 일어날 특별한 이유가 있습니까?파이썬 스레드 서버 한 번만 검색

import socket 
from threading import Thread 
class http(): 
    def __call__(): 
     return 0 
    def site(self): 
     try: 
      s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
      s.bind(("localhost", 5124)) 
      s.listen(2) 
     except socket.error, (value,message): 
      if s: 
       s.close() 
       return 2 
     c, addr = s.accept() 
     s = c.recv(1024) 
     print s 
     c.send("test") 
     c.close() 
     return s 

serve = http() 

def happy(): 
    while True: 
     serve.site() 

if __name__ == '__main__': 
    Thread(target = happy()).start() 

답변

1

try target = happy, 괄호 안 함.

+0

같은 것은 내가 OP 프로그램의 모든 코드를 포함한다고 가정이이 프로그램의 동작에 영향 안되는 errno를 9 잘못된 파일 설명 – KI4JGT

+0

을 얻고있다. 'Thread' 생성자에서'happy()'가 사용되면'happy'가 실행되지만 반환되지 않으므로'Thread' 객체는 결코 생성되지 않습니다. 그러나 이것이 의미하는 바는 서버 코드가 새로운 스레드가 아니라 원래의 실행 스레드에서 실행된다는 것입니다. 스레드를 생성 한 후에 아무 일도 일어나지 않기 때문에 프로그램의 동작을 변경하지 않습니다. – Emily

1

소켓이 TIME_WAIT 상태를 벗어나기 전에 연결을 닫고 다시 연결하려고하면 문제가 발생합니다. socket.SO_REUSEADDR 소켓 옵션을 사용하거나 매번 무작위 포트를 사용해보십시오.

import socket 


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind(("localhost", 1234)) 
s.listen(2) 
print 'listening on port %s' % s.getsockname()[1] 
while True: 
    c, addr = s.accept() 
    buf = c.recv(1024) 
    c.send(buf) 
    c.close() 
+0

이 때마다 포트를 변경하는 것 외에 더 나은 방법이 있습니까? – KI4JGT

+0

예, 처음 대답에서 말했듯이. 더 좋은 예를 들어 답을 다시 보아라. –