Tomcat集成WebSocket实现一对一聊天效果
- 需要的jar包
javaee-api7.0
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>
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);
}
}
测试图