2013-06-09 3 views
2

파이썬에서 내 게임을위한 UDP 서버/클라이언트를 만들려고 완전히 망가졌습니다. 나는 언어에 익숙하지 않고 네트워킹에 대한 경험이 제한적입니다. 지금 당장은 서버가 실행되지만 클라이언트에서 메시지를받지 못하는 것 같습니다.Python 게임 서버

서버 :

class GameServer: 
    class GameServerUDPHandler(socketserver.BaseRequestHandler): 
     def handle(self): 
      data = self.request[0].strip() 
      socket = self.request[1] 
      print("{} wrote:".format(self.client_address[0])) 
      print(data) 
      socket.sendto(data.upper(), self.client_address) 

    def __init__(self, port): 
     self.server = socketserver.UDPServer(("localhost", port), self.GameServerUDPHandler) 

    def start_server(self): 
     self.server.serve_forever(

클라이언트 : 프로그램의

import socket 
import sys 

class GameClient: 
    def __init__(self, port, host): 
     self.port = port 
     self.host = host 
     self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 

    def register(self): 
     self.socket.sendto(bytes("register\n", "utf-8"), (self.host, self.port)) 
     self.numberID = int(self.socket.recv(1024)) 
     print("Received: {}".format(self.numberID)) 

- 주요/시작

import gameserver 
import gameclient 

if __name__ == "__main__": 
    server = gameserver.GameServer(1300) 
    server.start_server() 
    client = gameclient.GameClient(1300, "localhost") 
    client.register() 

참고 : 내가 잘못 여러 가지 가능성이 가장 높은 해요 및 위반 될 수 있습니다 언어의 몇 가지 모범 사례. 나는 정말로 단서가 없다.

+1

방금 ​​전 파이썬을 배웠다는 것을 알고 있습니다. 귀찮은 네트워킹을하고 싶다면 또 다른 프레임 워크를 배우는 것이 좋습니다. [Twisted] (http://twistedmatrix.com/)를 참조하십시오. – kirelagin

+0

@kirelagin 감사. 나는 몇 시간 동안 Twisted를 아무 쓸모없이 설치하려했기 때문에 (특히 Mac에서 python2에만 설치되고 오류 때문에 python3에서는 작동하지 않을 것입니다.) 많은 시간을 보냈습니다. –

+1

아, 맞습니다. 그들에게는 [파이썬 3.3에서 작동하게하는 계획]이 있습니다. (http://twistedmatrix.com/trac/wiki/Plan/Python3) 그러나 나는 그들의 진보가 어떨지 확신하지 못합니다 ... 당신의 최선의 선택은 전환이 걱정됩니다. 왜냐하면 Twisted없이 ntwork 프로그래밍이 고통이기 때문이다. – kirelagin

답변

3

문제는 이러한 호출 중 일부가 차단되고 있다는 것입니다. 특히, serve_forever() 방법은 영원히 실행됩니다, 그래서 당신은 당신이 당신의 프로그램의 나머지 부분을 계속하려는 경우 별도의 스레드에 그것을 넣어해야합니다

import threading 
if __name__ == "__main__": 
    server = GameServer(1300) 
    server_thread = threading.Thread(target=lambda: server.start_server()) 
    server_thread.start() 

    time.sleep(1) # Give it time to start up; not production quality code of course 

    client = GameClient(1300, "localhost") 
    client.register() 

socket.recv()

도 차단 호출입니다하지만에 괜찮을 수도 있습니다 이 경우.

+0

제출 된대로 스레드에서 실행되도록 변경했습니다. 처음에는 별도의 스레드에서 실행되었다고 가정했습니다. 감사! –

1

이 라이브러리와 같은 것처럼 보이지 않으므로 serve_forever에 대한 첫 번째 호출이 반환되지 않고 클라이언트가 시작되지 않습니다. 서버를 시작하거나 클라이언트와 서버를 별도의 프로세스로 분할하기 위해 새 스레드를 작성할 수 있습니다.