最近了解了下websocket和socket这个东西,说不得不来说下为何要使用 WebSocket ,和为何不用http。

为何需要WebSocket ?

HTTP 协议是一种无状态的、无连接的、单向的应用层协议。它采用了请求/响应模型。通信请求只能由客户端发起,服务端对请求做出应答处理。

这种通信模型有一个弊端:HTTP 协议无法实现服务器主动向客户端发起消息。

这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。大多数 Web 应用程序将通过频繁的异步JavaScript和XML(AJAX)请求实现长轮询。轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。

因此,工程师们一直在思考,有没有更好的方法。WebSocket 就是这样发明的。WebSocket 连接允许客户端和服务器之间进行全双工通信,以便任一方都可以通过建立的连接将数据推送到另一端。WebSocket 只需要建立一次连接,就可以一直保持连接状态。这相比于轮询方式的不停建立连接显然效率要大大提高。

下面来一个例子,实现web客户端和服务器端的连续通讯。

客户端页面index.html

Java后端WebSocket的Tomcat实现

Welcome

发送消息


关闭WebSocket连接


var websocket = null;

//判断当前浏览器是否支持WebSocket

if ('WebSocket' in window) {

websocket = new WebSocket("ws://localhost:8080/Testwebsocket/websocket");

}

else {

alert('当前浏览器 Not support websocket')

}

//连接发生错误的回调方法

websocket.onerror = function () {

setMessageInnerHTML("WebSocket连接发生错误");

};

//连接成功建立的回调方法

websocket.onopen = function () {

setMessageInnerHTML("WebSocket连接成功");

}

//接收到消息的回调方法

websocket.onmessage = function (event) {

setMessageInnerHTML(event.data);

}

//连接关闭的回调方法

websocket.onclose = function () {

setMessageInnerHTML("WebSocket连接关闭");

}

//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。

window.onbeforeunload = function () {

closeWebSocket();

}

//将消息显示在网页上

function setMessageInnerHTML(innerHTML) {

document.getElementById('message').innerHTML += innerHTML + '
';

}

//关闭WebSocket连接

function closeWebSocket() {

websocket.close();

}

//发送消息

function send() {

var message = document.getElementById('text').value;

websocket.send(message);

}

服务器端:服务器端的很简单。

1.创建一个web 的maven项目

2.引入一个包

javax

javaee-api

7.0

provided

3.创建一个类。

package com.sun.web.handler;

import java.io.IOException;

import java.util.concurrent.CopyOnWriteArraySet;

import javax.websocket.*;

import javax.websocket.server.ServerEndpoint;

/**

* @ServerEndpoint 注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端,

* 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端

*/

@ServerEndpoint("/websocket")

public class WebSocketTest {

//静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。

private static int onlineCount = 0;

//concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识

private static CopyOnWriteArraySet webSocketSet = new CopyOnWriteArraySet();

//与某个客户端的连接会话,需要通过它来给客户端发送数据

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 message, Session session) {

System.out.println("来自客户端的消息:" + message);

//群发消息

for(WebSocketTest item: webSocketSet){

try {

item.sendMessage(message);

} catch (IOException e) {

e.printStackTrace();

continue;

}

}

}

/**

* 发生错误时调用

* @param session

* @param error

*/

@OnError

public void onError(Session session, Throwable error){

System.out.println("发生错误");

error.printStackTrace();

}

/**

* 这个方法与上面几个方法不一样。没有用注解,是根据自己需要添加的方法。

* @param message

* @throws IOException

*/

public void sendMessage(String message) throws IOException{

this.session.getBasicRemote().sendText(message);

//this.session.getAsyncRemote().sendText(message);

}

public static synchronized int getOnlineCount() {

return onlineCount;

}

public static synchronized void addOnlineCount() {

WebSocketTest.onlineCount++;

}

public static synchronized void subOnlineCount() {

WebSocketTest.onlineCount--;

}

}

4.以上三步就OK了,然后就是用tomcat运行就行了。

效果如图:

后期整合了springboot + websocket,并且实现了定时推送给前,还可以实现推送给某个人,不过需要参数.

地址 :

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

java ws协议_基于java实现websocket协议过程详解相关推荐

  1. java spring bean配置文件_Spring基于xml文件配置Bean过程详解

    这篇文章主要介绍了spring基于xml文件配置Bean过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 通过全类名来配置: class:be ...

  2. python 雪花id_基于python实现雪花算法过程详解

    这篇文章主要介绍了基于python实现雪花算法过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Snowflake是Twitter提出来的一个 ...

  3. netty 游戏服务器框图_基于Netty和WebSocket协议实现Web端自动打印订单服务方法与流程...

    本发明涉及电子商务技术领域,尤其涉及一种基于netty和websocket协议实现web端自动打印订单服务方法. 背景技术: 电子商务是以信息网络技术为手段,以商品交换为中心的商务活动:也可理解为在互 ...

  4. Java单机部署,Nacos docker单机模式部署实现过程详解

    Nacos 的部署,我使用的时docker 部署(单机模式 mysql),官网文档:https://nacos.io/zh-cn/docs/quick-start-docker.html 拉取代码: ...

  5. mysql查询语句详解_基于mysql查询语句的使用详解

    1> 查询数据表除了前三条以外的数据. 起初我想到的是这条语句 SELECT * FROM admin WHERE userid NOT IN (SELECT userid FROM admin ...

  6. java远控_基于java的远程控制 示例源码

    [实例简介]基于java的远程控制软件 [实例截图] 远程连接客户端如下: 服务端如下: [核心代码] package tcpudp; import java.awt.BorderLayout; im ...

  7. java邮件系统设计_基于java技术的邮件系统设计与实现

    论文字数:17915,页数:38 摘  要 电子邮件(简称E-mai1)又称电子信箱.电子邮政,它是-种用电子手段提供信息交换的通信方式.它是全球多种网络上使用最普遍的一项服务.这种非交互式的通信,加 ...

  8. java swing 皮肤_基于Java Swing开发好看的皮肤

    先介绍几款开源及商业的皮肤. Weblaf:非常赞的套件,界面现代.简约.依赖包较少. 有开源也有商业协议,个人最喜欢的皮肤. https://github.com/mgarin/weblaf Pgs ...

  9. java path类_基于java Files类和Paths类的用法(详解)

    Java7中文件IO发生了很大的变化,专门引入了很多新的类: import java.nio.file.DirectoryStream; import java.nio.file.FileSystem ...

  10. java 实现违章_基于JAVA的车辆违章查询数据调用代码实例

    基于JAVA的车辆违章查询数据调用代码实例 代码描述:基于JA V A的车辆违章查询数据调用代码实例 相关平台:聚合数据 import java.io.BufferedReader; import j ...

最新文章

  1. 中国电子学会青少年编程能力等级测试图形化四级编程题:随机选T恤
  2. 在线实时大数据平台Storm单机部署
  3. 机器学习之线性回归(Linear Regression)
  4. 【面试必备】通俗易懂的XGBoost、Transformer、BERT、水波网络原理解析
  5. 基于CDS view自动生成的OData服务,是如何实现read操作的
  6. maven自定义脚手架(快速生成项目)
  7. 毫秒转换友好的显示格式【刚刚、几秒前,几小时,几天前(3天内) 时间格式化】
  8. java 记事本全选_java 编写的记事本程序怎么实现复制 黏贴 剪切 全选的功能 ?...
  9. php清除输出缓冲,php如何清除缓冲区
  10. mysql查询临时表是否存在_[转]SQL判断临时表是否存在
  11. 搜狗浏览器收藏夹在哪_chrome谷歌浏览器收藏夹在哪_chrome收藏夹在电脑什么位置...
  12. 苹果mac三维动画设计渲染软件:Cinema 4D R20 (c4d r20)
  13. Coder Essential之编程语言学习知识点纲要
  14. 基于 wke 的浏览器:如何实现 js 和 c++ 的互相调用
  15. 蜗牛星际D款安装黑群晖教程
  16. 【App设计】互联网+商业计划书
  17. 深入浅出WPF 总结
  18. 安卓游戏开发,vs win32到eclipse apk出现的跨平台问题
  19. Cannt find target\m2e-wtp\web-resources\META-INF\MANIFEST.MF
  20. yum search htppd 的意思

热门文章

  1. 找网络营销代运营外包公司需要注意什么?
  2. Linux系统mongdb还原数据库,linux - mongodb备份mongodump、恢复mongorestore
  3. C++(一)——HelloWorld
  4. Python 生成器 思维导图
  5. sasquatch和squashfs-tools工具的安装和使用
  6. 12js数据类型的栈和堆
  7. WaveNet时间序列模型(基于GluonTs包)
  8. Graph WaveNet for Deep Spatial-Temporal Graph Modeling
  9. 让CyberArticle支持Firefox
  10. 软件工程——模块的独立性