socket长连接,心跳包怎么实现啊
最近在做软件和硬件的开发 要用到socket和硬件去联系,我这边是服务端,是socket长连接形式,可以打开多个客服端和我这边服务端通信,正常通信 接受和发送都实现了 没问题,现在就是 客服端会每隔30秒给我发一个心跳包过来检测是否与服务端还是正常连接,所以每个客服端发过来的心跳包我不想去数据库建立一个表去存它的心跳数据 那样数据太多了。在代码里面怎么实现啊,现在就卡这里了,请各位大神帮帮忙啊。下面是我的所有代码!
{
public Service1()
{
InitializeComponent();
}
System.Timers.Timer timer;
private StreamWriter streamWriter; //写文件
Thread threadWatch = null; // 负责监听客户端连接请求的 线程;
Socket socketWatch = null;
private string host = ConfigurationManager.AppSettings["ip"].ToString();
private int port = int.Parse(ConfigurationManager.AppSettings["port"].ToString());
private int second = int.Parse(ConfigurationManager.AppSettings["second"].ToString());
DBAll db = new DBAll();
protected override void OnStart(string[] args)
{
btnBeginListen();
timer = new System.Timers.Timer();
timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
timer.Interval = second * 1000;
timer.Enabled = true;
timer.Start();
}
protected override void OnStop()
{
WriteError("服务已经停止了!");
}
//socket开启
public void btnBeginListen()
{
// 创建负责监听的套接字
socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress address = IPAddress.Parse(host);
// 创建包含ip和端口号的网络节点对象;
IPEndPoint endPoint = new IPEndPoint(address, port);
try
{
// 将负责监听的套接字绑定到唯一的ip和端口上;
socketWatch.Bind(endPoint);
}
catch
{
return;
}
// 设置监听队列的长度;
socketWatch.Listen(100);
// 创建负责监听的线程;
threadWatch = new Thread(WatchConnecting);
threadWatch.IsBackground = true;
threadWatch.Start();
//}
}
/// <summary>
/// 监听客户端请求的方法;
/// </summary>
void WatchConnecting()
{
while (true) // 持续不断的监听客户端的连接请求;
{
// 开始监听客户端连接请求,Accept方法会阻断当前的线程;
Socket sokConnection = socketWatch.Accept(); // 一旦监听到一个客户端的请求,就返回一个与该客户端通信的 套接字;
// 客户端的IP信息;
// WriteError(sokConnection.RemoteEndPoint.ToString());
Thread thr = new Thread(RecMsg);
thr.IsBackground = true;
thr.Start(sokConnection);
}
}
/// <summary>
/// 接受信息的方法
/// </summary>
/// <param name="sokConnectionparn"></param>
void RecMsg(object sokConnectionparn)
{
Socket sokClient = sokConnectionparn as Socket;
//List<byte> byteList = new List<byte>();
//int length = -1;
//do
//{
// // 定义一个1M的缓存区;
// byte[] arrMsgRec = new byte[1024];
// // 将接受到的数据存入到输入 arrMsgRec中;
// try
// {
// length = sokClient.Receive(arrMsgRec); // 接收数据,并返回数据的长度;
// byteList.AddRange(arrMsgRec);
// if (length < byteList.ToArray().Length)
// {
// string strMsg = System.Text.Encoding.Default.GetString(byteList.ToArray(), 0, length);// 将接受到的字节数据转化成字符串;
// handleData(strMsg, sokClient);
// }
// }
// catch
// {
// break;
// }
//} while (true);
do
{
byte[] arrMsgRec = new byte[1024];
try
{
int length = sokClient.Receive(arrMsgRec); // 接收数据,并返回数据的长度;
string strMsg = System.Text.Encoding.Default.GetString(arrMsgRec, 0, length);// 将接受到的字节数据转化成字符串;
handleData(strMsg, sokClient);
}
catch
{
break;
}
} while (true);
}
/// <summary>
/// 处理数据的方法
/// </summary>
public void handleData(string str, Socket sokClient)
{
string[] strAll = str.Split(' ');
switch (int.Parse(strAll[8]))
{
case 2://登陆
break;
case 1://心跳
heartbeat(str, sokClient);
break;
}
}
#region 心跳
public void heartbeat(string str, Socket sokClient)
{
}
void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
}
#endregion
public void WriteError(string message)
{
try
{
string directPath = System.AppDomain.CurrentDomain.BaseDirectory + "info\\";
if (!Directory.Exists(directPath)) //判断文件夹是否存在,如果不存在则创建
{
Directory.CreateDirectory(directPath);
}
directPath += string.Format(@"\{0}.log", DateTime.Now.ToString("yyyy-MM-dd"));
if (streamWriter == null)
{
streamWriter = !File.Exists(directPath) ? File.CreateText(directPath) : File.AppendText(directPath); //判断文件是否存在如果不存在则创建,如果存在则添加。
}
streamWriter.WriteLine("***********************************************************************");
streamWriter.WriteLine("错误时间:" + DateTime.Now.ToString("HH:mm:ss"));
if (message != null)
{
streamWriter.WriteLine("异常信息:\r\n" + message);
}
}
finally
{
if (streamWriter != null)
{
streamWriter.Flush();
streamWriter.Dispose();
streamWriter = null;
}
}
}
}
主要是心跳包的检测是检测哪个方法 或者放在哪个位置啊?