0

単純なクライアントメッセージによって管理されるサーバーのクラスを適切な方法でどのように設計しますか?このサーバーは、イベントモデルを使用して、クライアント要求について親アプリケーションに通知します。非同期ソケットを使用します。サーバーの負荷はおそらく非常に限られています。

これは私が試みることです:

class Client
{
private Socket sock;

public event EventHandler Start;
public event EventHandler Stop;
public event RequestEventHandler Request;

public Client(TcpClient Client)
//sock.BeginReceive

private void OnReceived(IAsyncResult ar)
//Dissect incoming stream into messages
//Call event handlers
//sock.BeginReceive

public void AnswerRequest(byte[] answer) //either this way or
private void OnSend(IAsyncResult ar)     //direct call of sock.BeginSend
}

class Server
{
private TcpListener Listener;
public List<Client> Clients;

public event EventHandler ClientConnected;

public Server(int port)
//Listener.BeginAcceptTcpClient

private void AcceptTcpClientCallback(IAsyncResult ar)
//Get TcpClient
//Create new Client with TcpClient as a parameter
//Launch ClientConnected, where one should sign for Client events
//Listener.BeginAcceptTcpClient
}
4

2 に答える 2

0
   How would one design a class for server, which is managed by simple client messages,
   in a proper way? 

使用する I/O ストラテジによって異なります。Winsock との通信にはいくつかの異なる規則があり、それぞれの方法には明確な利点があります。

  • ブロッキングソケット
  • ピュア ノンブロッキング ソケット
  • 非同期ソケット
  • 選択する()
  • イベント オブジェクト
  • オーバーラップ I/O

非同期クライアント ソケットのクラス設計: Stateobject をコールバックに追加します。クライアント ソケットからデータを読み取るには、非同期呼び出し間で値を渡す状態オブジェクトが必要です。

          public class StateObject 
         {
            public Socket workSocket = null; 
            public const int BufferSize = 256;   
            public byte[] buffer = new byte[BufferSize];
            public StringBuilder sb = new StringBuilder();
         }

ソース :詳細な設計については、 msdn サンプルを参照してください。

于 2013-01-22T09:18:33.950 に答える
0

私は nito 非同期ライブラリを使用しています。それには simpleserversocket と simple client があります。非常に使いやすいです。 にと非同期

于 2013-01-22T08:25:55.233 に答える