java websocket简单实例绝对可用

xiaoxiao2021-02-28  73

坑爹的网友,一个个的网上websocket例子都不写web.xml的配置,MD~这不是给别人挖坑吗?既然写例子就要完整啊!!!

需要注意的是:1.web.xml配置服务端的servlet。2.tomcat7配置context.xml    加上

<Loader delegate="true"/>这句,要不启动会报错。

项目环境:jdk7+tomcat7    (导入catalina.jar和websocket-api.jar)

项目结构:

MyWebSocket.Java

package com.chen.websocket; 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;   //该注解用来指定一个URI,客户端可以通过这个URI来连接到WebSocket。类似Servlet的注解mapping。无需在web.xml中配置。 @ServerEndpoint("/chat") public class MyWebSocket {     //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。     private static int onlineCount = 0;           //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识     private static CopyOnWriteArraySet<MyWebSocket> webSocketSet = new CopyOnWriteArraySet<MyWebSocket>();           //与某个客户端的连接会话,需要通过它来给客户端发送数据     private Session session;           /**      * 连接建立成功调用的方法      * @param session  可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据      */     @OnOpen     public void onOpen(Session session){         this.session = session;         webSocketSet.add(this);     //加入set中         addOnlineCount();           //在线数加1         System.out.println("有新连接加入!当前在线人数为" + getOnlineCount());     }           /**      * 连接关闭调用的方法      */     @OnClose     public void onClose(){         webSocketSet.remove(this);  //从set中删除         subOnlineCount();           //在线数减1             System.out.println("有一连接关闭!当前在线人数为" + getOnlineCount());     }           /**      * 收到客户端消息后调用的方法      * @param message 客户端发送过来的消息      * @param session 可选的参数      */     @OnMessage     public void onMessage(String message, Session session) {         System.out.println("来自客户端的消息:" + message);                   //群发消息         for(MyWebSocket item: webSocketSet){                          try {                 item.sendMessage(message);             } catch (IOException e) {                 e.printStackTrace();                 continue;             }         }     }           /**      * 发生错误时调用      * @param session      * @param error      */     @OnError     public void onError(Session session, Throwable error){         System.out.println("发生错误");         error.printStackTrace();     }           /**      * 这个方法与上面几个方法不一样。没有用注解,是根据自己需要添加的方法。      * @param message      * @throws IOException      */     public void sendMessage(String message) throws IOException{         this.session.getBasicRemote().sendText(message);         //this.session.getAsyncRemote().sendText(message);     }       public static synchronized int getOnlineCount() {         return onlineCount;     }       public static synchronized void addOnlineCount() {         MyWebSocket.onlineCount++;     }           public static synchronized void subOnlineCount() {         MyWebSocket.onlineCount--;     } }

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %>   <!DOCTYPE HTML> <html>   <head>     <base href="<%=basePath%>">     <title>My WebSocket</title>   </head>       <body>     Welcome<br/>     <input id="text" type="text" /><button οnclick="send()">Send</button>    <button οnclick="closeWebSocket()">Close</button>     <div id="message">     </div>   </body>       <script type="text/JavaScript">       var websocket = null;               //判断当前浏览器是否支持WebSocket       if('WebSocket' in window){           websocket = new WebSocket("ws://localhost:8080/websocket/chat");       }       else{           alert('Not support websocket');       }               //连接发生错误的回调方法       websocket.onerror = function(){           setMessageInnerHTML("error");       };               //连接成功建立的回调方法       websocket.onopen = function(event){           setMessageInnerHTML("open");       };               //接收到消息的回调方法       websocket.onmessage = function(){           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>

web.xml加上servlet配置

<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0"     xmlns="http://java.sun.com/xml/ns/javaee"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">   <display-name></display-name>         <servlet>         <servlet-name>wsChat</servlet-name>         <servlet-class>com.chen.websocket.MyWebSocket</servlet-class>     </servlet>     <servlet-mapping>         <servlet-name>wsChat</servlet-name>         <url-pattern>/websocket/chat</url-pattern>     </servlet-mapping>       <welcome-file-list>     <welcome-file>index.jsp</welcome-file>   </welcome-file-list> </web-app>
转载请注明原文地址: https://www.6miu.com/read-43431.html

最新回复(0)