gpt4 book ai didi

C#使用NetworkStream异步读写

转载 作者:太空宇宙 更新时间:2023-11-03 16:42:09 27 4
gpt4 key购买 nike

我构建了一个服务器,它接收来自客户端的请求并根据请求类型给出响应。如果请求类型是流,服务器必须发送数据数组。当服务器的流式传输数据时,客户端可以发送停止请求来停止流式传输。如果请求和响应在同一个 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#使用NetworkStream异步读写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7140281/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com