我已经构建了一个服务器,它接收来自客户端的请求,并根据请求类型给出响应。如果请求类型是流式传输,则服务器必须发送数据阵列。在服务器的流数据时,客户端可以发送停止请求以停止流式传输。如果请求和响应在同一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);
}
使用此代码,我与客户端连接,将数据发送到客户端。但是在流式传输所有数据之前,我仍然无法接收停止请求。请告诉我解决问题的正确方法。谢谢。
答案 0 :(得分:0)
我认为您可以尝试使用多线程来解决此问题。我遇到过这种情况,多线程是一个很好的解决方案。您可以创建要写入的线程和要读取的线程。