应用场景:
小弟这边需要用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); } }
是我给客户端发送的心跳有问题吗??已经被这个问题困了两天。。。。
你服务器没有问题。你有一个观念是错误的,心跳包应该是客户端主动向 服务器发的,客户端应该时时向服务器报告它的状态。客户端隔一段时间就掉线,应该是客户端那边出了问题。