JAVA实现webSocket网页聊天室
一、什么是webSocket
WebSocket 是一种网络通信协议,是持久化协议。RFC6455 定义了它的通信标准。
WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
二、为什么要使用webSocket
传统的web通信是使用的http技术,http协议是无状态的、无连接的、单向的应用层协议。一次请求只能对应一个响应,通信请求只能由客户端发出,服务端对请求做出响应。所以服务端发出响应是非常被动的,这种被动的响应注定了服务端无法及时的给客户端主动推送响应,如果服务端有连续的状态变化的时候,客户端获取是很困难的。通过频繁使用了异步ajax去不断地获取请求去实现长轮询,这样做是特别消耗性能,而且效率低下。(不停的握手,或者长时间保持live)。
而webSocket允许服务器和客户端之间建立全双工通信,只要建立一次连接,就能一直保持连接状态。一旦建立一次连接,就能双方互相通信,不需要多次握手。
三、实现WEB聊天室
- 添加pom.xml,引入jar包
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
2.建立html和js文件
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>在线聊天室</title>
<script type="text/javascript" src="./static/jquery-3.2.0.min.js"></script>
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
</head>
<body>
<div>
<div><span>聊天室</span>
<button class="btn btn-warning" onclick="doClose();">退出聊天</button>
</div>
<div><textarea class="form-control" style="width: 40%;" rows="3" id="contentInp"></textarea></div><hr/>
<div><button class="btn btn-danger" onclick="doClear();">清空会话框</button></div>
<div id="content">开始聊天<br/></div>
</div>
</body>
<script type="text/javascript">
var ws = new WebSocket("ws://localhost:8080/ws/websocket"); //controller层url
$(function(){
$("#contentInp").keyup(function(evt){
if(evt.which == 13){ //enter键发送消息
var htm = $("#contentInp").val();
doSend(htm);
$("textarea").empty();
}
});
}) ws.onopen = function(){
appendHtm("连接成功!");
} // 从服务端接收到消息,将消息回显到聊天记录区
ws.onmessage = function(evt){
appendHtm(evt.data);
} ws.onerror = function(){
appendHtm("连接失败!");
} ws.onclose = function(){
appendHtm("连接关闭!");
} function appendHtm(htm){
($("#content")[0]).innerHTML += htm +"<br/>"
} // 注销登录
function doClose(){
ws.close();
} // 发送消息
function doSend(htm){
// ($("#content")[0]).innerHTML += htm +"<br/>"
ws.send(htm);
} function doClear(){
$("#content").empty();
}
</script>
</html>
3.后台java代码
package controller; import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet; import javax.net.ssl.SSLSession;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint; @ServerEndpoint("/websocket")
public class WebScoketServer { private static Integer onlineNum = 0; //当前在线人数,线程必须设计成安全的
private static CopyOnWriteArraySet<WebScoketServer> arraySet = new CopyOnWriteArraySet<WebScoketServer>(); //存放每一个客户的的WebScoketServer对象,线程安全
private Session session; /**
* 连接成功
* @param session 会话信息
*/
@OnOpen
public void onOpen(Session session) {
this.session =session;
arraySet.add(this);
this.addOnlineNum();
System.out.println("有一个新连接加入,当前在线 "+this.getOnLineNum()+" 人");
} /**
* 连接关闭
*/
@OnClose
public void onClose() {
arraySet.remove(this);
this.subOnlineNum();
System.out.println("有一个连接断开,当前在线 "+this.getOnLineNum()+" 人");
} /**
* 连接错误
* @param session
* @param error
*/
@OnError
public void onError(Session session, Throwable error) {
System.err.println("发生错误!");
error.printStackTrace();
} /**
* 发送消息,不加注解,自己选择实现
* @param msg
* @throws IOException
*/
public void onSend(String msg) throws IOException {
this.session.getBasicRemote().sendText(msg);
} /**
* 收到客户端消息回调方法
* @param session
* @param msg
*/
@OnMessage
public void onMessage(Session session, String msg) {
System.out.println("消息监控:"+msg);
for (WebScoketServer webScoketServer : arraySet) {
try {
webScoketServer.onSend(msg);
} catch (IOException e) {
e.printStackTrace();
continue;
}
}
}
/**
* 增加一个在线人数
*/
private synchronized void addOnlineNum() {
onlineNum++;
} /**
* 减少一个在线人数
*/
private synchronized void subOnlineNum() {
onlineNum--;
} private Integer getOnLineNum() {
return onlineNum;
}
}
4.完成后效果
JAVA实现webSocket网页聊天室的更多相关文章
- WebSocket 网页聊天室
先给大家开一个原始的websocket的连接使用范例 <?php /* * recv是从套接口接收数据,也就是拿过来,但是不知道是什么 * read是读取拿过来的数据,就是要知道recv过来的是 ...
- WebSocket 网页聊天室的实现(服务器端:.net + windows服务,前端:Html5)
websocket是HTML5中的比较有特色一块,它使得以往在客户端软件中常用的socket在web程序中也能轻松的使用,较大的提高了效率.废话不多说,直接进入题. 网页聊天室包括2个部分,后端服务器 ...
- Java和WebSocket开发网页聊天室
小编心语:咳咳咳,今天又是聊天室,到现在为止小编已经分享了不下两个了,这一次跟之前的又不大相同,这一次是网页聊天室,具体怎么着,还请各位看官往下看~ Java和WebSocket开发网页聊天室 一.项 ...
- JavaWeb网页聊天室(WebSocket即时通讯)
原文:http://baike.xsoftlab.net/view/656.html Git地址 http://git.oschina.net/loopcc/WebSocketChat 概要: Web ...
- Spring之WebSocket网页聊天以及服务器推送
Spring之WebSocket网页聊天以及服务器推送 转自:http://www.xdemo.org/spring-websocket-comet/ /Springframework /Spring ...
- Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G
code&monkey Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...
- 基于flask的网页聊天室(四)
基于flask的网页聊天室(四) 前言 接前天的内容,今天完成了消息的处理 具体内容 上次使用了flask_login做用户登录,但是直接访问login_requare装饰的函数会报401错误,这里可 ...
- Java网络编程案例---聊天室
网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java.net包中JavaSE的API包含有类和接口,它们提供低层次的通信细节.你可以直接使用这些类和接口,来专注于解决 ...
- 基于WebSocket实现聊天室(Node)
基于WebSocket实现聊天室(Node) WebSocket是基于TCP的长连接通信协议,服务端可以主动向前端传递数据,相比比AJAX轮询服务器,WebSocket采用监听的方式,减轻了服务器压力 ...
随机推荐
- zabbix 接口 | zabbix api 实践
原文地址:https://www.jianshu.com/p/d5faa110e78e zabbix 接口地址:https://www.zabbix.com/documentation/3.2/man ...
- 启动Eclipse时,出现 “Failed to load the JNI shared library "C:\Program Files\java\jdk1.7.....\jvm.dll"
原因1:给定目录下jvm.dll不存在. 解决方法:(1)重新安装jre或者jdk并配置好环境变量. (2)copy一个jvm.dll放在该目录下. 原因2:eclipse的版本与jre或者jdk版本 ...
- CodeForces - 796B-Find The Bone(模拟)
Zane the wizard is going to perform a magic show shuffling the cups. There are n cups, numbered from ...
- Linux上常用命令整理(一)—— cat
近几个月刚从windows上转过来,开始慢慢熟悉linux,先不撕比到底哪个更好,首先要怀着相互借鉴的精神去了解各个平台. Linux上做开发,除去使用文本编辑器做开发的大神之外,大家(包括我这种菜鸟 ...
- Vijos 1002 过河 dp + 思维
https://www.vijos.org/p/1002 设dp[i]表示跳到了第i个点,需要的最小的步数. 所以复杂度O(L * T), 不行 注意到T最大是10, 所以dp[i]最多只由10项递推 ...
- leecode-39. Combination Sum
1.问题描述: Given a set of candidate numbers (C) (without duplicates) and a target number (T), find all ...
- Solr创建索引问题
问题描述: 8月 19, 上午10点27:58.219 WARN com.ngdata.hbaseindexer.supervisor.IndexerSupervisor No indexer pro ...
- jQuery的一些备忘
操作元素的样式 主要包括以下几种方式: $("#msg").css("background"); //返回元素的背景颜色 $("#msg") ...
- WebStorm技巧-集成命令行工具插件
打开菜单项 File -> Settings- 搜索插件 CMD Support,并安装. 重启WebStorm,在你的项目中新建一个Cmd script 文件,命名为build.cmd ...
- winform代码生成器(三)
代码下载 地址 http://pan.baidu.com/s/1nuZjyat 接上面的两篇. 用户有时对 从表的 排版不喜欢,可以因某些字太长,需要拉长一些,有些则需要隐藏. 有什么办法呢? 我的思 ...