@File
2019-10-29T01:05:58.000000Z
字数 4381
阅读 220
java
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>
@Configurationpublic class WebSocketConfig {@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}}
@Component// 指定 websocker 映射的url路径@ServerEndpoint("/webSocket")public class MyWebSocket {/*** 记录当前在线连接数。*/private static final AtomicInteger onlineCount = new AtomicInteger(0);/*** 存放每个客户端对应的MyWebSocket对象。*/private static ConcurrentHashMap<String,MyWebSocket> webSocketMap = new ConcurrentHashMap<>();/*** 当前客户端的连接对象*/private Session session;/*** 连接建立成功调用的方法* @param session 连接的客户端信息*/@OnOpenpublic void onOpen(Session session) {this.session = session;// 加入set中webSocketMap.put(session.getId(), this);// 在线数加1addOnlineCount();// 广播通知sendAll("有新用户连接,id:"+session.getId());}/*** 连接关闭调用的方法* @param session 断开连接的客户端信息*/@OnClosepublic void onClose(Session session) {// 从map中删除webSocketMap.remove(session.getId());// 在线数减1subOnlineCount();// 广播退出信息sendAll("id:"+session.getId()+" 用户退出了");}/*** 收到客户端消息后调用的方法* @param message 客户端发送过来的消息* @param session 发信息的客户端信息*/@OnMessagepublic void onMessage(String message, Session session) {// 客户端发信息逻辑// 信息中是否带冒号int index = message.indexOf(':');if(index > 0){String sendId = message.substring(0, index);if(sendId != ""){try {// 带冒号时根据冒号前的id单独发送sendToId(sendId, message.substring(index+1));return;}catch (Exception e){}}}// 没带冒号就广播sendAll(message);}/*** 发生错误时调用* @param error 错误信息* @param session 客户端信息*/@OnErrorpublic void onError(Throwable error, Session session) {error.printStackTrace();}/*** 当前客户端发布消息* @param message 消息* @throws IOException*/public void sendMessage(String message) throws IOException {session.getBasicRemote().sendText(message);}/*** 群发自定义消息* @param message 广播*/public static void sendAll(String message) {webSocketMap.forEach((key, myWebSocket) -> {try {myWebSocket.sendMessage(message);} catch (IOException e) {e.printStackTrace();}});}/*** 发送给指定id的客户端* @param id 客户端id* @param message 消息*/public static void sendToId(String id, String message) {try {webSocketMap.get(id).sendMessage(message);} catch (IOException e) {e.printStackTrace();}}/*** 获取总连接数* @return 总连接数*/public static synchronized int getOnlineCount() {return onlineCount.get();}/*** 连接数 +1* @return +1 后的连接数*/public static synchronized int addOnlineCount() {return onlineCount.addAndGet(1);}/*** 连接数 -1* @return -1 后的连接数*/public static synchronized int subOnlineCount() {return onlineCount.decrementAndGet();}}
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>My WebSocket Test</title></head><body>Welcome<br/><input id="text" type="text" /><button onclick="send()">Send</button><button onclick="closeWebSocket()">Close</button><div id="message"></div></body><script type="text/javascript">var websocket = null;//判断当前浏览器是否支持WebSocketif('WebSocket' in window){websocket = new WebSocket("ws://localhost:8080/webSocket");}else{alert('Not support websocket')}//连接发生错误的回调方法websocket.onerror = function(){setMessageInnerHTML("error");};//连接成功建立的回调方法websocket.onopen = function(event){setMessageInnerHTML("open");}//接收到消息的回调方法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></html>
<dependency><groupId>org.java-websocket</groupId><artifactId>Java-WebSocket</artifactId><version>1.3.8</version></dependency>
public class MyWebSocketClient extends WebSocketClient {public MyWebSocketClient(String serverUri) throws URISyntaxException {// 配置连接地址super(new URI(serverUri));// 实例化时立即创建连接this.connect();}/*** 连接成功时* @param serverHandshake*/@Overridepublic void onOpen(ServerHandshake serverHandshake) {// 成功连接逻辑}/*** 接收到信息时* @param s 信息内容*/@Overridepublic void onMessage(String s) {// 收信息时逻辑}/*** 关闭连接是* @param i* @param s* @param b*/@Overridepublic void onClose(int i, String s, boolean b) {// 断开时逻辑}/*** 出现错误时* @param e 错误对象*/@Overridepublic void onError(Exception e) {// 异常处理逻辑}}
// 实例化刚重写的类,这里有个异常需要处理WebSocketClient webSocketClient = new MyWebSocketClient("ws://localhost:8080/webSocket");// 向服务器发送消息webSocketClient.send("发送信息");