[已解决][HTML5]基于WebSocket开发聊天室应用
WebSocket示例java的比较少,大部分是nodejs的,比较有名的是socket.io的chat,
借用下他的前端实现一套java的,后端基于https://github.com/generallycloud/baseio实现的WebSocket编写,
直接上代码:
public void accept(Session session, ReadFuture future) throws Exception {
if (future instanceof HttpReadFuture) {
super.accept(session, future);
return;
}
WebSocketReadFuture f = (WebSocketReadFuture) future;
// CLOSE
if (f.getType() == 8) {
msgAdapter.removeClient(session);
JSONObject obj = new JSONObject();
obj.put("username", session.getAttribute("username"));
obj.put("numUsers", msgAdapter.getClientSize());
obj.put("action", "user-left");
String msg1 = obj.toJSONString();
msgAdapter.sendMsg(msg1);
} else {
// String msg = getMsg(session, );
String msg = f.getData().toString(Encoding.UTF8);
JSONObject obj = JSONObject.parseObject(msg);
String action = obj.getString("action");
if("new-message".equals(action)){
obj.put("username", session.getAttribute("username"));
String msg1 = obj.toJSONString();
msgAdapter.sendMsg(msg1);
}else if("add-user".equals(action)){
msgAdapter.addClient(session);
String username = (String)session.getAttribute("username");
if(username != null){
return;
}
username = obj.getString("username");
session.setAttribute("username", username);
obj.put("numUsers", msgAdapter.getClientSize());
obj.put("action", "login");
String msg1 = obj.toJSONString();
WebSocketReadFutureImpl f2 = new WebSocketTextReadFutureImpl();
f2.write(msg1);
session.flush(f2);
obj.put("username", username);
obj.put("action", "user-joined");
String msg2 = obj.toJSONString();
msgAdapter.sendMsg(msg2);
}else if("typing".equals(action)){
obj.put("username", session.getAttribute("username"));
String msg1 = obj.toJSONString();
msgAdapter.sendMsg(msg1);
}else if("stop-typing".equals(action)){
obj.put("username", session.getAttribute("username"));
String msg1 = obj.toJSONString();
msgAdapter.sendMsg(msg1);
}else if("disconnect".equals(action)){
msgAdapter.removeClient(session);
obj.put("username", session.getAttribute("username"));
obj.put("numUsers", msgAdapter.getClientSize());
obj.put("action", "user-left");
String msg1 = obj.toJSONString();
msgAdapter.sendMsg(msg1);
}else{
f.write("no action matched:"+action);
session.flush(f);
}
}
}
演示地址:https://www.generallycloud.com/web-socket/chat/index.html
文章来自:http://www.cnblogs.com/gifisan/p/5946297.html
[已解决][HTML5]基于WebSocket开发聊天室应用的更多相关文章
- [已解决][HTML5]基于WebSocket开发小蝌蚪应用
前端时间在网上看到别人用WebSocket开发的小蝌蚪应用很炫酷,不过是php,于是想着用java也实现一套, 找到前端 https://github.com/danielmahal/Rumpetro ...
- Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G
code&monkey Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...
- 基于WebSocket实现聊天室(Node)
基于WebSocket实现聊天室(Node) WebSocket是基于TCP的长连接通信协议,服务端可以主动向前端传递数据,相比比AJAX轮询服务器,WebSocket采用监听的方式,减轻了服务器压力 ...
- 第一节:.Net版基于WebSocket的聊天室样例
一. 说在前面的话 该篇文章为实时通讯系列的第一节,基于WebSocket编写了一个简易版聊天样例,主要作用是为引出后面SignalR系列的用法及其强大方便之处,通过这个样例与后续的SignalR对比 ...
- 基于webSocket的聊天室
前言 不知大家在平时的需求中有没有遇到需要实时处理信息的情况,如站内信,订阅,聊天之类的.在这之前我们通常想到的方法一般都是采用轮训的方式每隔一定的时间向服务器发送请求从而获得最新的数据,但这样会浪费 ...
- WebSocket 网页聊天室
先给大家开一个原始的websocket的连接使用范例 <?php /* * recv是从套接口接收数据,也就是拿过来,但是不知道是什么 * read是读取拿过来的数据,就是要知道recv过来的是 ...
- websocket+golang聊天室
原文地址: http://www.niu12.com/article/3 websocket+golang聊天室 main.go和index.html放在同一目录下 main.go package m ...
- 基于websocket vue 聊天demo 解决方案
基于websocket vue 聊天demo 解决方案 demo 背景 电商后台管理的客服 相关技术 vuex axios vue websocket 聊天几种模型 一对一模型 一对一 消息只一个客户 ...
- 关于websocket制作聊天室的的一些总结
websocket的总结 在一个聊天室系统中,常常使用websocket作为通信的主要方式.参考地址:https://www.jianshu.com/p/00e... 关于自己的看法:websocke ...
随机推荐
- 读书笔记:const和readonly、static readonly 那些事
C#中表示不变的量(常量)的两种形式:const 和readonly const 是静态常量 readonly 是动态常量 严格的来讲:const 应该称为常量 而readonly 则应称为只读变量. ...
- LR11破解License
golba-65000: AEACFSJI-YJKJKJJKEJIJD-BCLBR golba-100: AEAMAUIK-YAFEKEKJJKEEA-BCJGI web-10000: AEABEXF ...
- centos 基本调优
一.内核(sysctl.conf) 1.加大端口号范围net.ipv4.ip_local_port_range = 10240 65000 2.tcp/ip重用及超时限制net.ipv4.tcp_sy ...
- Thinking in Java——笔记(16)
Arrays Why arrays are special There are three issues that distinguish arrays from other types of con ...
- FireDAC 连接SQL Server一些要注意的地方
TFDConnection: FetchOptions.Mode 设置为fmAll, 返回全部结果, 否则默认只返回前50条, 效果与open以后再执行FetchAll一样 Specifies how ...
- js获取当前时间戳 不需毫秒数
var timestamp = Date.parse(new Date())/1000;
- iOS项目的本地化处理(多国语言)
项目的本地化就是:iOS系统在不同语言环境下自动切换语言,从而实现一个app发布到全世界各个国家的AppStore上. 我们不仅仅需要在iOS项目中做本地化处理,在上架iOS APP的时候,也需要做对 ...
- oracle 中的cascade
级联删除,比如你删除某个表的时候后面加这个关键字,会在删除这个表的同时删除和该表有关系的其他对象
- SQLite - TRUNCATE TABLE
https://www.tutorialspoint.com/sqlite/sqlite_truncate_table.htm Unfortunately, no TRUNCATE TABLE in ...
- sed处理url编码解码=== web日志的url处理
URL 编码/解码方法(linux shell实现),方法如下: 1.编码的两种方法: admin@~ 11:14:29>echo '手机' | tr -d '\n' | xxd -plain ...