2011-09-12 4 views
0

내가 만들고있는 게임을위한 C# 서버를 만들고 멀티 스레딩 및 소켓 프로그래밍에 익숙하지 않습니다. 내 서버는 여러 개의 클라이언트를 모두 별도의 스레드로 유지할 수 있어야합니다. 내 서버는 콘솔 응용 프로그램으로 실행됩니다. 내 유일한 문제는 내 테스트 클라이언트 중 하나가 응용 프로그램을 종료 할 때 실행중인 스레드를 중지하는 방법을 모른다는 것입니다. 어떻게 실행중인 스레드를 중지합니까?게임 서버 멀티 스레딩 오류

+0

클라이언트 당 스레드를 사용하면 안됩니다. [뻔뻔한 플러그] (http://jonathan.dickinsons.co.za/blog/2011/02/net-sockets-and-you/) - try/catch는 스레드를 '끝내는 곳'입니다. –

답변

0

당신의 스레드는 기본적으로 클라이언트로부터의 요청을 기다린 후 응답을 처리하는 메시지 처리 스레드라고 가정합니다. 이 경우 스레드의 기본 루프는 아래의 HandleClientRequests 메소드와 비슷하게 보일 수 있습니다. 이 예에서는 정상적인 연결 해제를 가정합니다. 또한 강력한 구현은 클라이언트가 적절한 종료 시퀀스를 실행하지 않고 연결을 끊거나 연결이 실패 할 가능성을 설명합니다. 경우, 당신은 방법 ThreadStart하든

public class ClientConnection { 
    private Socket _socket;   

    public ClientConnection(Socket socket) { 
     _socket = socket; 
     new Thread(HandleClientRequests); 
    } 

    /* snip */ 

    public void HandleClientRequests() { 
     bool disconnectRequested = false; 
     while(!disconnectRequested) { 
      var message = ReadNextMessageFromSocket(); 
      if(message.Type == MessageType.CloseConnection) { 
       disconnectRequested = true; 
      } else { 
       //service request and send response 
      } 
     } 
     ShutdownConnection(); 
     //after this point the thread terminates 
    } 
} 

은 일반적으로 당신이 당신이 당신의 스레드가 원하는 무엇이든 할 수있는 내에서 루프의 어떤 종류를해야하고, 그 루프는 신호하는 데 사용되는 조건이 있어야합니다 스레드가 종료 될 시간입니다.

0

스레드는 함수가 반환 될 때 끝납니다. 스레드는 클라이언트가 멀리 떨어져 스레드 루프에서 벗어 났음을 인식해야합니다.