通过实现简单聊天室了解websocket的基础使用
websocket基础使用
用到的依赖包
websocket的依赖
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.1</version>
<scope>provided</scope>
</dependency>
json-lib的依赖
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
</dependency>
服务端代码实现
服务端需要Servlet3.0的注解
@ServerEndpoint("/websocket/{name}") : 用于标记该类为websocket服务端类
name用于记录当前websocket是谁,用于区分连接的用户
servlet是单例对象,websocket是多里对象,因为他需要实时连接,与要知道每个连接是谁
(解释都在注释里,不多赘述)public class WebSocket {
private String name;//用于记录当前websocket是谁,用于区分连接的用户
private Session session; //webSocket中的session 链接,用于记录当前的连接 private static Map<String,WebSocket> allClients = new HashMap<>(); public Session getSession(){
//...
} public void setSession() {
//...
} /**
*
* @param name 嗲表地址参数中的name
* @param session 当前建立的链接
*/
@OnOpen //标志建立连接的注释
public void openConnection(@PathParam("name") String name,Session session){
this.name = name;
this.session = session;
allClients.put(name,this);//将name与webSocket绑定
} /**
* 当服务器接受到消息时触发
* @param message
* @param session 当前建立的链接
*/
@OnMessage //用于接收客户端发来的消息,这个地方应该根据自己的实际业务需求,来决定到底写什么
public void onMessage(Session session,String message) {
//1.首先解析发过来的内容,找到目标接收者:通过名字找到名字对应的websocket对象,获取websocket对象中的session,创建一个固定容器用于存放对应key-value值:String-WebSocket
JSONObject jsonObject JSONObject.fromObject(message); //与前端约定,接收者为toUser,发送信息内容为toMessage
String to = jsonObject.getString("toUser");//找到接收者
String toMessage = jsonObject.getString("toMessage");//获取到发送的内容
//2.根据目标接收者,找到它的session链接
WebSocket webSocket = allClients.get(to);//获取到目标接收者的webSocket
//3.通过session发消息
if(WebSocket != null){
Session toSession = webSocket.getSession();//获取到服务器和目标接收者的链接
if(toSession.isOpen()) {
//toSession为要发送的目标者,getAsyncRemote获得链接的相对的另一端
toSession.getAsyncRemote().sendText(toMessage);
}
}else {
//正常来说应该缓存这个消息,这里我就直接发送留言,对方不在线
session.getAsyncRemote().sendText("对方不在线");
} } /**
* 当服务器发生异常时触发
* @param e 可抛出的异常
* @param session 哪个链接出现了异常
*/
@OnError
public void onError(Session session,Throwable e) { } /**
* 当链接关闭的时候触发
* @param e 可抛出的异常
* @param session 哪个链接出现了异常
*/
@OnClose
public void onClose(Session session){ } }
客户端js代码
var websocket = null; //-------------===客户端获取websocekt链接===-----------------
function connection(){
var username="";//对应服务端的name TODO:更具具体情况获得一个username用于表示当前的链接
//首先判断当前浏览器是否支持websocket
if('WebSocket' in window) {
//创建websocket
websocket = new WebSocket("ws://"+document.location.host+"/websocket"+username);
}else{
alert('当前浏览器不支持websocket');
} //建立链接的回调
websocket.onopen = function() {
console.log("链接建立了")
} //收到消息时
websocket.onmessage = function(event) {
//获得消息,并打印
console.log(event.data)
} websocket.onerror = function() {
console.log("出现异常了")
} websocket.onclose = function() {
console.log("链接关闭了")
} //当浏览器的页面窗口关闭的时候,此时应该关闭链接,防止服务器出现异常
window.onbeforeunload = = function() {
if (websocket!=null){
websocket.close();
}
}
} //------------==发送消息==-----------
function sendMessage(){
//1.获取到发送给谁
var toUser = "";//Dom操作,此处省略了
//2.获取到发送的内容
var toMessage = ""//Dom操作,此处省略了 if(websocket!=null) {
//拼json串
var message = "{'toUser':"+toUser+","+"'toMessage':"+toMessage+"}";】
//发送json串
websocket.send(message);
}
}
通过实现简单聊天室了解websocket的基础使用的更多相关文章
- 学习WebSocket(二):使用Spring WebSocket做一个简单聊天室
聊天室高频率.低延时完全符合websocket的特点,所以聊天室使用websocket再适合不过了. 聊天室的功能并没有比上一节代码多多少,主要在握手阶段对用户的session做处理,对用户的消息进行 ...
- SpringBoot 搭建简单聊天室
SpringBoot 搭建简单聊天室(queue 点对点) 1.引用 SpringBoot 搭建 WebSocket 链接 https://www.cnblogs.com/yi1036943655/p ...
- 利用socket.io+nodejs打造简单聊天室
代码地址如下:http://www.demodashi.com/demo/11579.html 界面展示: 首先展示demo的结果界面,只是简单消息的发送和接收,包括发送文字和发送图片. ws说明: ...
- 基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍。最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室。
基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍.最后我们将会实现一个基于S ...
- Python Socket 简单聊天室2
上篇文章写了一个简单的单线程的一问一答的简单聊天室.这次我们使用SocketServer模块搭建一个多线程异步的聊天室. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...
- Asp.Net SignalR - 简单聊天室实现
简单聊天室 使用持久链接类我们就可以做一些即时通讯的应用了,我使用Group做了一个简单的聊天室,先上图技术细节下面再讲 可以加入聊天室.创建聊天室.发送消息,下面就说说我是如何通过Group做出来的 ...
- ASP.NET SingalR + MongoDB 实现简单聊天室(一):搭建基本框架
ASP.NET SingalR不多介绍.让我介绍不如看官网,我这里就是直接上源代码,当然代码还是写的比较简单的,考虑的也少,希望各位技友多多提意见. 先简单介绍聊天室功能: 用户加入聊天室,自动给用户 ...
- C#实例之简单聊天室(状态管理)
前言 状态管理是在同一页或不同页的多个请求发生时,维护状态和页信息的过程.因为Web应用程序的通信协议使用了无状态的HTTP协议,所以当客户端请求页面时,ASP.NET服务器端都会重新生 ...
- java web利用mvc结构实现简单聊天室功能
简单聊天室采用各种内部对象不适用数据库实现. 一个聊天室要实现的基本功能是: 1.用户登录进入聊天室, 2.用户发言 3.用户可以看见别人发言 刚才算是简单的需求分析了,现在就应该是进 ...
随机推荐
- Array.prototype.slice.call()方法的理解
1.基础1)slice() 方法可从已有的数组中返回选定的元素. start:必需.规定从何处开始选取.如果是负数,那么它规定从数组尾部开始算起的位置.也就是说,-1 指最后一个元素,-2 指倒数第二 ...
- HTML table表头固定
HTML table表头固定 说说我在最近项目中碰到的css问题吧,作为问题知识集合总结笔记: <!DOCTYPE html> <html> <head> < ...
- php--0与空的判断
使用empty()函数判断,两者都是true $a=0; if(trim($a)=="") { echo '数字0'; }
- C++二级指针和指针引用传参
前提 一级指针和引用 已经清晰一级指针和引用. 可参考:指针和引用与及指针常量和常量指针 或查阅其他资料. 一级指针和二级指针 个人觉得文字描述比较难读懂,直接看代码运行结果分析好些,如果想看文字分析 ...
- 【转载】解决StackOverFlow不能登录的问题
解决StackOverFlow不能登录的问题 原创 2017年04月08日 13:32:21 标签: stack overflow / firefox / 浏览器 今天想着使用谷歌浏览器登录sta ...
- webpack debug
chrome地址栏输入:chrome://inspect/#devices 点击 Open dedicated DevTools for Node 在需要打断点的地方加入debugger 控制台输入 ...
- box-sizing: border-box
如果在元素上设置了 box-sizing: border-box; 则 padding(内边距) 和 border(边框) 也包含在 width 和 height 中
- spring入门(14)
AOP是一个新的专题,基础部分主要是入门 后续的五.六.七都属于AOP专题: 所以有必要对这三章要学什么有个全局的认识. 1 概要 1 什么是AOP及实现方式 介绍了AOP的用途,以及大致的实现方案 ...
- 14、创建/恢复ETH钱包身份
借助网上的一段描述: 若以银行账户为类比,这 5 个词分别对应内容如下: 地址=银行卡号密码=银行卡密码私钥=银行卡号+银行卡密码助记词=银行卡号+银行卡密码Keystore+密码=银行卡号+银行卡密 ...
- C++扬帆远航——13(个人所得税计算器)
/* * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:shui.cpp * 作者:常轩 * 微信公众号:Worldhe ...