2

クライアントからリクエストを受信し、リクエスト タイプに応じたレスポンスを返すサーバーを構築しました。リクエスト タイプがストリーミングの場合、サーバーはデータ配列を送信する必要があります。サーバーがデータをストリーミングしている間、クライアントは停止要求を送信してストリーミングを停止する場合があります。要求と応答が同じ 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);
        }

このコードで、クライアントに接続し、データをクライアントに送信します。しかし、すべてのデータがストリーミングされるまで、停止要求を受信できません。私の問題を解決する正しい方法を教えてください。ありがとうございました。

4

1 に答える 1

0

マルチスレッドを使用してこの問題を解決できると思います。私はこの状況に遭遇しており、解決するにはマルチスレッドが適しています。書き込むスレッドと読み取るスレッドを作成できます。

于 2011-08-22T03:24:57.483 に答える