大虾们,神们,C# winform里面,采用多线程监听端口,接收方式为阻塞式,创建单一线程进行监听函数,这样阻塞时只阻塞单一线程,对主线程没有影响,并使用异步通信模式,来一个连接后回调函数进行解析入库。这是我的实现原理,目前有个问题,如何在客户端检测到与服务器断开,目前我只能做到写入TXT文档里面,看文档查看最后一次连接时间,如下:
------------------------告警信息2012-2-22 23:31:04--------------------------
共计接收300条数据,接收数据长度为:297字节,换算单位为0KB,解析与过滤后没有符合条件的数据入库!如何在客户端检测到与服务器断开
------------------------告警信息2012-2-22 23:31:04--------------------------
共计接收300条数据,接收数据长度为:297字节,换算单位为0KB,解析与过滤后没有符合条件的数据入库!如何在客户端检测到与服务器断开
解决方案 »
- DevExpress GridControl 如何通过快捷键,或者Enter键实现插入一新行?
- 关于 .net2003中的datagrid控件的问题,明白的指点下。
- 如何获取微软指纹仪Microsoft fingerprint reader中的指纹图像?
- 在线等 急! DataGridView 单元格绑定tag属性问题
- 请帮忙看一下我的这个英文.NET2005是什么版本
- 有关函数CryptEncrypt函数的参数传递问题,郁闷得要命!问老外,他说要收我$60钱才跟我讨论!
- 请教高手,如果使用ADO.NET连接Oracle数据库啊
- [求助]自写 WINDOWS 服务不能正常运行
- 问个多线程生产者与消费者的问题:
- 高分求救!!!
- datagridview 怎么获取选中行的某一列的索引
- winform开发中,子窗口的textbox问题
true表示已连接,false表示未链接在接收数据事件里可以通过try catch判断是否断开链接private void OnRecievedData(IAsyncResult ar)
{
try
{
Socket sock = (Socket)ar.AsyncState;
int recvCount = sock.EndReceive(ar); if (recvCount < 1)
{
//断开链接
return;
}
else
{
//正常链接,接收数据
}
AsyncCallback recieveData = new AsyncCallback( OnRecievedData );
sock.BeginReceive( buff, 0, buff.Length, SocketFlags.None, recieveData, sock ); }
catch(...)
{
//断开了链接}
}
你可以1分钟发送一次数据到服务端,这样client在Send时就知道和服务器是否断开,
那么在server用一个Dictionary记录最后心跳时间,超过3分钟认为client下线即可
一种就是用心跳包来维护连接,在发送心跳包异常时,可以认为对方短线,或者指定时间超时后,未收到对方的心跳响应,也认为是对方短线。
或者就是Send的时候会直接报异常,可以直接认为是掉线了。