クライアントからリクエストを受信し、リクエスト タイプに応じたレスポンスを返すサーバーを構築しました。リクエスト タイプがストリーミングの場合、サーバーはデータ配列を送信する必要があります。サーバーがデータをストリーミングしている間、クライアントは停止要求を送信してストリーミングを停止する場合があります。要求と応答が同じ TCP 接続で転送される場合、サーバーは、すべてのデータがクライアントへのストリーミングを終了したときにのみ停止要求を受信します。この問題を解決するには、非同期書き込みを使用する必要があると思います。これは私のコードです:
最初に、クライアントからの接続を受信するためのループ バックを作成します。
while (!done)
{
try
{
Socket socket = listener.AcceptSocket();
ClientInteraction clIr = new ClientInteraction(socket, statusList);
Thread thread = new Thread(new ThreadStart(clIr.Process));
thread.Start();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
}
ClientInteraction クラスの In Process 関数:
Public void Process()
{
ns = new NetworkStream(socket);
while (true)
{
try
{
this.myReadBuffer = new byte[socket.ReceiveBufferSize];
this.numberOfBytesRead = ns.Read(myReadBuffer, 0, myReadBuffer.Length);
}
catch
{
break;
}
if (numberOfBytesRead == 0)
{
break;
}
else
{
HandleRequest(myReadBuffer, numberOfBytesRead);
}
}
}
HandleRequest 関数では、リクエストが STREAM の場合、配列内のデータをクライアントに送信します。
Public void HanldeRequest(……)
{
myCompleteMessage = "";
myCompleteMessage =
String.Concat(myCompleteMessage, Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead));
If(myCompleteMessage == “Stream”)
{
//I get data and call SendData function
foreach(.......)
{
//get data
........
SendData(data);
}
}
}
public void SendData(byte[] data)
{
try
{
//ns.Write(data, 0, data.Length);
ns.BeginWrite(data, 0, data.Length, new AsyncCallback(StreamData), null);
}
catch
{
}
}
public void StreamData(IAsyncResult asynResult)
{
if(asynResult != null)
ns.EndWrite(asynResult);
}
このコードで、クライアントに接続し、データをクライアントに送信します。しかし、すべてのデータがストリーミングされるまで、停止要求を受信できません。私の問題を解決する正しい方法を教えてください。ありがとうございました。