用户端关闭socket时如何告知服务器关闭对应的socket?

问题描述

用户端随时都有可能关闭程序,我想着服务器在干自己的事的同时得时刻监听有没有某个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发,服务器收到后,就知道当前客户端还处于“活着”的状态,否则,如果隔一定时间未收到这样的包,则服务器认为客户端已经断开,进行相应的客户端断开逻辑处理。
解决方案六:
设置超时,过了超时时间客户端没反应就认为它关了

时间: 2024-09-21 02:50:10

用户端关闭socket时如何告知服务器关闭对应的socket?的相关文章

tcp连接-TCP连接时,服务端监听socket接收客户端连接后新创建的socket默认绑定的端口是监听端口吗?

问题描述 TCP连接时,服务端监听socket接收客户端连接后新创建的socket默认绑定的端口是监听端口吗? 比如用来监听连接的socket绑定23端口,服务端每接受一个连接都新开一个线程和客户端通信,并把新socket传递给新线程,是不是所有新创建的socket都是经过23端口和客户端通信? 解决方案 是的,都通过端口23进行通信 解决方案二: 都是监听端口,如果不是客户端就不能将数据发送到服务器 解决方案三: 23只是监听建立连接,后续数据交换走实际上端口

java 网络通信-我做了一个socket通信程序,服务器是server,用户是client

问题描述 我做了一个socket通信程序,服务器是server,用户是client 但是我同学运行用户程序,我运行服务器程序,却连接不上,为什么呢?具体代码如下 服务器程序: import java.awt.Color; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import j

使用Oracle数据库登录时被告知用户被锁怎么解决_oracle

在登陆时被告知test用户被锁 1.用dba角色的用户登陆,进行解锁,先设置具体时间格式,以便查看具体时间 SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; Session altered. 2.查看具体的被锁时间 SQL> select username,lock_date from dba_users where username='TEST'; USERNAME LOCK_DATE --------------

Windows Socket 编程_单个服务器对多个客户端简单通讯 .

单个服务器对多个客户端程序: 一.简要说明 二.查看效果 三.编写思路 四.程序源代码 五.存在问题   一.简要说明:  程序名为:TcpSocketOneServerToMulClient  程序功能:实现单个服务器对多个客户端通讯功能的小程序. PS: 这是继上次简单的 Tcp Windows Socket 编程后的再一程序,程序实现依然不是很严谨,还待完善~   二.查看效果:   三.编写思路:  由上一次的程序思路来看,如果想实现单个服务器对多个客户端程序的通讯的话,这次程序编写尝试

Socket编程中的强制关闭与优雅关闭及相关socket选项

以下描述主要是针对windows平台下的TCP socket而言. 首先需要区分一下关闭socket和关闭TCP连接的区别,关闭TCP连接是指TCP协议层的东西,就是两个TCP端之间交换了一些协议包(FIN,RST等),具体的交换过程可以看TCP协议,这里不详细描述了.而关闭socket是指关闭用户应用程序中的socket句柄,释放相关资源.但是当用户关闭socket句柄时会隐含的触发TCP连接的关闭过程. TCP连接的关闭过程有两种,一种是优雅关闭(graceful close),一种是强制关

jquery+php实现用户输入搜索内容时自动提示

 今天突然想给本站做个搜索页面,这样用户可以通过搜索来找到自己喜欢的内容,也避免了在海量信息中手动查找资源的麻烦,我的目标和百度首页的效果类似,当用户输入要搜索的文字时,我们在下方给出相关的十条信息,如果用户要找的就是这十条信息内的某一条,那么简单,直接点击就可在新页面中打开页面,主要就是想更人性化一点,让用户使用起来更方便. 先看一下效果图吧,这样更有动力,要不然大家还不知道我在讲什么,到底要达到什么样的效果! 下面先主要讲解原理: 在search.html页面中,用户在搜索框内输入"j&qu

线程-使用Java socket让客户端与服务器建立连接后,服务器如何判断来自客户端的各类请求

问题描述 使用Java socket让客户端与服务器建立连接后,服务器如何判断来自客户端的各类请求 初学java,目前写了一个服务端和一个客户端.大致了解了如何socket通信是如何操作的,并且初步实现了客户端和服务端的通信.也仅仅是是接受和返回简单的字符串.部分代码如下 public void run(){ try{ serverSocket=new ServerSocket(SERVER_PORT_ONE); System.out.println("serversocket已创建"

socket编程 客户端与服务器之间传递消息

问题描述 socket编程 客户端与服务器之间传递消息 客户端向服务端发送一字符串, BufferedWriter pw= new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); pw.write("hello"); pw.flush(); 在服务端获取: BufferedReader br= new BufferedReader(new InputStreamReader(s.getInputStre

java创建socket时失败的原因有哪些?

问题描述 java创建socket时失败的原因有哪些? 最近练习使用socket时,本来能够脸上服务器的,后来不知道怎么的就连不上了,最后定位就是socket创建失败,什么原因我不知道.我知道的原因如下: 1.没有添加连接网络权限. 2.没有在后台线程中创建socket 3.端口号被占用 这些问题我都避免了,而且之前就连上了,后来连不上,抛出IOException,请问还有其他的原因会导致socket创建失败吗? 解决方案 抛出io异常,文件读取的问题.serversocket没有写进数据,so