Le contenu de cet article explique comment créer une salle de discussion Web webSocket en Java (avec du code). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.
WebSocket est un protocole de communication réseau et un protocole de persistance. RFC6455 définit sa norme de communication.
WebSocket est un protocole de communication full-duplex sur une seule connexion TCP que HTML5 a commencé à fournir.
La communication Web traditionnelle utilise la technologie HTTP. Le protocole http est un protocole de couche application unidirectionnel, sans état et sans connexion. Une requête ne peut correspondre qu'à une seule réponse. Les requêtes de communication ne peuvent être émises que par le client, et le serveur répond à la requête. Par conséquent, le serveur est très passif dans l'envoi des réponses. Cette réponse passive est destinée à empêcher le serveur de transmettre de manière proactive des réponses au client en temps opportun. Si le serveur subit des changements d'état continus, il sera très difficile pour le client de les obtenir. il. En utilisant fréquemment ajax asynchrone pour obtenir en continu des demandes d’implémentation d’interrogations longues, cela est particulièrement consommateur de performances et inefficace. (Continuez à vous serrer la main ou continuez à vivre longtemps).
Et webSocket permet une communication full-duplex entre le serveur et le client Tant que la connexion est établie une fois, la connexion peut être maintenue. Une fois la connexion établie, les deux parties peuvent communiquer entre elles sans avoir besoin de plusieurs poignées de main.
Ajouter pom.xml et introduire le package jar
<dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>7.0</version> <scope>provided</scope> </dependency>
2. Créer fichiers html et js
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>在线聊天室</title> <script type="text/javascript" src="./static/jquery-3.2.0.min.js"></script> <!-- 最新版本的 Bootstrap 核心 CSS 文件 --> <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> <!-- 最新的 Bootstrap 核心 JavaScript 文件 --> <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script> </head> <body> <div> <div><span>聊天室</span> <button class="btn btn-warning" onclick="doClose();">退出聊天</button> </div> <div><textarea class="form-control" style="width: 40%;" rows="3" id="contentInp"></textarea></div><hr/> <div><button class="btn btn-danger" onclick="doClear();">清空会话框</button></div> <div id="content">开始聊天<br/></div> </div> </body> <script type="text/javascript"> var ws = new WebSocket("ws://localhost:8080/ws/websocket"); //controller层url $(function(){ $("#contentInp").keyup(function(evt){ if(evt.which == 13){ //enter键发送消息 var htm = $("#contentInp").val(); doSend(htm); $("textarea").empty(); } }); }) ws.onopen = function(){ appendHtm("连接成功!"); } // 从服务端接收到消息,将消息回显到聊天记录区 ws.onmessage = function(evt){ appendHtm(evt.data); } ws.onerror = function(){ appendHtm("连接失败!"); } ws.onclose = function(){ appendHtm("连接关闭!"); } function appendHtm(htm){ ($("#content")[0]).innerHTML += htm +"<br/>" } // 注销登录 function doClose(){ ws.close(); } // 发送消息 function doSend(htm){ // ($("#content")[0]).innerHTML += htm +"<br/>" ws.send(htm); } function doClear(){ $("#content").empty(); } </script> </html>
3. Code java backend
package controller; import java.io.IOException; import java.util.concurrent.CopyOnWriteArraySet; import javax.net.ssl.SSLSession; 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("/websocket") public class WebScoketServer { private static Integer onlineNum = 0; //当前在线人数,线程必须设计成安全的 private static CopyOnWriteArraySet<WebScoketServer> arraySet = new CopyOnWriteArraySet<WebScoketServer>(); //存放每一个客户的的WebScoketServer对象,线程安全 private Session session; /** * 连接成功 * @param session 会话信息 */ @OnOpen public void onOpen(Session session) { this.session =session; arraySet.add(this); this.addOnlineNum(); System.out.println("有一个新连接加入,当前在线 "+this.getOnLineNum()+" 人"); } /** * 连接关闭 */ @OnClose public void onClose() { arraySet.remove(this); this.subOnlineNum(); System.out.println("有一个连接断开,当前在线 "+this.getOnLineNum()+" 人"); } /** * 连接错误 * @param session * @param error */ @OnError public void onError(Session session, Throwable error) { System.err.println("发生错误!"); error.printStackTrace(); } /** * 发送消息,不加注解,自己选择实现 * @param msg * @throws IOException */ public void onSend(String msg) throws IOException { this.session.getBasicRemote().sendText(msg); } /** * 收到客户端消息回调方法 * @param session * @param msg */ @OnMessage public void onMessage(Session session, String msg) { System.out.println("消息监控:"+msg); for (WebScoketServer webScoketServer : arraySet) { try { webScoketServer.onSend(msg); } catch (IOException e) { e.printStackTrace(); continue; } } } /** * 增加一个在线人数 */ private synchronized void addOnlineNum() { onlineNum++; } /** * 减少一个在线人数 */ private synchronized void subOnlineNum() { onlineNum--; } private Integer getOnLineNum() { return onlineNum; } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!