こんにちは、私はこの問題を抱えています。
私はソケット チャット (クライアント サーバー) モジュールを構築する必要があり、作業のほぼ 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);
}
}
まともな助けや良い方向を探している