异步TCPClient缺少来自服务器的回复

时间:2016-05-26 13:30:29

标签: c# asynchronous tcpclient

我正在尝试实现一个异步TCP客户端,它从队列发送消息并侦听响应。 一些服务器回复丢失(例如发送7条消息,只得到4条回复),我不明白为什么。

这不是服务器问题,因为我测试的同步版本工作正常。

ConcurrentQueue<byte[]> msgQueue = new ConcurrentQueue<byte[]>();

 public void Connect()
        {
            try
            {
                tcpclnt = new TcpClient();
                Console.WriteLine("Connecting.....");
                Task.Factory.StartNew(() =>
                {
                    IAsyncResult res = tcpclnt.BeginConnect(_ip, _port, null, null);
                    if (!res.AsyncWaitHandle.WaitOne(CONNECTION_TIMEOUT_SEC * 1000))
                    {
                        tcpclnt.Close();
                        throw new ApplicationException("timed out trying to connect");
                    }
                    tcpclnt.EndConnect(res);
                    Receive();

                    byte[] message = null;
                    while (true)
                    {
                        message = null;
                        msgQueue.TryDequeue(out message);
                        if (message != null)
                        {
                            Stream stm = tcpclnt.GetStream();
                            Console.WriteLine("Transmitting..... " + Thread.CurrentThread.ManagedThreadId);//for debug 
                            stm.Write(message.ToArray(), 0, message.ToArray().Length);
                            Receive();
                        }
                    }
                });

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());

            }

        }
        //will be called from outside
        public void SendMessage(byte[] msg)
        {
            Console.WriteLine("SendMessage..... " + Thread.CurrentThread.ManagedThreadId);//for debug 
            msgQueue.Enqueue(msg);

        }
        private void Receive()
        {
            SocketError error;
            byte[] buffer = new byte[MAX_BUFFER_SIZE];
            tcpclnt.Client.BeginReceive(buffer, 0, MAX_BUFFER_SIZE, SocketFlags.None, out error, new AsyncCallback(ReceiveHandler), buffer);
        }

        private void ReceiveHandler(IAsyncResult ar)
        {
            System.Console.WriteLine("ReceiveHandler " + Thread.CurrentThread.ManagedThreadId); //for debug 
            //End current async receive
            int bytesRead = tcpclnt.Client.EndReceive(ar);
            byte[] resultBuffer = (byte[]) ar.AsyncState;
            // do a lot of things with resultBuffer
        }

0 个答案:

没有答案