2012-12-31 2 views
1

매번 같은 문제가 발생하는 몇 가지 테스트 클라이언트가 있습니다. 클라이언트는 연결할 수 있고 첫 번째 메시지를 보낼 수는 있지만 그 후에 서버는 해당 클라이언트에 응답하지 않습니다. 이 문제는 s.accept()와 관련이 있다고 의심하지만 정확히 무엇이 잘못되었거나 해결할 방법이 확실하지 않습니다.Python 서버 관련 문제

def startServer(): 
    host = '' 
    port = 13572 
    backlog = 5 
    size = 1024 

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.bind((host,port)) 
    s.listen(backlog) 

    print "Close the command prompt to stop Gamelink" 

    while 1: 
     try: 
      client, address = s.accept() 
      data = client.recv(size) 
      if data: 
       processData(data) 
       client.send("OK") 
      else: 
       print "Disconnecting from client at client's request" 
       client.close() 
     except socket.error, (value, message): 
      if s: 
       print "Disconnecting from client, socket issue" 
       s.close() 
      print "Error opening socket: " + message 
      break 
     except: 
      print "Gamelink encountered a problem" 
      break 
     print "End of loop" 
    client.close() 
    s.close() 

는 서버가 로컬 네트워크를 통해 액세스 할 수 있도록 구성하고, 제발 그것은 가벼운 무게와 반응이 매우 빠르게 할 필요가 있으므로 다른 구현 경우 (예 : 스레드 기반)는 이러한 요구 사항을 충족 더 좋을 것입니다 저에게 알려주세요. 의도 된 응용 프로그램은 원격 게임 키보드로 사용되므로 낮은 리소스 사용과 고속이 필요합니다.

+1

'accept'를 루프 외부에 두어야합니다. 또한이 서버는 하나의 연결 만 허용합니다. 실제 서버가 여러 클라이언트를 지원하려면'select' 나'poll' 같은 연결을 다중화해야합니다. – Keith

+0

하나의 연결은 실제로 내가하려고하는 것에 완벽합니다. 문제가 해결 된 것처럼 보입니다. 감사! –

답변

0

socket을 사용하여 직접 서버를 작성하는 것은 어려울 것입니다. Keith가 말한 것처럼 select 또는 poll 또는 스레드 또는 fork과 같이 어떻게 든 연결을 다중화해야합니다. 하나의 연결 만 필요하다고 생각할 수도 있지만 딸꾹질과 연결이 끊어지면 무엇을 할 것입니까? 연결이 끊어짐을 알지 못하면 서버가 클라이언트의 재 연결 시도에 응답 할 수 있습니까?

네트워킹 요구 사항이 기본이라면 다른 모든 것을 듣고 받아들이고 처리 할 수 ​​있습니다. 플랫폼을 지정하지는 않지만 그러한 프로그램의 예로는 Mac OS에서는 launchd이고 Linux에서는 xinetd입니다. 세부 사항은 이들 도구마다 다르지만 기본적으로 일부 구성 파일에서 일부 포트에서 연결을 수신 대기하도록 구성합니다. 그들이 그것을 얻을 때, 그들은 연결을 설정하는 것을 처리합니다. 그러면 stdinstdout을 가진 여러분의 프로그램이 소켓을 겨냥합니다. 따라서 여러분은 아마 이미 알고있는 기본 IO를 printsys.stdin.read()처럼 간단하게 사용할 수 있습니다.

xinitd 및 launchd와 같은 솔루션의 문제는 새로운 연결마다 fork()exec()이 프로그램의 새 인스턴스 여야한다는 것입니다. 이것은 비교적 무거운 작업이므로 많은 수의 연결이나 새로운 연결 속도가 서버의 한계에 부딪 힐 수 있습니다. 그러나 각 연결은 별도의 프로세스에 있기 때문에 서로간에 데이터를 공유하는 것은 어렵습니다. 또한 프로세스간에 통신 할 수있는 대부분의 솔루션에는 blocking API이 포함되어 있으며 이제는 select 또는 스레드 또는 이와 유사한 방법으로 멀티플렉싱 문제로 돌아 왔습니다.

이것이 귀하의 요구를 충족시키지 못한다면, 나는 당신이 socket의 경로를 따라 가면 필연적으로 마주 치게 될 모든 문제를 다룰 높은 수준의 네트워킹 프레임 워크를 사용하는 것을 배우는 것이 더 나을 것이라고 생각합니다. 제안 할 프레임 워크는 Twisted입니다. 커넥션 처리의 세세한 부분을 다루는 것 외에도 IO 사이에 IO를 멀티플렉싱하는보다 복잡한 작업을 수행하는 경우 프로토콜을 훨씬 쉽게 구현할 수있는 거대한 툴 라이브러리가 있습니다.