Tomcat集成WebSocket

Tomcat集成WebSocket实现一对一聊天效果

  1. 需要的jar包 javaee-api7.0
  2. web端代码(后端没有进行转码,测试时这里的用户名用英文和数字,中文不识别)

    
    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <c:set var="proPath" value="${pageContext.request.contextPath }">
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here
    <script type="text/javascript" src="${proPath }/js/jquery.js"></script>
    <link rel="stylesheet" href="${proPath }/layui/css/layui.css"
    media="all">
    <script src="${proPath }/layui/layui.js" charset="utf-8"></script>
    <style type="text/css">
    body {
    width: 1200px;
    }
    </style>
    </head>
    <body>
    <div>
    <hr>您的姓名:<input type="text" id="username">
    <hr>
    <button onclick="build()">建立连接</button>
    </div>
    <hr>
    <div>
        发送给:<input type="text" id="tousername">
    </div>
    <hr>
    <div>
        <textarea rows="10" cols="100" id="content">
        </textarea>
        <br> <br>
        <button onclick="send()">发送</button>
    </div>
    
    <div id="showMessage"></div>
    <script>
        var websocket = null;
        function build() {
            var username = $("#username").val();
            if ('WebSocket' in window) {
                websocket = new WebSocket(
                        "ws://localhost:8080/itdage-show/websocket?username="
                                + username);
                //连接成功建立的回调方法  
                websocket.onopen = function() {
                    $("#showMessage").append("<p color='red'>build success!</p>");
                    $("#tousername").append("<option>"+username+"</option>");
                }
                //连接发生错误的回调方法  
                websocket.onerror = function() {
                    alert("登录失败");
                };
                //连接关闭的回调方法  
                websocket.onclose = function() {
                    $("#showMessage").html("连接关闭");
                };
                //接收到消息的回调方法  
                websocket.onmessage = function(e) {
                    var jsonObject = JSON.parse(e.data);
                    $("#showMessage").append("<p>" +jsonObject.from + "对" +jsonObject.to +"说:"+ jsonObject.content + "</p>");
                };
            } else
                alert("Not Support!");
        }
        window.onbeforeunload = function() {
            if (null != websocket)
                websocket.close();
        };
        function send() {
            var username = $("#username").val();
            var content = $("#content").val();
            var tousername = $("#tousername").val();
            var mes = {
                "from" : username,
                "to" : tousername,
                "content" : content
            };
            if (null != websocket)
                websocket.send(JSON.stringify(mes));
        }
    </script>
    </body>
    </html>
    


  3. Java后端代码

    
    package com.itdage.test;
    
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    import java.util.concurrent.ConcurrentHashMap;
    import java.util.concurrent.ConcurrentMap;
    
    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;
    import com.google.gson.Gson;
    
    
    @ServerEndpoint(“/websocket”)
    public class WebSocketTest2 {
    private String username;
    private static ConcurrentMap<String,WebSocketTest2> users = new ConcurrentHashMap<>();
    private Session session;
    
    private void sendMessage(String mes){
        this.session.getAsyncRemote().sendText(mes);
    }  
    
    @OnOpen
    public void onOpen(Session session){
        this.session = session;
        Map<String,List<String>> map = session.getRequestParameterMap();
        username = map.get(“username”).get(0);//url中携带的参数
        users.put(username, this);
        users.get(username).sendMessage(“test” + username);
    }  
    @OnClose
    public void onClose(){
        users.remove(username);
    }  
    
    /** 
    
       
       
    • 收到客户端消息后调用的方法
    • @param message 客户端发送过来的消息
    • @param session 可选的参数
      */
      @OnMessage
      public void onMessage(String message, Session session) {
      System.out.println(“来自客户端的消息:” + message);
      Gson gson = new Gson();
      Message mes = gson.fromJson(message, Message.class);
      if(mes.getTo().isEmpty()){
      Set<String>key = users.keySet();
      for(String k: key){
      if(k.equals(mes.from))continue;
      users.get(k).sendMessage(message);
      }
      }else{
      WebSocketTest2 toServlet = users.get(mes.getFrom());
      WebSocketTest2 toServlet2 = users.get(mes.getTo());
      if(null!=toServlet){
      toServlet.sendMessage(message);
      toServlet2.sendMessage(message);
      }
      }
    } @OnError public void onError(Session session, Throwable error){ error.printStackTrace(); } }
  4. 测试图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值