zoukankan      html  css  js  c++  java
  • websocket入门例子

    项目总体结构图:

    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/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
      <display-name>web</display-name>
      <welcome-file-list>
        <welcome-file>index.html</welcome-file>
      </welcome-file-list>
    </web-app>
    

    index.htm   WS客户端

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>test ws</title>
    </head>
    <body>
    Test ws
    <script type="text/javascript">
    	//定义websocket
    	var ws = new WebSocket("ws://localhost:8080/web/websocket");
    
    	//连接websocket
    	ws.onopen = function()
    	{
    	var num = Math.ceil(Math.random()*100);
    	  var msg = 'userid='+num;
    	  console.log("open and send message:"+msg);
    	  // 发送消息
    	  ws.send(msg);
    	};
    
    	//接收消息
    	ws.onmessage = function(evt)
    	{
    		console.log("get message:"+evt.data)
    	};
    	//关闭连接
    	ws.onclose = function(evt)
    	{
    	  console.log("WebSocketClosed!");
    	};
    	//发生异常
    	ws.onerror = function(evt)
    	{
    	  console.log("WebSocketError!");
    	};
    
    </script>
    </body>
    </html>
    

    SocketServer.java  核心类,WS服务端

     1 package com.websocket;
     2 
     3 import java.io.IOException;
     4 import java.util.HashMap;
     5 import java.util.Map;
     6 import javax.websocket.OnClose;
     7 import javax.websocket.OnError;
     8 import javax.websocket.OnMessage;
     9 import javax.websocket.OnOpen;
    10 import javax.websocket.Session;
    11 import javax.websocket.server.ServerEndpoint;
    12 
    13 /**
    14  * 环境
    15  * 浏览器:firefox,google chrome
    16  * tomcat7.0.69
    17  * jdk7.0.79
    18  * 1 每个浏览器代表一个用户,与服务端建立连接后,实现服务端与浏览器的交互
    19  * 2 暴露websocket推送接口,其他服务端或者业务类调用该接口,向指定用户进行消息推送
    20  * @author caihao
    21  *
    22  */
    23 //URI注解,无需在web.xml中配置。
    24 @ServerEndpoint("/websocket")
    25 public class SocketServer {
    26     
    27     
    28     //浏览器与服务端的回话,浏览器每new一个WebSocket就创建一个session,关闭或刷新浏览器,session关闭
    29     private Session session;
    30     //代表浏览器
    31     private String userid;
    32     
    33     /**
    34      * 推送消息接口
    35      * 外部可以进行调用
    36      * @param sendMsg
    37      * @throws IOException
    38      */
    39     public void sendMsg(String sendMsg) throws IOException{
    40         System.out.println(this.session+";"+this.userid+";"+sendMsg);
    41         this.session.getBasicRemote().sendText(sendMsg);
    42     }
    43     
    44     //设置Map,存放每个用户的连接
    45     public static Map<String,SocketServer> webSocketSet = new HashMap<String,SocketServer>();
    46     
    47     
    48     
    49     @OnOpen
    50     public void onOpen(Session session) throws IOException {
    51         this.session = session;
    52         System.out.println(this+"有新连接,session="+session+";userid="+userid);
    53     }
    54 
    55     @OnClose
    56     public void onClose() {
    57         webSocketSet.remove(this.userid);
    58         System.out.println(this+";连接关闭");
    59     }
    60 
    61     @OnMessage
    62     public void onMessage(String info) throws IOException {
    63         System.out.println(this+";来自客户端的消息:" + info);
    64         String msg = "服务端接收到了来自客户端的消息:"+info;
    65         if(info.contains("userid")){
    66             this.userid = info.split("userid=")[1];
    67             System.out.println(this+",this.session="+this.session+";this.userid="+this.userid);
    68             webSocketSet.put(userid, this);        
    69         }
    70     }
    71 
    72     @OnError
    73     public void onError(Throwable error) {
    74         System.out.println(this+";发生错误");
    75         error.printStackTrace();
    76     }
    77     
    78 
    79 }

    外部类,调用服务端的推送接口

     1 package com.websocket;
     2 
     3 import java.io.IOException;
     4 import java.util.Map;
     5 import javax.servlet.ServletException;
     6 import javax.servlet.annotation.WebServlet;
     7 import javax.servlet.http.HttpServlet;
     8 import javax.servlet.http.HttpServletRequest;
     9 import javax.servlet.http.HttpServletResponse;
    10 
    11 /**
    12  * 外部类,调用暴露的推送接口
    13  */
    14 @WebServlet("/ServletA")
    15 public class ServletA extends HttpServlet {
    16     private static final long serialVersionUID = 1L;
    17        
    18     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    19         this.doPost(request, response);
    20     }
    21 
    22     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    23         Map<String,SocketServer> webSocketSet  = SocketServer.webSocketSet;
    24         //遍历用户,依据用户的id向用户发送指定的内容
    25         for(Map.Entry<String, SocketServer> entry:webSocketSet.entrySet()){    
    26              System.out.println(entry.getKey()+"--->"+entry.getValue()); 
    27              String key = entry.getKey();
    28              SocketServer ss = webSocketSet.get(key);
    29                 String sendMsg = "向"+key+"发送消息";
    30                 ss.sendMsg(sendMsg );
    31         }   
    32         
    33     }
    34 }

      

  • 相关阅读:
    HDU 1269 迷宫城堡
    HDU 4771 Stealing Harry Potter's Precious
    HDU 4772 Zhuge Liang's Password
    HDU 1690 Bus System
    HDU 2112 HDU Today
    HDU 1385 Minimum Transport Cost
    HDU 1596 find the safest road
    HDU 2680 Choose the best route
    HDU 2066 一个人的旅行
    AssetBundle管理机制(下)
  • 原文地址:https://www.cnblogs.com/caer/p/6098609.html
Copyright © 2011-2022 走看看