web聊天室后端代码模板:

package com.jsx.chat;import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
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.PathParam;
import javax.websocket.server.ServerEndpoint;import net.sf.json.JSONObject;@ServerEndpoint("/websocket/{userId}")
public class ChatServer {private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm");   // 日期格式化//静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。private static int onlineCount = 0;//concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识private static CopyOnWriteArraySet<ChatServer> webSocketSet = new CopyOnWriteArraySet<ChatServer>();//与某个客户端的连接会话,需要通过它来给客户端发送数据private Session session;private String userId;//----------单聊---------用户id和websocket的session绑定的路由表//@SuppressWarnings("rawtypes")//private static Map routeTable = new HashMap<>();/*** 连接建立成功调用的方法* @param session  可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据*/@OnOpenpublic void open(@PathParam("userId")String userIds,Session session) {// 添加初始化操作System.out.println("---初始化----userId:"+userIds);this.session = session;//获取当前登录用户的idthis.userId = userIds;webSocketSet.add(this);     //加入set中addOnlineCount();           //在线数加1System.out.println("有新连接加入!当前在线人数为" + getOnlineCount());//---------单聊-----------将用户id和session绑定到路由表//绑定之后就可以在其它地方根据id来获取session,这时两个用户私聊就可以实现了//routeTable.put(userId, session);}/*** 接受客户端的消息,并把消息发送给所有连接的会话* @param message 客户端发来的消息* @param session 客户端的会话*/@OnMessagepublic void getMessage(String message, Session session1) {// 把客户端的消息解析为JSON对象JSONObject jsonObject = JSONObject.fromObject(message);// 在消息中添加发送日期jsonObject.put("date", DATE_FORMAT.format(new Date()));// -----------------------把消息发送给所有连接的会话--------------------------------System.out.println("来自客户端的消息"+this.userId+":" + message);for(ChatServer item: webSocketSet){try {//当前用户右侧显示,非本用户左侧显示if(this.userId.equals(item.userId)){jsonObject.put("isSelf", true);}else{jsonObject.put("isSelf", false);}// 发送JSON格式的消息item.sendMessage(jsonObject.toString());} catch (IOException e) {e.printStackTrace();continue;}}//--------------群发2-------------------
//        for (Session sess : session.getOpenSessions()) {//            if (sess.isOpen())
//               sess.getBasicRemote().sendText(msg);
//        }}@OnClosepublic void close() {// 添加关闭会话时的操作webSocketSet.remove(this);  //从set中删除subOnlineCount();           //在线数减1System.out.println("有一连接关闭!当前在线人数为" + getOnlineCount());}@OnErrorpublic void error(Throwable t) {// 添加处理错误的操作System.out.println("发生错误");t.printStackTrace();}/*** 这个方法与上面几个方法不一样。没有用注解,是根据自己需要添加的方法。* @param message json消息* @throws IOException*/public synchronized  void  sendMessage(String message) throws IOException{this.session.getAsyncRemote().sendText(message);//非阻塞式的}public static synchronized int getOnlineCount() {return onlineCount;}public static synchronized void addOnlineCount() {ChatServer.onlineCount++;}public static synchronized void subOnlineCount() {ChatServer.onlineCount--;}}

前端部分:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>即时群聊</title>
<meta name="renderer" content="webkit">
<meta http-equiv="Cache-Control" content="no-siteapp" />
<link rel="alternate icon" href="assets/i/favicon.ico">
<link rel="stylesheet" href="assets/css/amazeui.min.css">
<link rel="stylesheet" href="assets/css/app.css">
<link href="umeditor/themes/default/css/umeditor.css" rel="stylesheet">
<style>
.title {text-align: center;
}
.chat-content-container {height: 29rem;overflow-y: scroll;border: 1px solid silver;
}
</style>
</head>
<body><!-- 标题 --><div class="title"><div class="am-g am-g-fixed"><div class="am-u-sm-12"><h1 class="am-text-primary">群聊</h1></div></div></div><!-- 聊天内容框开始 --><div class="chat-content"><div class="am-g am-g-fixed chat-content-container"><div class="am-u-sm-12"><ul id="message-list" class="am-comments-list am-comments-list-flip"></ul></div></div></div><!-- 聊天内容框结束 --><div class="message-input am-margin-top"><!-- 输入内容框开始 --><div class="am-g am-g-fixed"><div class="am-u-sm-12"><form class="am-form"><div class="am-form-group"><script type="text/plain" id="myEditor" style="width: 100%;height: 8rem;"></script></div></form></div></div><!-- 输入昵称框开始 --><div class="am-g am-g-fixed am-margin-top"><div class="am-u-sm-6"><div id="message-input-nickname" class="am-input-group am-input-group-primary"><span class="am-input-group-label"><i class="am-icon-user"></i></span><input id="nickname" type="text" class="am-form-field" placeholder="Please enter nickname"/></div></div><div class="am-u-sm-6"><button id="send" type="button" class="am-btn am-btn-primary"><i class="am-icon-send"></i>发送</button></div></div></div><script src="assets/js/jquery.min.js"></script><script charset="utf-8" src="umeditor/umeditor.config.js"></script><script charset="utf-8" src="umeditor/umeditor.min.js"></script><script src="umeditor/lang/zh-cn/zh-cn.js"></script><script>$(function() {//随机方法   生成id模拟用户function rand(num){return parseInt(Math.random()*1000000+1);}// 初始化消息输入框var um = UM.getEditor('myEditor');// 使昵称框获取焦点$('#nickname')[0].focus();// 新建WebSocket对象,最后的/WebSocket跟服务器端的@ServerEndpoint("/websocket")对应//var socket = new WebSocket('ws://${pageContext.request.getServerName()}:${pageContext.request.getServerPort()}${pageContext.request.contextPath}/websocket');//var socket = new WebSocket("ws://localhost:8080/Chat/websocket");var target = "ws://"+window.location.host+"/Chat/websocket"+"/"+rand();//alert(target);var socket = new WebSocket(target);// 处理服务器端发送的数据socket.onmessage = function(event) {addMessage(event.data);};// 点击Send按钮时的操作$('#send').on('click', function() {var nickname = $('#nickname').val();//alert(um.getContent()); //内容//alert(nickname);  //昵称if (!um.hasContents()) {    // 判断消息输入框是否为空// 消息输入框获取焦点um.focus();// 添加抖动效果$('.edui-container').addClass('am-animation-shake');setTimeout("$('.edui-container').removeClass('am-animation-shake')", 1000);} else if (nickname == '') {    // 判断昵称框是否为空//昵称框获取焦点$('#nickname')[0].focus();// 添加抖动效果$('#message-input-nickname').addClass('am-animation-shake');setTimeout("$('#message-input-nickname').removeClass('am-animation-shake')", 1000);} else {// 发送消息socket.send(JSON.stringify({content : um.getContent(),nickname : nickname}));// 清空消息输入框um.setContent('');// 消息输入框获取焦点um.focus();}});// 把消息添加到聊天内容中function addMessage(message) {message = JSON.parse(message);var messageItem = '<li class="am-comment '+ (message.isSelf ? 'am-comment-flip' : 'am-comment')+ '">'+ '<a href="javascript:void(0)" ><img src="assets/images/'+ (message.isSelf ? 'self.jpg' : 'others.jpg')+ '" alt="" class="am-comment-avatar" width="48" height="48"/></a>'+ '<div class="am-comment-main"><header class="am-comment-hd"><div class="am-comment-meta">'+ '<a href="javascript:void(0)" class="am-comment-author">'+ message.nickname + '</a> <time>' + message.date+ '</time></div></header>'+ '<div class="am-comment-bd">' + message.content+ '</div></div></li>';$(messageItem).appendTo('#message-list');// 把滚动条滚动到底部$(".chat-content-container").scrollTop($(".chat-content-container")[0].scrollHeight);}});</script></body>
</html>

通用的websocket模板代码相关推荐

  1. 机械厂html5手机模板,营销型机械消费设备企业通用织梦模板(带html5手机端) v1.0...

    营销型机械消费设备企业通用织梦模板简介 营销型机械消费设备企业通用织梦模板(带html5手机端)v1.0是一个自适应手机端和PC端的最新版织梦V5.7为内核的网站模板,软件兼容主流浏览器,模板包含安装 ...

  2. echarts企业地区大数据图表模板代码

    echarts企业地区大数据图表模板代码 Html5 echarts.js制作通用的企业发展营销统计大数据管理图表页面模板代码. 作品介绍 1.网页作品简介方面 : html5 echarts.js制 ...

  3. 前端页面后台管理模板—代码实例

    今天分享下"前端页面后台管理模板"这篇文章,文中根据实例编码详细介绍,或许对大家的编程之路有着一定的参考空间与使用价值,需要的朋友接下来跟着云南仟龙Mark一起学习一下吧.近期自身 ...

  4. Android通用初始化Activity模板

    Android通用初始化Activity模板 很多Android程序开始运行的时候,都会首先启动一个初始化的InitActivity,然后在这个InitActivity的加载函数(onCreate)中 ...

  5. vue文件快速生成模板代码

    vue文件快速生成模板代码 输入 vue 按 tab 键

  6. 为了提高工作效率:通过pycharm的模板代码减少重复工作

    摘要 在常见的业务开发场景下,经常要开发大量重复的代码,这里代码耗时但又必要,就像我们写分析报告一样,每次都要为固定的格式耗费精力.我们可以更加日常开发经验总结出一些常用的模板代码来帮助我们实现一秒五 ...

  7. flask 常见关系模板代码

    以下罗列了使用关系型数据库中常见关系定义模板代码 一对多 示例场景: 用户与其发布的帖子(用户表与帖子表) 角色与所属于该角色的用户(角色表与多用户表) 示例代码 class Role(db.Mode ...

  8. 修改自动生成get/set方法模板代码

    今天看到 面对接口脏数据你还在V层if str==null else setText? 一文,觉着写得挺好,开发过程中多思考多动手,会带来意想不到的效果.底下评论大家也都说了各自的方法和见解,文中有一 ...

  9. C++编程进阶6(public继承与组合、private继承、多重继承、处理模板基类内的名称、如何避免模板代码膨胀)

    二十一.public继承与组合 public继承是是子类对象is a基类对象的关系,比如QT中的所有组件类都要继承QObject,所以所有的QT组件都是一个QObject. 而组合是has a(包含) ...

最新文章

  1. automapper java 有什么_对象映射工具AutoMapper介绍
  2. SharePoint Conference 2008 - Day 1
  3. 一张正方形图片,伴随我一年半,敢问情绪的使用方法
  4. 如何正确的关闭 MFC 线程
  5. 实用设置_华为手机4个冷门实用的设置,都知道的绝对是资深花粉
  6. Android自定义控件之TextView
  7. h3c交换机端口加入vlan命令_h3c交换机vlan配置划分命令
  8. 有监督 VS 无监督
  9. 循环中使用switch在执行条件后使用break和continue的区别
  10. 关于打印出来的字符串,最后的逗号改为句号的解决办法
  11. vue实现消息badge 标记_vue 新消息提示
  12. 摔手机 蓝桥 Python
  13. Mac电脑如何转化二维码?方法了来了
  14. get请求获得传递参数
  15. 网络串流_串流免费音乐的最佳网站
  16. 步进电机替换伺服电机如何计算?
  17. 用友服务器注册帐 号,能给我注册一个号吗?
  18. Fedora 14 安装 GeForce GT 330M nVidia 驱动及声卡设置
  19. 【JavaWeb学习】CSS(样式和布局)
  20. java连接dataworks_DataWorks2.0的“业务流程”与1.0的“工作流”的对比

热门文章

  1. win7设置定时锁定计算机,Win7系统锁定计算机怎么设置?Win7系统锁定计算机的设置方法...
  2. linux脚本实现红绿灯,javascript 如何实现红绿灯效果呢?
  3. 动力环境监控系统论文_浅谈动力环境监控系统技术标准
  4. JAVA入门级教学之(你是否理解HelloWorld的这段经典的代码的注释)
  5. c语言编写两个矩阵的乘积,如何用c语言编写两个模糊矩阵相乘的程序?
  6. php mysql 作业计划,关于php:我需要使用cron作业每30分钟恢复一次数据库(mysql)
  7. js br不生效_前端标注工具-AILabel.js
  8. linux关机_Linux中shutdown,halt,poweroff,init 0区别
  9. 【LeetCode笔记】4. 寻找两个正序数组的中位数(Java、二分、递归)
  10. ios 捕抓crash_ios crash的原因与抓取crash日志的方法