2

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

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

4

1 回答 1

0

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

于 2011-08-22T03:24:57.483 回答