C # Асинхронное чтение и запись с NetworkStream - PullRequest
2 голосов
/ 21 августа 2011

Я построил сервер, который получает запросы от клиента и дает ответ, который зависит от типа запроса. Если тип запроса потоковый, сервер должен отправить массив данных. Во время потоковой передачи данных сервер может отправить запрос на остановку, чтобы остановить потоковую передачу. Если запрос и ответ передаются по одному и тому же 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());
         }
       }
}

В функции Process класса ClientInteraction:

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);
        }

С этим кодом я связался с клиентом, отправил данные клиенту. Но я все еще не могу получить запрос на остановку, пока все данные не будут переданы. Пожалуйста, покажи мне правильный способ решить мою проблему. Спасибо.

1 Ответ

0 голосов
/ 22 августа 2011

Я думаю, вы можете попробовать использовать многопоточность для решения этой проблемы.Я встретил это обстоятельство, и многопоточность - хороший выбор для решения.Вы можете создать поток для записи и поток для чтения.

...