C#使用NetworkStream进行异步读写

时间:2011-08-21 18:41:18

标签: c# sockets asynchronous asyncsocket networkstream

我已经构建了一个服务器,它接收来自客户端的请求,并根据请求类型给出响应。如果请求类型是流式传输,则服务器必须发送数据阵列。在服务器的流数据时,客户端可以发送停止请求以停止流式传输。如果请求和响应在同一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类的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);
        }

使用此代码,我与客户端连接,将数据发送到客户端。但是在流式传输所有数据之前,我仍然无法接收停止请求。请告诉我解决问题的正确方法。谢谢。

1 个答案:

答案 0 :(得分:0)

我认为您可以尝试使用多线程来解决此问题。我遇到过这种情况,多线程是一个很好的解决方案。您可以创建要写入的线程和要读取的线程。