问题描述
用户端随时都有可能关闭程序,我想着服务器在干自己的事的同时得时刻监听有没有某个socket需要被关掉...但是如何实现乜?用户和服务器直接要做的正经事就是传输信息啊什么的...如果是用户在关闭前发来某个信息的话...在那么多信息中怎么找到呢?另:有什么方法可以在程序里当某个条件成立时,自动关闭一个已经打开的JFrame么? 问题补充:deepfuture 写道
解决方案
难道要我收到的每一个包都检测一下是不是心跳包么?效率有点低... 不低呀,嘿嘿,TCP/IP详解看过吗,上面有说过类似的把数据包和控制包分开的方法。。。。。。。。,你不想检测将心跳包设为UDP方式,这样所有从UDP那个端口过来的都视为心跳包了。。。
解决方案二:
就是服务器端在指定时间间隔内必须收到客户端的心跳包,如果是TCP方式发送心跳包,你可以考虑为心跳包单独建一个连接,如果不想单独建立连接,就必须为心跳包单独定义一个特别的格式,使它和数据包区别开来。如果是UDP方式,则不用单独建立连接。客户端在指定时间间隔内必须发送心跳包,另外,客户端在收到服务器端的询问后,必须发送心跳包
解决方案三:
就是客户端定时给服务器送一个TCP包或UDP包,包的内容你自己去定义,然后服务器会读取这些包,在指定时间内读取不到某个客户端发的心跳包,就认为这个客户端已经死掉,服务器可以在读不到这个客户端的心跳包情况下,给这个客户端发一个询问,要求客户端主动发送心跳包,然后客户端如果仍没有收到,服务器端可以在最多发N个询问仍没有收到客户端的心跳包的情况下,将连接关闭
解决方案四:
1.心跳包实际就是一个自定义的协议包,主要用于判断对方机器是否还在连接。你可以自己定义协议的格式。 2.既然是协议,当然需要c/s双方都支持 3.如果你仅仅是为了判断服务器是否在线,用tcp协议自带的心跳包就可以了,用setsockopt设置socket的SO_KEEPALIVE属性,可以设置发包时间间隔心跳包可以是特定格式的,与所有格式不同,你完全可以自己定义一个心跳包的格式看看QQ是如何定义的QQ客户端向服务器发送的UDP包00000000 02 11 5B 00 C6 38 A9 23 D8 07 B9 04 9A BA 69 A6 ..[..8.# ......i. 00000010 F4 AF 1E 60 BD B0 AE 56 DC FE F9 03 ...`...V ....00000000 02 11 5B 00 C6 38 A9 D0 82 3C AD 82 7F FA 54 A9 ..[..8.. .<.. .T. 00000010 58 12 86 0B D4 89 50 51 12 69 C9 48 34 94 24 BB X.....PQ .i.H4.$. 00000020 24 15 A6 B1 79 2C FC 03 在中国协议分析网上看到了相关的解释02 开始是payload11 5B 是qq版本号00 C6就是心跳信息命令代码,(这个数据是会变化的)38 A9 是令牌号(也会变化,好像是每次加1,有待考证)23 D8 07 B9是QQ号由上面的包格式我们不难得到局域网中其它用户的QQ号,将网卡设为混合模式,监听所有的数据,对UDP包进行分析,若端口在4000-4007之间,我们认定为QQ数据包.
解决方案五:
一般是用来判断对方(设备,进程或其它网元)是否正常动行,一般采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经当掉。用于检测TCP的异常断开。一般是用来判断对方(设备,进程或其它网元)是否正常动行,一般采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经当掉。用于检测TCP的异常断开。基本原因是服务器端不能有效的判断客户端是否在线也就是说,服务器无法区分客户端是长时间在空闲,还是已经掉线的情况.所谓的心跳包就是客户端定时发送简单的信息给服务器端告诉它我还在而已。代码就是每隔几分钟发送一个固定信息给服务端,服务端收到后回复一个固定信息如果服务端几分钟内没有收到客户端信息则视客户端断开。比如有些通信软件长时间不使用,要想知道它的状态是在线还是离线就需要心跳包,定时发包收包。发包方:可以是客户也可以是服务端,看哪边实现方便合理。一般是客户端。服务器也可以定时轮询发心跳下去。一般来说,出于效率的考虑,是由客户端主动向服务器端发包,而不是就是在客户端和服务器间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳,所以叫做心跳包。 就是定时发送给对方一个数据包,告诉对方自己还在维护对话,同时获得返回的数据,判断对方是否在会话中。客户端每隔一段时间发一个包,使用TCP的,用send发,使用UDP的,用sendto发,服务器收到后,就知道当前客户端还处于“活着”的状态,否则,如果隔一定时间未收到这样的包,则服务器认为客户端已经断开,进行相应的客户端断开逻辑处理。
解决方案六:
设置超时,过了超时时间客户端没反应就认为它关了