WebSocket 的使用,和客户端断电,服务器检测断开连接

服务器用WebSocketServlet,实例化自定义的MessageInbound 。

web.xml中配置socket
   <servlet>
        <servlet-name>WebSocket</servlet-name>
        <servlet-class>com.shadow.smmp.control.WebSocket </servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>WebSocket</servlet-name>
        <url-pattern>/websocket/websocket</url-pattern>
    </servlet-mapping>
Websocket实现
public class WebSocket extends WebSocketServlet {
    @Override
    protected StreamInbound createWebSocketInbound(String subProtocol, HttpServletRequest request) {
        return new UserMessageInbound ();

重写 MessageInbound ,接收客户端传来的信息

public class UserMessageInbound extends MessageInbound {
     * 建立连接的触发的事件
    @Override
    protected void onOpen(WsOutbound outbound) {
    @Override
    protected void onClose(int status) {
           System.out.println("收到设备断开连接码"+status);
    @Override
    protected void onBinaryMessage(ByteBuffer message) throws IOException {
        throw new UnsupportedOperationException("Binary message not supported.");
     * 客户端发送消息到服务器时触发事件
    @Override
    protected void onTextMessage(CharBuffer message) throws IOException {

客户端就不写了,主要是js,也可以是Android端的

如果客户端异常断电,导致连接一直在怎么办,就需要服务器检测客户端是否还在,然后断开连接,其实很简单,服务器写个心跳检测,然后调用

    ByteBuffer b = ByteBuffer.wrap("close".getBytes());
                System.out.println("服务器发送离线命令给" + this.user);
               wsOutbound.close(1, b);
wsOutbound.close(1, b);这个方法判断如果客户端不在线,检测到客户端不在就会主动释放连接

其实WebSocketServlet用的是Tomcat的Websocket,有点过时了,Spring有它自己的Websocket,可以网上查一下

看到这篇文章的题目,估计很多人都会问,这个组件是不是有些显的无聊了,说到web通信,很多人都会想到ASP.NET SignalR,或者Nodejs等等,实现web的网络实时通讯。有关于web实时通信的相关概念问题,在这里就不再做具体的介绍了,有兴趣的可以自行百度。   下面我们介绍一款WebSocket组件websocket-sharp的相关内容。 一.websocket-sharp组件概述     websocket-sharp是一个C#实现websocket协议客户端服务端websocket-sharp支持RFC 6455;WebSocket客户端服务器;消息压缩扩展;安全连接;HT 在即时通讯中,为了实现一个账户,同一时刻只能在一台设备上登录。 例如:有两台手机A和B,账号Account   当Account已经在手机A上登录,如果要在手机B上登录账号Account,就必须强制断开手机A与服务器建立的WebSocket连接。而且在断开连接之前需要往手机A返回一些信息,表示已经被另外一个用户强制登录了。 刚开始的时候,采用的断开方式是,获取到建立WebSocket链接所产 我们可以在客户端中维护一个服务端列表,并且为每个服务端维护一个Channel对象,在客户端服务端建立连接后,将Channel对象存储到服务端列表中,并且在客户端服务端断开连接时将Channel对象从服务端列表中删除。在Netty客户端中,由于网络原因,客户端会与服务端断开连接,但是我们希望客户端能够重新连接服务端,这就需要在客户端中监听客户端是否处于离线状态。在Netty客户端中,我们可以同时连接多个服务端,当其中某个服务端离线时,客户端可以自动重连离线服务端,并且支持向在线服务端发送数据。 一.WebSocket简单介绍随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了。近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通信,扩展了浏览器与服务端的通信功能,使服务端也能主动向客户端发送数据。我们知道,传统的HTTP协议是无状态的,每次请求(request)都要由客户端(如 浏览器... 监听了突然关闭浏览器窗口,destroyed里面直接监听 window.removeEventListener("beforeunload", e => this.beforeunloadHandler(e)) 然后调用this.webstock.close()关闭socket的长链接。WebSocket连接发生错误的时候,连接错误 需要重连this.reConnect(),尝试重新连接,本次重连次数大于6次就不连接了,放弃连接。三、功能点三WebSocket连接发生错误的时候,连接错误 需要重连。 ​Websocket打开后即自动关闭解决方法 之前写小程序时遇到了一个问题,websocket一旦使用立马关闭,也不报错,但是也不运行,查了很多博客也没查出原因,后来无意中发现,是websocket不可以使用ssm的注入方式。 ApplicationContext act = ApplicationContextRegister.getApplicationContext(); UserService userService = act.getBean(UserService.class); 通过调用websocket.IsCloseError或websocket.IsUnexpectedCloseError即可。当客户端因为某些问题异常关闭连接时,可以判断关闭连接的异常类型 socket.on('disconnect', function(){ log.info("disconnect"); eventEmitter.emit('close',socket); 在这个事件处理函数的上下文里,socket结构能获取到的信息有: _events: 该套接字上... 我设法使用Spring 5 Reactive WebSocket支持(Chapter 23.2.4)创建了一个WebSocketHandler.接收和发送一切正常.但是,我不知道如何检测客户端断开连接.调试客户端断开连接时,它会在HttpServerWSOperations类(netty.http.server包)的服务器端停止,并在其中检测到CloseWebSocketFrame.任何建议如何处... 本文只针对于web项目。开始想的是使用websocket进行长连接服务,但有个问题就来了,客户端异常断电、异常断网,比如说我现在把电脑咋了,网线掐了,服务端是不知道的,所以无法触发oncolse方法,通道就没办法关闭,该咋办呢?而且还有个缺点,如果用户过多,A用户向服务器发送10000次心跳,那么服务器也要回10000次,压力会很大。 采用心跳机制解决。 客户端定时向服务端发送空消息(ping),服务端启动心跳检测,超过一定时间范围没有新的消息进来就默认为客户端已断线,服务端主动执行clos 局域网内没有问题,然后公网地址存在问题。那么问题的原因就是网络链路的问题。比如:防火墙、nginx等中间件使socket通道断开服务器开启一个socket服务。然后客户端用工具测试,开始正常的,但是客户端闲置10分钟左右然后再去发送发现服务端收不到消息了。经过多次排除,最后发现局域网内客户端不管闲置多久都不会发生服务端接收不到的情况;建议采用心跳监听,如果断开及时重连。 在工作编写一个C#的服务器和Python进行通讯的时候碰到的一个问题,由于工作需求需要,python会每次连接(服务器用的是TCP)服务器就只会发送一条指令然后就会断开连接,下次会重新连接。在这样的情况下就出现了当python客户端断开连接后,服务器这边的Socket没有抛出异常,博主以前的时候都是利用当客户端断开连接的时候抛出的异常来检测是否断开连接。 在上述的情况下,服务器这边的对应的S 最近在做一个用到websocket的项目,大体是这样:服务端用的是java开发的web服务,客户端是机床,机床端跑的是用C#技术编写的exe程序,在exe程序中,会有ws连接web服务端,从而web端能监控机床端的状态。(这里并没有涉及到页面js中使用websocket)      服务端要监控客户端遇到一个很让人为难的要求就是“web服务端需要能够感知到客户端的联网和断网状态,进而在后台操作后