WebSocket实现Web聊天室
一.客户端:
JS代码如下:
- /*
- * 这部分js将websocket封装起来
- */
- var websocket = null;
- //判断当前浏览器是否支持WebSocket
- if ('WebSocket' in window) {
- websocket = new WebSocket("ws://localhost:8080/GoodMan/ChatService");
- }
- else {
- alert('当前浏览器 Not support websocket')
- }
- //连接成功建立的回调方法
- websocket.onopen = function () {
- alert("WebSocket连接成功");
- }
- //连接发生错误的回调方法
- websocket.onerror = function () {
- alert("WebSocket连接发生错误");
- };
- //发送消息
- function sendMess(content) {
- var json ="{'username':'"+'${sessionScope.username }'+"', 'content':'"+content+"'}";
- websocket.send(json);
- }
- //接收到消息的回调方法
- websocket.onmessage = function (event) {
- var jsonString = event.data; //接收到的信息存放在event.data中
- var data = JSON.parse(jsonString); //将json字符串转换成js对象
- // 然后输出data
- }
- //连接关闭的回调方法
- websocket.onclose = function () {
- alert("WebSocket连接关闭");
- }
- //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
- window.onbeforeunload = function () {
- closeWebSocket();
- }
- //关闭WebSocket连接
- function closeWebSocket() {
- websocket.close();
- }
二.服务器:
- import java.io.IOException;
- import java.util.Date;
- import java.util.HashSet;
- import java.util.Set;
- import javax.websocket.*;
- import javax.websocket.server.ServerEndpoint;
- import com.google.gson.Gson;
- class Mess{ //封装一条消息
- private String username;
- private String content;
- private String date;
- public Mess(String username, String content, String date) {
- super();
- this.username = username;
- this.content = content;
- this.date = date;
- }
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public String getContent() {
- return content;
- }
- public void setContent(String content) {
- this.content = content;
- }
- public String getDate() {
- return date;
- }
- public void setDate(String date) {
- this.date = date;
- }
- }
- @ServerEndpoint("/ChatService")
- public class ChatService { //每进入一个用户,就新建一个ChatService对象
- private static int onlineCount = 0; //静态变量, 用来记录当前在线连接数
- private static Set<ChatService> webSocketSet = new HashSet<>(); //静态变量,用来存放在线用户
- 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 data, Session session) {
- Mess mess = new Gson().fromJson(data, Mess.class);
- System.out.printf("来%s的消息:%s\n", mess.getUsername(), mess.getContent());
- //群发消息
- for(ChatService item: webSocketSet){
- try {
- item.sendMessage(mess);
- } catch (IOException e) {
- e.printStackTrace();
- continue;
- }
- }
- }
- /**
- * 发生错误时调用
- * @param session
- * @param error
- */
- @OnError
- public void onError(Session session, Throwable error){
- System.out.println("发生错误");
- error.printStackTrace();
- }
- //以下为辅助函数
- public void sendMessage(Mess mess) throws IOException{
- String datatime = new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
- mess.setDate(datatime);
- String jsonInfo = new Gson().toJson(mess); //将消息对象转换成json字符串
- this.session.getAsyncRemote().sendText(jsonInfo); //通过session异步地将信息发送到客户端上
- }
- public static synchronized int getOnlineCount() {
- return onlineCount;
- }
- public static synchronized void addOnlineCount() {
- ChatService.onlineCount++;
- }
- public static synchronized void subOnlineCount() {
- ChatService.onlineCount--;
- }
- }
WebSocket实现Web聊天室的更多相关文章
- web即时通讯2--基于Spring websocket达到web聊天室
如本文所用,Spring4和websocket要构建web聊天室,根据框架SpringMVC+Spring+Hibernate的Maven项目,后台使用spring websocket进行消息转发和聊 ...
- 利用html 5 websocket做个山寨版web聊天室(手写C#服务器)
在之前的博客中提到过看到html5 的websocket后很感兴趣,终于可以摆脱长轮询(websocket之前的实现方式可以看看Developer Works上的一篇文章,有简单提到,同时也说了web ...
- WebSocket请求过程分析及实现Web聊天室
WebSocket协议是基于TCP的一种新的协议.WebSocket最初在HTML5规范中被引用为TCP连接,作为基于TCP的套接字API的占位符.它实现了浏览器与服务器全双工(full-duplex ...
- 基于websocket实现的web聊天室
# -*- coding:utf-8 -*- import socket import base64 import hashlib def get_headers(data): "" ...
- Java和WebSocket开发网页聊天室
小编心语:咳咳咳,今天又是聊天室,到现在为止小编已经分享了不下两个了,这一次跟之前的又不大相同,这一次是网页聊天室,具体怎么着,还请各位看官往下看~ Java和WebSocket开发网页聊天室 一.项 ...
- web聊天室
开发一个web聊天室 功能需求: 1.用户可以与好友一对一聊天 2.群聊 所需知识 1.Django 2.bootstrap 3.CSS 4.ajax 涉及到的新的知识点 1.如果设计表结构的时候,一 ...
- 基于Node.js+socket.IO创建的Web聊天室
这段时间进了一个新的项目组,项目是用Appcan来做一个跨平台的移动运维系统,其中前台和后台之间本来是打算用WebSocket来实现的,但写好了示例后发现android不支持WebSocket,大为受 ...
- 分享基于 websocket 网页端聊天室
博客地址:https://ainyi.com/67 有一个月没有写博客了,也是因为年前需求多.回家过春节的原因,现在返回北京的第二天,想想,应该也要分享技术专题的博客了!! 主题 基于 websock ...
- .net core下使用FastHttpApi构建web聊天室
一般在dotnet core下构建使用web服务应用都使用asp.net core,但通过FastHttpApi组建也可以方便地构建web服务应用,在FastHttpApi功能的支持下构建多人聊天室是 ...
随机推荐
- Java中的equals方法和自定义比较器
Object中的equals()方法默认是按地址比较,而不按内容进行比较, public boolean equals(Object obj) { return (this == obj); } 在S ...
- 搭建apphouse(docker镜像私服)
1.下载apphouse,地址为http://www.youruncloud.com/soft.html2.上传AppHouse_v1.0.2.tar到服务器并解压3../apphouse_insta ...
- CentOS7 安装 Node.js
1.首先安装node.js 的版本管理工具 NVM,执行以下命令: curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/ ...
- xfs 文件系统损坏修复 fscheck
- Dockerfile安装KOD可道云
[root@docker01 base2]# cat Dockerfile FROM centos:6.8 RUN yum install openssh-server -y RUN /etc/ini ...
- C++中多态性学习(上)
多态性学习(上) 什么是多态? 多态是指同样的消息被不同类型的对象接收时导致不同的行为.所谓消息是指对类的成员函数的调用,不同的行为是指不同的实现,也就是调用了不同的函数.虽然这看上去好像很高级的样子 ...
- StartUML
原著:Stephen Wong 翻译:火猴 http://blog.csdn.net/monkey_d_meng/article/details/5995610 Sta ...
- ios uitableview button 获取cell indexpath.row
在iOS7下面已经无效,因为iOS7的层级关系发生变化 UITableViewCell->UITableViewCellScrollView->UITableViewCellContent ...
- 使用CSDN CODE来存放OPENSTACK位于GITHUB上的源代码
use CSDN CODE to pull openstack codes 2014-11-20 Author:Hyphen 问题 直接从GITHUB上获代替码,常常是没保障,特别是用DEVSTACK ...
- Spring IOC(通过实例介绍,属性与构造方法注入)
概括说明:下面通过实例介绍下属性方法注入.构造方法注入 1.源码结构图 2.代码介绍 (1).Dao接口 :UserDAO (2).Dao接口实现:UserDAOImpl (3).实体类:User ( ...