首页 新闻 会员 周边 捐助

TCP Server 长连接问题求助!!!!

0
悬赏园豆:20 [待解决问题]

应用场景

小弟这边需要用TCP Server服务端,接收来自客户端提交过来的数据,

只要客户端一提交数据,服务端就给客户端回应一条指令。

TCP服务端和客户端需要一直连接,不能断开。

我负责服务端代码接收和回发指令,客户端是C语言控制板提交上来的数据,现在的问题是TCP客户端会隔断时间掉线,请问是我代码问题吗??

 

代码如下:

 

        //打开TCP连接
        private void SocketInit()
        {
            try
            {
                //创建一个新的Socket,这里我们使用最常用的基于TCP的Stream Socket(流式套接字)
                var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                //将该socket绑定到主机上面的某个端口
                //方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspx
                socket.Bind(new IPEndPoint(IPAddress.Any, 8000));

                //启动监听,并且设置一个最大的队列长度
                //方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspx
                socket.Listen(200);

                //开始接受客户端连接请求
                //方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginaccept.aspx
                socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);
            }
            catch (Exception ex)
            {
                Trace.Write(ex, "门禁通道错误");
                MessageBox.Show("门禁通道错误:" + ex.Message);
            }

        }
        public void ClientAccepted(IAsyncResult ar)
        {
            var socket = ar.AsyncState as Socket;

            //这就是客户端的Socket实例,我们后续可以将其保存起来
            var client = socket.EndAccept(ar);

            //给客户端发送心跳指令,保持连接
            var timer = new System.Timers.Timer();
            timer.Interval = 1000D;
            timer.Enabled = true;
            timer.Elapsed += (o, a) =>
            {
                //检测客户端Socket的状态
                if (client.Connected)
                {
                    try
                    {
                        string str = "1 48 48 48 48 48 48 48 73 67 2 67 54 52 56 13";
                        byte[] send = ConvertData(DelSpace(str));
                        client.Send(send);
                    }
                    catch (SocketException ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                }
                else
                {
                    timer.Stop();
                    timer.Enabled = false;
                }
            };
            timer.Start();

            //接收客户端的消息(这个和在客户端实现的方式是一样的)
            client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), client);

            //准备接受下一个客户端请求
            socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);
        }

        static byte[] buffer = new byte[1024];

        public void ReceiveMessage(IAsyncResult ar)
        {
            try
            {
                var socket = ar.AsyncState as Socket;

                //方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspx
                var length = socket.EndReceive(ar);
                //处理接收数据
                if (length == 50)
                {
                    string temp = GetDataStr(buffer);
                    if (length > 16)
                    {
                        string strcmd = temp.Substring(29, 6);
                        string cardID = temp.Substring(71, 24).Trim();
                        cardID = strReplace(cardID);
                        string cardNumber = ConverToTen(cardID);
                        bool result = true;//vm.VisitorInfo.SwingCardHandleMain(cardNumber);

                        //给客户端发送指令
                        string str = string.Format(@"01 30{0} 30 30 30 30 4A 41{1} 02 34 31 39 37 0D", strcmd, strcmd);
                        byte[] send = ConvertData(DelSpace(str));
                        socket.Send(send);
                    }
                }

                socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
            }
            catch (Exception ex)
            {
                MessageBox.Show("门禁通道错误:" + ex.Message);
            }


        }

 

 

 

问题补充:

是我给客户端发送的心跳有问题吗??已经被这个问题困了两天。。。。

逍然的主页 逍然 | 初学一级 | 园豆:3
提问于:2016-06-18 17:17
< >
分享
所有回答(1)
0

你服务器没有问题。你有一个观念是错误的,心跳包应该是客户端主动向 服务器发的,客户端应该时时向服务器报告它的状态。客户端隔一段时间就掉线,应该是客户端那边出了问题。

需要格局 | 园豆:2145 (老鸟四级) | 2016-06-20 10:59
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册