直接附代码
前端:


<%@ 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/myWebSocket/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> 




后端代码: 




  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("/websocket") 

 

  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--; 

 

      } 

 
  }

以上是网上的前端及后端的代码(原文地址:?utm_source=tuicool&utm_medium=referral),jdk版本要求是在jdk1.7.0以上,tomcat版本也需要在tomcat7.0版本以上。另外有个需要注意的点就是websocket的api包要用tomcat自带的(websocket-api.jar),一开始本人采用的是非tomcat自带的javax.websocket-api-1.0.jar包,在配置了正确的环境之后总是连接不上,会报错:Error during WebSocket handshake: Unexpected response code: 404。



正确的效果图如下:



进入页面http://localhost:8080/myWebSocket/index.jsp


java项目如何接入skywalking_java



输入内容,点击send


java项目如何接入skywalking_java_02


微信小程序端发起请求:



请求代码:


connectWebSocket:function(){   
    console.log("创建webSocket连接");   
    wx.connectSocket({   
       url:'ws://localhost:8080/myWebSocket/websocket',   
    // url:'http://eservicesit.prlife.com.cn:7001',   
     data:{   
        x: '',   
        y: ''   
      },   
     header:{   
     'content-type': 'application/json'   
      },   
     method:"GET",   
     success: function(res){   
       console.log("创建连接成功");   
         //do something   
     },   
     fail:function(res){   
       console.log("创建连接失败,原因因::"+res.errMsg);   
     },   
     complete:function(){   
         console.log("创建连接complete");   
     }   
 })


  } 控制台输出:






 

java项目如何接入skywalking_客户端_03