java websocket

本贴最后更新于 984 天前,其中的信息可能已经时移俗易

今天偶然看到 websocket 的相关问题,学习整理一下,也实际的试了一发,确实比较好用。如下:

总的来说,要实现服务器端往客户端推送,还是用 socket 通信会比较合适。目前主流的浏览器也基本都支持的还不错,手机端也没啥问题。下面直接看实现。

添加 websocket 依赖

<dependency>
   <groupId>javax.websocket</groupId>
   <artifactId>javax.websocket-api</artifactId>
   <version>1.1</version>
   <scope>provided</scope>
</dependency>

Java 后台有继承类和注解的两种使用方式。注解的比较简单清晰,下面的测试是用的注解的方式。

直接上 Java 代码

// 对应的访问地址,{userId}是参数,后面可以通过 @PathParam("userId")来获取
@ServerEndpoint(value="/websocketTest/{userId}") 
public class TestWebsocketController {

    private Logger logger = LoggerFactory.getLogger(TestWebsocketController.class);

    private static String userId;

    //建立连接
    @OnOpen
    public void onOpen(@PathParam("userId") String userId, Session session) {
        this.userId = userId;
        logger.debug("new connection: {}", userId);
    }
    //关闭连接
    @OnClose
    public void onClose() {
        logger.debug("close connection: {}", this.userId);
    }
    //收到客户端消息
    @OnMessage
    public void onMessage(String message, Session session) throws IOException, InterruptedException {
        logger.debug("received message from {}: {}", this,userId, message);
        session.getBasicRemote().sendText("received " + this.userId + " message");
        // 连续给客户端发送信息
        sendIntervalMsg(session);
    }
    //出错
    @OnError
    public void onError(Session session, Throwable error) {
        logger.debug("user id : {} connection has error", this.userId);
        error.printStackTrace();
    }
    //测试,后台连续给客户端发送信息
    public static void sendIntervalMsg(Session session) throws IOException, InterruptedException {
        for(int i = 0;i<10;i++) {
            Thread.sleep(1000);
            session.getBasicRemote().sendText("send from server " + i + " message");
        }
    }

}

上面的 Java 代码应该写的很清楚了。下面来看客户端(此处是 web)的代码

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        websocket Demo---- user000 <br />
        <input id="text" type="text" /> 
        <button onclick="send()"> Send </button>   
        <button onclick="closeWebSocket()"> Close </button>
        <div id="message">   </div>

    <script type="text/javascript">
     //判断当前浏览器是否支持WebSocket
      if('WebSocket' in window){
          websocket = new WebSocket("ws://localhost:8082/websocketTest/user000");
          console.log("link success")
      }else{
          alert('Not support websocket')
      }

      //连接发生错误的回调方法
      websocket.onerror = function(){
          setMessageInnerHTML("error");
      };

      //连接成功建立的回调方法
      websocket.onopen = function(event){
          setMessageInnerHTML("open");
      }
       console.log("-----")
      //接收到消息的回调方法
      websocket.onmessage = function(event){
               setMessageInnerHTML(event.data);
      }

      //连接关闭的回调方法
      websocket.onclose = function(){
          setMessageInnerHTML("close");
      }

      //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
      window.onbeforeunload = function(){
          websocket.close();
      }

      //将消息显示在网页上
      function setMessageInnerHTML(innerHTML){
          document.getElementById('message').innerHTML += innerHTML + '<br/>';
      }

      //关闭连接
      function closeWebSocket(){
          websocket.close();
      }

      //发送消息
      function send(){
          var message = document.getElementById('text').value;
          websocket.send(message);
      }
    </script>

    </body>
</html>

这个也不用太多介绍,整体来看还是比较简单实现的。建立连接的请求头如下,会跟一般的 http 请求有些区别
125e9e7d7d4e46519d406c635b2fb3e5-image.png

成功之后后台会连续给前端发送消息,如下:
912ce66e347247f7976bd1c5306c6889-image.png

本文参考这篇博客

  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    41 引用 • 156 回帖 • 630 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    2712 引用 • 7991 回帖 • 777 关注

赞助商 我要投放

2 回帖
请输入回帖内容 ...
  • EvilCodes

    可以在服务端写定时器吧应该

  • EvilCodes

    定时从数据库获取数据,然后推送到前端