一.客户端:

JS代码如下:

  1. /*
  2. * 这部分js将websocket封装起来
  3. */
  4. var websocket = null;
  5. //判断当前浏览器是否支持WebSocket
  6. if ('WebSocket' in window) {
  7. websocket = new WebSocket("ws://localhost:8080/GoodMan/ChatService");
  8. }
  9. else {
  10. alert('当前浏览器 Not support websocket')
  11. }
  12.  
  13. //连接成功建立的回调方法
  14. websocket.onopen = function () {
  15. alert("WebSocket连接成功");
  16. }
  17.  
  18. //连接发生错误的回调方法
  19. websocket.onerror = function () {
  20. alert("WebSocket连接发生错误");
  21. };
  22.  
  23. //发送消息
  24. function sendMess(content) {
  25. var json ="{'username':'"+'${sessionScope.username }'+"', 'content':'"+content+"'}";
  26. websocket.send(json);
  27. }
  28.  
  29. //接收到消息的回调方法
  30. websocket.onmessage = function (event) {
  31. var jsonString = event.data; //接收到的信息存放在event.data中
  32. var data = JSON.parse(jsonString); //将json字符串转换成js对象
  33. // 然后输出data
  34. }
  35.  
  36. //连接关闭的回调方法
  37. websocket.onclose = function () {
  38. alert("WebSocket连接关闭");
  39. }
  40.  
  41. //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
  42. window.onbeforeunload = function () {
  43. closeWebSocket();
  44. }
  45.  
  46. //关闭WebSocket连接
  47. function closeWebSocket() {
  48. websocket.close();
  49. }

二.服务器:

  1. import java.io.IOException;
  2. import java.util.Date;
  3. import java.util.HashSet;
  4. import java.util.Set;
  5. import javax.websocket.*;
  6. import javax.websocket.server.ServerEndpoint;
  7. import com.google.gson.Gson;
  8.  
  9. class Mess{ //封装一条消息
  10. private String username;
  11. private String content;
  12. private String date;
  13. public Mess(String username, String content, String date) {
  14. super();
  15. this.username = username;
  16. this.content = content;
  17. this.date = date;
  18. }
  19. public String getUsername() {
  20. return username;
  21. }
  22. public void setUsername(String username) {
  23. this.username = username;
  24. }
  25. public String getContent() {
  26. return content;
  27. }
  28. public void setContent(String content) {
  29. this.content = content;
  30. }
  31. public String getDate() {
  32. return date;
  33. }
  34. public void setDate(String date) {
  35. this.date = date;
  36. }
  37. }
  38.  
  39. @ServerEndpoint("/ChatService")
  40. public class ChatService { //每进入一个用户,就新建一个ChatService对象
  41.  
  42. private static int onlineCount = 0; //静态变量, 用来记录当前在线连接数
  43. private static Set<ChatService> webSocketSet = new HashSet<>(); //静态变量,用来存放在线用户
  44. private Session session; //用于存储与该用户的会话,要通过它来给客户端发送数据
  45.  
  46. /**
  47. * 连接建立成功调用的方法
  48. * @param session 可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
  49. */
  50. @OnOpen
  51. public void onOpen(Session session){
  52. this.session = session;
  53. webSocketSet.add(this); //加入set中
  54. addOnlineCount(); //在线数加1
  55. System.out.println("有新连接加入!当前在线人数为" + getOnlineCount());
  56. }
  57.  
  58. /**
  59. * 连接关闭调用的方法
  60. */
  61. @OnClose
  62. public void onClose(){
  63. webSocketSet.remove(this); //从set中删除
  64. subOnlineCount(); //在线数减1
  65. System.out.println("有一连接关闭!当前在线人数为" + getOnlineCount());
  66. }
  67.  
  68. /**
  69. * 收到客户端消息后调用的方法
  70. * @param message 客户端发送过来的消息
  71. * @param session 可选的参数
  72. */
  73. @OnMessage
  74. public void onMessage(String data, Session session) {
  75. Mess mess = new Gson().fromJson(data, Mess.class);
  76. System.out.printf("来%s的消息:%s\n", mess.getUsername(), mess.getContent());
  77. //群发消息
  78. for(ChatService item: webSocketSet){
  79. try {
  80. item.sendMessage(mess);
  81. } catch (IOException e) {
  82. e.printStackTrace();
  83. continue;
  84. }
  85. }
  86. }
  87.  
  88. /**
  89. * 发生错误时调用
  90. * @param session
  91. * @param error
  92. */
  93. @OnError
  94. public void onError(Session session, Throwable error){
  95. System.out.println("发生错误");
  96. error.printStackTrace();
  97. }
  98.  
  99. //以下为辅助函数
  100. public void sendMessage(Mess mess) throws IOException{
  101.  
  102. String datatime = new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
  103. mess.setDate(datatime);
  104. String jsonInfo = new Gson().toJson(mess); //将消息对象转换成json字符串
  105. this.session.getAsyncRemote().sendText(jsonInfo); //通过session异步地将信息发送到客户端上
  106. }
  107.  
  108. public static synchronized int getOnlineCount() {
  109. return onlineCount;
  110. }
  111.  
  112. public static synchronized void addOnlineCount() {
  113. ChatService.onlineCount++;
  114. }
  115.  
  116. public static synchronized void subOnlineCount() {
  117. ChatService.onlineCount--;
  118. }
  119. }

WebSocket实现Web聊天室的更多相关文章

  1. web即时通讯2--基于Spring websocket达到web聊天室

    如本文所用,Spring4和websocket要构建web聊天室,根据框架SpringMVC+Spring+Hibernate的Maven项目,后台使用spring websocket进行消息转发和聊 ...

  2. 利用html 5 websocket做个山寨版web聊天室(手写C#服务器)

    在之前的博客中提到过看到html5 的websocket后很感兴趣,终于可以摆脱长轮询(websocket之前的实现方式可以看看Developer Works上的一篇文章,有简单提到,同时也说了web ...

  3. WebSocket请求过程分析及实现Web聊天室

    WebSocket协议是基于TCP的一种新的协议.WebSocket最初在HTML5规范中被引用为TCP连接,作为基于TCP的套接字API的占位符.它实现了浏览器与服务器全双工(full-duplex ...

  4. 基于websocket实现的web聊天室

    # -*- coding:utf-8 -*- import socket import base64 import hashlib def get_headers(data): "" ...

  5. Java和WebSocket开发网页聊天室

    小编心语:咳咳咳,今天又是聊天室,到现在为止小编已经分享了不下两个了,这一次跟之前的又不大相同,这一次是网页聊天室,具体怎么着,还请各位看官往下看~ Java和WebSocket开发网页聊天室 一.项 ...

  6. web聊天室

    开发一个web聊天室 功能需求: 1.用户可以与好友一对一聊天 2.群聊 所需知识 1.Django 2.bootstrap 3.CSS 4.ajax 涉及到的新的知识点 1.如果设计表结构的时候,一 ...

  7. 基于Node.js+socket.IO创建的Web聊天室

    这段时间进了一个新的项目组,项目是用Appcan来做一个跨平台的移动运维系统,其中前台和后台之间本来是打算用WebSocket来实现的,但写好了示例后发现android不支持WebSocket,大为受 ...

  8. 分享基于 websocket 网页端聊天室

    博客地址:https://ainyi.com/67 有一个月没有写博客了,也是因为年前需求多.回家过春节的原因,现在返回北京的第二天,想想,应该也要分享技术专题的博客了!! 主题 基于 websock ...

  9. .net core下使用FastHttpApi构建web聊天室

    一般在dotnet core下构建使用web服务应用都使用asp.net core,但通过FastHttpApi组建也可以方便地构建web服务应用,在FastHttpApi功能的支持下构建多人聊天室是 ...

随机推荐

  1. Java中的equals方法和自定义比较器

    Object中的equals()方法默认是按地址比较,而不按内容进行比较, public boolean equals(Object obj) { return (this == obj); } 在S ...

  2. 搭建apphouse(docker镜像私服)

    1.下载apphouse,地址为http://www.youruncloud.com/soft.html2.上传AppHouse_v1.0.2.tar到服务器并解压3../apphouse_insta ...

  3. CentOS7 安装 Node.js

    1.首先安装node.js 的版本管理工具 NVM,执行以下命令: curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/ ...

  4. xfs 文件系统损坏修复 fscheck

  5. Dockerfile安装KOD可道云

    [root@docker01 base2]# cat Dockerfile FROM centos:6.8 RUN yum install openssh-server -y RUN /etc/ini ...

  6. C++中多态性学习(上)

    多态性学习(上) 什么是多态? 多态是指同样的消息被不同类型的对象接收时导致不同的行为.所谓消息是指对类的成员函数的调用,不同的行为是指不同的实现,也就是调用了不同的函数.虽然这看上去好像很高级的样子 ...

  7. StartUML

      原著:Stephen Wong            翻译:火猴 http://blog.csdn.net/monkey_d_meng/article/details/5995610    Sta ...

  8. ios uitableview button 获取cell indexpath.row

    在iOS7下面已经无效,因为iOS7的层级关系发生变化 UITableViewCell->UITableViewCellScrollView->UITableViewCellContent ...

  9. 使用CSDN CODE来存放OPENSTACK位于GITHUB上的源代码

    use CSDN CODE to pull openstack codes 2014-11-20 Author:Hyphen 问题 直接从GITHUB上获代替码,常常是没保障,特别是用DEVSTACK ...

  10. Spring IOC(通过实例介绍,属性与构造方法注入)

    概括说明:下面通过实例介绍下属性方法注入.构造方法注入 1.源码结构图 2.代码介绍 (1).Dao接口 :UserDAO (2).Dao接口实现:UserDAOImpl (3).实体类:User ( ...