WebSocket
WebSocket 为客户端、浏览器和服务端提供了双工异步通信的功能,即客户端(浏览器、Android)可以向服务器发送消息,服务器端也可以向客户端发送消息。
WebSocket 是通过一个 socket 来实现双工异步通信能力的。但是直接使用 WebSocket 协议开发程序会十分繁琐,因此我们使用它的子协议 STOMP
,它是一个更高级别的协议。STOMP
协议使用一个基于帧的格式来定义消息,与 HTTP 的 request 和 response 类似(具有类似于 @RequestMpping
的注解 @MessageMapping
)。
Spring Boot 的支持
Spring Boot 对内嵌的 Tomcat、Jetty 和 Undertow 使用 WebSocket 提供了支持。
Spring Boot 为 WebSocket 提供的 starter pom 是 spring-boot-starter-websocket
。
服务器端
使用 Intellij IDEA + maven 搭建。
spring-boot-starter 选择 Thymeleaf 和 WebSocket
创建拦截器
拦截器可以在 WebSocket 握手前后进行一些预设置。
HandshakeInterceptor.java
1 | package me.xlui.im.config; |
创建配置类
WebSocketConfig.java:
1 | package me.xlui.im.config; |
通过注解 @EnableWebSocketMessageBroker
开启使用 STOMP 协议来传输基于代理(message broker)的消息,这时控制器使用 @MessageMapping
就像使用 @RequestMapping
一样。
消息发送与接收类
Message.java:
1 | package me.xlui.im.message; |
Response.java:
1 | package me.xlui.im.message; |
控制器
1 | package me.xlui.im.web; |
浏览器演示页面
静态资源放在 src/main/resources/static
下
广播 broadcast.html
1 |
|
动态群组与点对点聊天的代码见 GitHub。
配置路径映射
WebMvcConfig.java:
1 | package me.xlui.im.config; |
浏览器测试
运行程序,浏览器同时打开数个窗口,连接。
广播
动态群组
点对点
安卓客户端
STOMP
协议在 Android 系统中没有默认实现,不过有开源项目已经实现了,所以我们只需要添加依赖直接使用就好。
build.gradle(project)
1 | allprojects { |
build.gradle(app)
1 | compile 'com.squareup.okhttp3:okhttp:3.9.0' |
我们使用的是 StompProtocolAndroid
,它同时依赖于 WebSocket 的标准实现 Java-WebSocket
。
不过 Java-WebSocket
实现的 WebSocket
类在我这里不太好使,所以我换了 okhttp
实现的 WebSocket
类。
网络权限
在 AndroidManifest.xml
中添加网络权限:
1 | <uses-permission android:name="android.permission.INTERNET"/> |
布局
1 |
|
主程序
广播 Activity 的代码,其他代码(动态群组、点对点)见 GitHub。
1 | package me.xlui.im.activities; |
测试
广播
动态群组
点对点
源码
源代码已经上传到github,https://github.com/xlui/WebSocketExample,欢迎 star。