2011-03-29 2 views
1

비동기 객체 전송에 접근하는 가장 좋은 방법을 찾으려고합니다.C# 비동기 객체 전송 (소켓?)

하나의 서버에 연결하는 네트워크 연결 (5-10 클라이언트)에서 동일한 응용 프로그램의 여러 인스턴스를 열어 놓고 응용 프로그램 중 하나가 데이터를 업데이트 할 때 해당 업데이트를 전송해야합니다. 다른 모든 인스턴스들에게.

업데이트 목적이 유사합니다 : 데이터가 매우 큰되지 않습니다

public class UpdateData 
{ 
    public double Angle { get; set; } 
    public double Azimuth { get; set; } 
    public Point Position { get; set; } 
    public Guid ObjectGuid { get; set; } 
} 

하지만 이러한 유형의 객체는 각 클라이언트에서 초당 약 10 ~ 50 시간 전송됩니다 모든 다른 클라이언트.

이러한 종류의 데이터 전송을 처리하는 가장 좋은 방법은 무엇입니까?

private void BtConnectClick(object sender, EventArgs e) 
    { 
     int port; 

     if (!int.TryParse(tbPort.Text, out port)) 
     { 
      MessageBox.Show("Please enter a valid port into the textbox"); 
      tbPort.Text = ""; 
      return; 
     } 

     try 
     { 
      _listener = new TcpListener(IPAddress.Any, port); 
      _listener.Start(); 

      _listener.BeginAcceptSocket(OnClientConnect, _listener); 

     } 
     catch (SocketException se) 
     { 
      MessageBox.Show(se.Message); 
     } 

    } 

    public void OnClientConnect(IAsyncResult asyn) 
    { 
     try 
     { 
      var s = _listener.EndAcceptSocket(asyn); 

      _clients.Add(s); // List<Socket> object 
     } 
     catch (SocketException se) 
     { 
      MessageBox.Show(se.Message); 
     } 
    } 

그러나이 방법 서버가 데이터 전송을 처리해야 :

는 서버 객체가 듣고이 비슷한을 사용하여 연결을 허용해야 내가 생각입니까?

_clients의 모든 소켓에서 데이터를 수신해야한다는 것을 알고 있고 데이터를 수신하면 _clinets에있는 다른 모든 소켓으로 전달해야하지만 어떻게해야합니까? 클라이언트가 연결을 언제 종료했는지 어떻게 그리고 어디서 발견해야합니까?

또한 클라이언트는 서버에서 데이터를 수신 할뿐만 아니라 서버에서 데이터를 수신해야합니다. 하나의 소켓으로 모든 것을 처리 할 수 ​​있습니까? 아니면 2를 사용해야합니까?

도움 주셔서 감사합니다.

+0

궁금합니다 ... 직접해야합니까? 사전 압연 된 다수의 메시지 버스가 있습니다. 젠장, 당신은이 redvis를 꽤 사소하게 사용할 수 있습니다. (pub/sub) ... –

+0

나는 그것을 스스로 할 필요가 없습니다. 나는 완전히 familleary 'redis'아니에요, 당신은 정교한 수 있을까요? –

+0

redis는 엄밀히 말하면 * (무료) 캐시 서버이지만 pub/sub를 포함합니다. 청취자가 일부 채널에 SUBSCRIBE를 발행하면 게시자는 해당 채널에 PUBLISH를 발행합니다. 따라서 전송 한 데이터의 청크가 모든 청취자에게 배포됩니다. 당신은 C# 바인딩을 쉽게 찾을 수 있습니다. 또는 제프가 미니 프로젝트로 릴리즈 할 수 있도록 완전히 비동기식입니다. –

답변

1

개인적으로, 저는 이것을 메시지 버스/서비스 버스 또는 pub/sub가있는 다른 것으로 남겨 두었습니다. 내 취향이 redis 될 것입니다 : http://redis.io/commands#pubsub

개체, 나는 protobuf-net을 사용합니다. 간단히 말해서 위의 메시지에 대한 작은 바이너리를 생성 할 것입니다. BLOB를 명명 된 redis 채널로 보내면 (PUBLISH) 해당 채널의 모든 리스너에 BLOB가 배포됩니다.

+0

좋아, 이것은 확실히 쉬운 일이다. 감사! –