C# 使用 NetworkStream 进行异步读写

Posted

技术标签:

【中文标题】C# 使用 NetworkStream 进行异步读写【英文标题】:C# Asynchronous read and write with 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);
        

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于C# 使用 NetworkStream 进行异步读写的主要内容,如果未能解决你的问题,请参考以下文章

Socket网络编程(C#)----同步传输字符串

c# networkstream循环写的方法

C# TCP编程 NetworkStream 的大小?

C# 通过tcp协议向硬件发送命令,networkstream read 读取返回信息时卡死。

如何在 F# 中使用 TcpListener NetworkStream?

C#基础(二十):异步编程