0

こんにちは、私はこの問題を抱えています。

私はソケット チャット (クライアント サーバー) モジュールを構築する必要があり、作業のほぼ 80% を完了しましたが、今は立ち往生しています。シナリオは、サーバー アプリがあり、4 つのクライアントがサーバーに接続されている場合、クライアントがそれに接続するというものです。それぞれが互いに通信できます.1つのクライアントがメッセージを送信し、サーバーがそのメッセージを受信して​​渡します.これは非常にうまく機能していますが、2つ以上のクライアントが同時に3番目のクライアントにメッセージを送信すると. 1 つのメッセージを取得せず、クライアントが切断される キュー構造を構築する必要があることはわかっていますが、成功していません ここに私のコード構造があります

StartReceive(SocketAsyncEventArgs) ->

まず、このメソッドを呼び出して、着信メッセージのリッスンを開始します

そして、1つのメッセージを受け取ったら、同期または非同期が完了したかどうかを確認します

この後、1つの受信操作が完了するたびに呼び出されるio完了リスナーがあり、そのio完了メソッドで、受信したチャンクを処理するために使用されるprocessReceiveメソッドを呼び出すので、最終的に私のコード構造はこのようになります

StartReceive-> IO Completed -> ProcessReceive

すべてのクライアントがサーバー側で Receive SOCKETASYNCEVENTAGRS オブジェクトと Send SOCKETASYNCEVENTAGRS オブジェクトを持つように構造を設計し、このためのプールを維持します

したがって、各クライアントは独自の SOCKETASYNCEVENTAGRS オブジェクトを介してデータを送受信します

2 つ以上のクライアントが 3 番目のクライアントよりも 3 番目のクライアントにメッセージを送信する場合、3 番目のクライアントがすべてのメッセージを同時に受信するのではなく、代わりにキュー構造を持ち、一度に 1 つのメッセージを受信し、送信操作でも同じようにするシナリオが必要です

ここに私のコードの一部があります

  private void StartReceive(SocketAsyncEventArgs receiveSendEventArgs)
    {
        DataHoldingUserToken receiveSendToken = (DataHoldingUserToken)receiveSendEventArgs.UserToken;
        receiveSendEventArgs.SetBuffer(receiveSendToken.bufferOffsetReceive, this.socketListenerSettings.BufferSize);                    
        bool willRaiseEvent = receiveSendEventArgs.AcceptSocket.ReceiveAsync(receiveSendEventArgs);
        if (!willRaiseEvent)
        {

            ProcessReceive(receiveSendEventArgs);                
        }            
    }

これは IO 完了です

 void IO_Completed(object sender, SocketAsyncEventArgs e)
    {
        DataHoldingUserToken receiveSendToken = (DataHoldingUserToken)e.UserToken;
        switch (e.LastOperation)
        {
            case SocketAsyncOperation.Receive:                
                ProcessReceive(e);
                break;

            default:
        }
    }

これは Queue が実装された私の StartReceive ですが、機能していません

 Queue rec = new Queue();
    bool IsExecuted = true;
    private void StartReceive(SocketAsyncEventArgs receiveSendEventArgs)
    {
        if (IsExecuted)
        {
            DataHoldingUserToken receiveSendToken = (DataHoldingUserToken)receiveSendEventArgs.UserToken;
            rec.Enqueue(receiveSendToken);
        }
        try
        {
            receiveSendEventArgs.SetBuffer(receiveSendToken.bufferOffsetReceive, this.socketListenerSettings.BufferSize);
            bool willRaiseEvent = receiveSendEventArgs.AcceptSocket.ReceiveAsync(receiveSendEventArgs);
            if (!willRaiseEvent)
            {

                ProcessReceive(receiveSendEventArgs);
            }
            rec.Dequeue();
            IsExecuted = true;
        }
        catch
        {
            IsExecuted = false;
            StartReceive(receiveSendEventArgs);
        }
    }

まともな助けや良い方向を探している

4

1 に答える 1

1

これが問題の根本的な原因であるかどうかはわかりませんがDataHoldingUserToken、デキューしたオブジェクトで何もしていないため、いつか不足しているように思えます。したがって、それを捨てています。

また、自明でないオブジェクトには汎用形式の Queue クラスを使用することをお勧めします。それはそうでしょうSystem.Collections.Generic.Queue<DataHoldingUserToken>

于 2013-08-19T10:14:53.823 に答える