socket系列(二)——Javaee实现实时通信
- 2019 年 10 月 30 日
- 笔记
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/luo4105/article/details/72692184
实现
java自带javaee-api7.0实现
环境要求
Tomcat7.0以上支持(最好tomcat8.0以上)
Ie7,8,9不支持,可以有sockeJS代替
Jar包:javaee-api-7.0.jar
项目结构

Java代码
import java.io.IOException; import java.util.concurrent.CopyOnWriteArraySet; import javax.websocket.OnClose; import javax.websocket.OnError; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.Session; import javax.websocket.server.ServerEndpoint; @ServerEndpoint(value = "/websocket") public classPushSocket { // 连接人数 private static int count; private staticCopyOnWriteArraySet<PushSocket> set = new CopyOnWriteArraySet<>(); // 服务端与客户端的通话 private Session session; @OnOpen public void onOpen(Session session) { this.session = session; set.add(this); addOnlineCount(); System.out.println("服务器在线人数:" + getOnlineCount()); } @OnClose public void onClose(Session session) { set.remove(this); subOnlineCount(); System.out.println("服务器在线人数:" + getOnlineCount()); } @OnMessage public void onMessage(String message, Session session) { System.out.println("来自客户端的消息:" + message); // 群发消息 for (PushSocket socket : set) { try { System.out.println(socket.hashCode()); socket.sendMsg(message); }catch(IOException e) { e.printStackTrace(); continue; } } } @OnError public void onError(Session session, Throwable error) { System.out.println("发生错误"); error.printStackTrace(); } /** * 某个连接发送消息 * @param msg */ public void sendMsg(String msg) throws IOException { this.session.getBasicRemote().sendText(msg); } public static int getOnlineCount() { return count; } public static void addOnlineCount() { count++; } public static void subOnlineCount() { count--; } }
Jsp代码
<%@ page language="java"contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>socket</title> <script type="text/javascript" src="http://cdn.static.runoob.com/libs/jquery/2.1.1/jquery.min.js"></script> </head> <body> welcome<br /> <input id="text" type="text"/> <button οnclick="sendMsg()">sendMsg</button> <hr/> <button οnclick="closeWebSocket()">close WebSocketconnection</button> <hr/> <div id="message"></div> </body> <script type="text/javascript"> var websocket = null; //判断浏览器是否支持websocket if('WebSocket' in window) { websocket= newWebSocket("ws://localhost:8080/study_push/websocket"); }else{ $("#message").html("该浏览器不支持实时通信功能"); } websocket.onopen= function() { console.log("websocket连接成功"); } websocket.onclose= function() { console.log("websocket连接关闭"); } websocket.onmessage= function(event) { console.log("接收消息"); console.log(event); printMsg(event.data); } //打印消息 function printMsg(msg) { $("#message").append(msg+ "<br/>"); } function sendMsg() { var msg = $("#text").val(); websocket.send(msg); } function closeWebSocket(){ websocket.close(); } </script> </html>
Web.xml配置
<?xml version="1.0"encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>study_push</display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
运行
打开” http://localhost:8080/study_push/IMpage.jsp”,实现情况

总结
Javaee-api对于websocket的处理十分轻便,好用便捷。
Java代码:
"@ServerEndpoint(value ="/websocket")":tomcat就会默认把该标签的类当作一个websocket,value就是连接地址。
"@OnOpen":当有新的连接时执行方法,这里执行的是给session赋值,添加该连接对象,增加连接数量,打印连接信息。
"@OnClose":当有连接关闭时执行方法,这里执行的是移除连接对象和打印信息操作。
"@OnMessage":当有新消息传后台时执行方法,这里执行的是给所有连接对象发送该请求。
"@OnError":当有连接错误时执行方法。
每当有新的客户端连接时,都会创建一个新的PushSocket对象,所以这里用CopyOnWriteArraySet<PushSocket>set来存放所有的连接对象。
Js代码:
"websocket = new WebSocket()":连接服务器websocket,参数就是服务器websocket地址
"websocket.onopen":连接后执行。
"websocket.onclose":关闭执行。
"websocket.onmessage":服务器发送消息。
ie7、8、9不支持websocket,可以使用socketJS替代