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 进行异步读写的主要内容,如果未能解决你的问题,请参考以下文章
C# 通过tcp协议向硬件发送命令,networkstream read 读取返回信息时卡死。