【问题标题】:C# Asynchronous read and write with NetworkStreamC# 使用 NetworkStream 进行异步读写
【发布时间】:2011-10-31 16:50:41
【问题描述】:

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

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

【问题讨论】:

    标签: c# sockets asynchronous asyncsocket networkstream


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-29
      • 1970-01-01
      • 2011-08-14
      • 1970-01-01
      相关资源
      最近更新 更多