做网站跟赚钱嘛/佛山网络推广哪里好

做网站跟赚钱嘛,佛山网络推广哪里好,写作网站5妙不写就删除,公司网站手机版设计目录 一、 websocket 概念二、WebSocket原理三、WebSocket特点四、WebSocket应用场景五、Websocket基本使用1、创建Websocket对象2、Websocket事件3、Websocket方法4、前端服务程序 六、聊天室案例1、Tomcat版本:8.0.442、Maven 依赖:3、前端代码4、后端…

目录

    • 一、 websocket 概念
    • 二、WebSocket原理
    • 三、WebSocket特点
    • 四、WebSocket应用场景
    • 五、Websocket基本使用
      • 1、创建Websocket对象
      • 2、Websocket事件
      • 3、Websocket方法
      • 4、前端服务程序
    • 六、聊天室案例
      • 1、Tomcat版本:8.0.44
      • 2、Maven 依赖:
      • 3、前端代码
      • 4、后端代码

一、 websocket 概念

WebSocket是HTML5提供的一种浏览器与服务器进行全双工通讯的网络技术,属于应用层协议。它基于TCP传输协议,并复用HTTP的握手通道。浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接, 并进行双向数据传输。WebSocket 的出现就解决了半双工通信的弊端。它最大的特点是:服务器可以向客户端主动推动消息,客户端也可以主动向服务器推送消息。

获取到最新的信息,只有再次发起客户端请求,服务器端才会返回结果。但是服务器端不能做到推送消息给客户端,当然我们可以使用轮询,查看服务器有没有新的消息

二、WebSocket原理

客户端向 WebSocket 服务器通知(notify)一个带有所有接收者ID(recipients IDs)的事件(event),服务器接收后立即通知所有活跃的(active)客户端,只有ID在接收者ID序列中的客户端才会处理这个事件。
在这里插入图片描述

三、WebSocket特点

  • 支持双向通信,实时性更强,相对于HTTP请求需要等待客户端发起请求服务端才能响应,延迟明显更少
  • 可以发送文本,也可以发送二进制数据
  • 建立在TCP协议之上,服务端的实现比较容易
  • 数据格式比较轻量,性能开销小,通信高效
  • 没有同源限制,客户端可以与任意服务器通信
  • 协议标识符是ws(如果加密,则为wss),服务器网址就是 URL
  • 与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器

四、WebSocket应用场景

  • 弹幕
  • 媒体聊天
  • 协同编辑
  • 基于位置的应用
  • 体育实况更新
  • 股票基金报价实时更新

五、Websocket基本使用

在HTML5中,浏览器已经实现了websocket的API,直接使用即可:WebSocket-MDN

1、创建Websocket对象

// 参数1: url:连接的websocket属性
// 参数2: protocol,可选的,指定连接的协议
// var socket = new WebSocket('ws://echo.websocket.org')
var Socket = new WebSocket(url, [protocol] );

2、Websocket事件

事件事件处理程序描述
openSocket.onopen连接建立时触发
messageSocket.onmessage客户端接收服务端数据时触发
errorSocket.onerror通信发生错误时触发
closeSocket.onclose连接关闭时触发

3、Websocket方法

方法描述
Socket.send()使用连接发送数据
Socket.close()关闭连接

WebSocket的状态

可以通过读取readyState的属性值来获取WebSocket对象的状态,readyState属性存在以下几种属性值。

  • CONNECTING(数字值为0),表示正在连接;
  • OPEN(数字值为1),表示已建立连接;
  • CLOSING(数字值为2),表示正在关闭连接;
  • CLOSED(数字值为3),表示已关闭链接。

4、前端服务程序

// 导入第三方模块
const ws = require('nodejs-websocket')
var websocket = new WebSocket("ws://172.16.116.22:8088/WebSocket/chatServer/"+nickname);
// websocket占用的端口号
const PORT = 3000const server = ws.createServer(connect => {console.log('新的连接')// 接收到客户端的文本内容时触发connect.on('text', str => {console.log('接收:' + str)// 把接收到的字符串转换成大写,并且给客户端响应connect.sendText(str.toUpperCase() + '!!!!')})// 监听关闭事件connect.on('close', () => {console.log('连接关闭了')})// 监听错误事件, 比如浏览器关闭了连接,或者发送的数据格式不对等connect.on('error', err => {console.log('连接异常')})
})// 启动websocket服务
server.listen(PORT, function() {console.log(`websocket server listening on ${PORT}`)
})

WebSocket的前端API

  • WebSocket需要接收一个url参数,然后调用WebSocket对象的构造器来建立与服务器之间的通信链接。
    websocket = new WebSocket(“ws://localhost:8088/chatServer/”+nickname);

    • URL字符串必须以 “ws” 或 “wss”(加密通信)开头。
    • 利用上面的代码,我们的通信连接建立之后,就可以进行客户端与服务器端的双向通信了。可以使用WebSocket对象的send方法对服务器发送数据,但是只能发送文本数据(我们可以使用JSON对象把任何js对象转换成文本数据后再进行发送)。
  • websocket.send(“data”);

    • websocket.send(“data”);
  • websocket.onmessage = function(event) {

    websocket.onmessage = function(event) {var data = event.data;
    }
    
  • 监听socket的打开事件

    • 通过获取onopen事件来监听socket的打开事件。如下代码:
      websocket.onopen = function(event) {
      // 开始通信时的处理
      }
      
  • 通过获取onclose事件来监听socket的关闭事件。如下代码:

    websocket.onclose = function(event) {
    // 通信结束时的处理
    }
    
  • 关闭socket
    通过close方法来关闭socket, 如下代码:

    websocket.close();

六、聊天室案例

1、Tomcat版本:8.0.44

2、Maven 依赖:

<dependency><groupId>javax.websocket</groupId><artifactId>javax.websocket-api</artifactId><version>1.1</version><scope>provided</scope></dependency>
<!--    <dependency>-->
<!--      <groupId>javax</groupId>-->
<!--      <artifactId>javaee-api</artifactId>-->
<!--      <version>8.0</version>-->
<!--    </dependency>--><!--    导入servlet-->
<!--    处理JSON-->
<!--    <dependency>-->
<!--      <groupId>com.alibaba</groupId>-->
<!--      <artifactId>fastjson</artifactId>-->
<!--      <version> 1.2.58</version>-->
<!--    </dependency>--><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.5</version></dependency>

3、前端代码

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>聊天室</title><link rel="stylesheet" href=""><style type="text/css" media="screen">*{margin: 0px;padding: 0px;}.all{width: 900px;height: 700px;margin: 0 auto;}.all-top{width: 100%;height: 30px;background-color: yellow;}.all-center{width: 100%;height: 570px;/*添加滚动条*/overflow-y: scroll;background-color: pink;}.all-bottom{width: 100%;height: 100px;background-color: green;}.number{width: 100%;height: 40px;background-color: green;text-align: center;color: #fff;font-size: 20px;}</style>
</head>
<body>
<div class="all"><div class="all-top">昵称:<input type="text" id="nickname"><button type="button" onclick="connect()">链接</button></div><div class="number" id="number">当前在线人数:0</div><div class="all-center" id="message">IP:172.16.116.22 <br>端口是:8088<br>工程是:WebSocket<br>接口是:chatServer<br></div><div class="all-bottom">发送信息:<input type="text" id="msg"><button type="button" onclick="sendMsg()">发送</button></div>
</div>
</body>
<script  type="text/javascript">/*ws:// 代表 websocket*//*127.0.0.1:8088 后端服务地址*//*WebSocket 工程名称*//*chatServer 对应@ServerEndpoint注解的value属性*/var websocket = null;//链接后端服务器function connect(){if(websocket != null){return;}var nickname = document.getElementById("nickname").value;console.log(nickname)websocket = new WebSocket("ws://localhost:8088/chatServer/"+nickname);//链接成功时触发websocket.onopen = function(){setMsgToPage("你链接上聊天服务器了!");}//收到服务器端信息触发websocket.onmessage = function(event){var data = JSON.parse(event.data)if(data.code == 1){//接收到的是聊天信息var umsg = data.name + "说:" + data.msg;setMsgToPage(umsg);}else if(data.code == 2){//上线document.getElementById("number").innerHTML = "当前在线人数:"+data.number+"人";setMsgToPage("舰长:"+data.name+"进入直播间");}else if(data.code == 3){//下线document.getElementById("number").innerHTML = "当前在线人数:"+data.number+"人";setMsgToPage("舰长:"+data.name+"离开直播间");}}//发生异常时触发websocket.onerror = function(){}//链接关闭触发websocket.onclose = function(){}}//用来给后端发送信息function sendMsg(){//获取用户输入的信息var msg = document.getElementById("msg").value;//给后端发送websocket.send(msg);}//把信息赋值到页面function setMsgToPage(msg){document.getElementById("message").innerHTML += msg + "</br>";}</script>
</html>

4、后端代码

import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;//WebSocket服务
//value是WebSocket接口地址
@ServerEndpoint(value="/chatServer/{userName}")
public class ChatServer {//session使用来保存用户状态信息的//CopyOnWriteArraySet == set 但是CopyOnWriteArraySet是线程安全的private static CopyOnWriteArraySet<Session> socketSet = new CopyOnWriteArraySet<Session>();//1.0用户连接时触发@OnOpenpublic void onOpen(@PathParam("userName")String name,Session session){System.out.println("用户开始链接");//Session 用户的信息 用户的状态socketSet.add(session);for(Session s:socketSet){//给所有在集合内的用户广播信息try {if(s.isOpen()){s.getBasicRemote().sendText("{\"code\":2,\"number\":\""+socketSet.size()+"\",\"name\":\""+name+"\"}");}else{s.close();}} catch (IOException e) {e.printStackTrace();}}}//2.0接收到用户信息时触发@OnMessagepublic void onMessage(@PathParam("userName")String name,String data,Session session){for(Session s:socketSet){//给所有在集合内的用户广播信息try {if(s.isOpen()){s.getBasicRemote().sendText("{\"code\":1,\"name\":\""+name+"\",\"msg\":\""+data+"\"}");}else{s.close();}} catch (IOException e) {e.printStackTrace();}}}//3.0用户下线时触发@OnClosepublic void onClose(@PathParam("userName")String name,Session session){//用户下线时删除这个socketSet.remove(session);for(Session s:socketSet){//给所有在集合内的用户广播信息try {if(s.isOpen()){s.getBasicRemote().sendText("{\"code\":3,\"number\":\""+socketSet.size()+"\",\"name\":\""+name+"\"}");}else{s.close();}} catch (IOException e) {e.printStackTrace();}}}//4.0连接异常时触发
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/74046.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

字符指针的三道例题+算法改进

目录 一.杨氏矩阵 1.初级 2.想把下标带回来 二.字符串左旋 算法改进 三.判断是否为字符串旋转结果 算法改进 四. 3个字符函数 1.strcat 2.strncat 3.strstr 一.杨氏矩阵 数字矩阵&#xff0c;每行从左到右递增&#xff0c;每列从上到下递增&#xff0c;编写程序在矩…

VSCode中搜索插件显示“提取扩展时出错。Failed to fetch”问题解决!

大致的问题如下&#xff0c;在VSCode的插件商店搜索插件时提示如下&#xff1a; 导致的情况有以下几点&#xff1a; 1、代理问题&#xff0c;如果是代理引起的&#xff0c;可以继续使用代理后也能搜索和安装插件。 2、还有可能是你的所连接的网络设置了防火墙&#xff0c;比较…

双指针(2)—三数之和

文章目录 题目解析解法&#xff08;排序双指针&#xff09;&#xff1a;哈希解法附加Java代码&#xff1a; 力扣题目&#xff1a;三数之和 题目解析 解法&#xff08;排序双指针&#xff09;&#xff1a; **算法思路&#xff1a;** 本题与两数之和类似&#xff0c;是⾮常经典的…

JVM 知识点梳理

JDK 、JRE、JVM JDK&#xff08; Java Development Kit &#xff09; Java开发工具包 JRE 开发命令工具&#xff08;运行java.exe、编译javac.exe、javaw.exe&#xff09; JRE&#xff08; Java Runtime Environment &#xff09;Java运行环境 JVM Java核心类库&#xff08;l…

DeepSeek-R1论文深度解析:纯强化学习如何引爆LLM推理革命?

技术突破&#xff1a;从“无监督”到“自主进化”的跨越 paper &#xff1a;https://arxiv.org/pdf/2501.12948目录 技术突破&#xff1a;从“无监督”到“自主进化”的跨越1 DeepSeek-R1-Zero&#xff1a; RLnoSFT1.1 R1-Zero&#xff1a; GRPO&#xff08;Group Relative Po…

表格标题竖直

使用文本方式使表格怎么竖列 思路&#xff1a;表格竖直书写&#xff0c;里面的内容水平书写 使用到的是css中的文本效果&#xff1a; writing-mode&#xff1a;书写方式horizontal-tb&#xff1a;水平vertical-rl&#xff1a;竖直<style>table {writing-mode: vertical…

AI+视频赋能智慧农业:EasyCVR打造全域可视化农场监管平台

随着科技的飞速发展&#xff0c;传统农业正加速向智慧农业转型&#xff0c;农场管理也迎来了前所未有的变革机遇。在这一进程中&#xff0c;如何有效整合先进的信息技术&#xff0c;实现农场的精准化、智能化管理&#xff0c;成为了摆在农场主和农业管理者面前的关键课题。 基于…

简化神经元模型6 -- Hindmarsh-Rose Model

Hindmarsh-Rose 模型 目录 0. 写在前面 1. Hindmarsh-Rose 模型的定义 2. Hindmarsh-Rose 模型簇发放的动力学机制 3. Hindmarsh-Rose 模型的其他发放模式 4. 分析过程所用到的一系列 BrainPy 代码 0. 写在前面 前面介绍了: Hodgkin-Huxley Model 简化神经元模型1 – LIF M…

第六届电气、电子信息与通信工程国际学术会议 (EEICE 2025)

重要信息 官网&#xff1a;www.eeice.net&#xff08;点击了解参会投稿等&#xff09; 时间&#xff1a;2025年4月18-20日 地点&#xff1a;中国-深圳技术大学 简介 第六届电气、电子信息与通信工程 (EEICE 2025&#xff09;将于2025年4月18-20日在中国深圳召开。 EEICE 20…

计算机操作系统(三) 操作系统的特性、运行环境与核心功能(附带图谱更好对比理解))

计算机操作系统&#xff08;三&#xff09; 操作系统的特性、运行环境与核心功能 前言一、操作系统的基本特性1.1 并发1.2 共享1.3 虚拟1.4 异步 二、操作系统的运行环境2.1 硬件支持2.2 操作系统内核2.3 处理机的双重工作模式2.4 中断与异常 三、操作系统的主要功能3.1 处理机…

批量将 PPT 转换为PDF/XPS/JPG图片等其它格式

PPT 文档经常有转换为其它格式的需求&#xff0c;比如将 PPT 转换为 PDF、将 PPT 转换为图片、生成 PPT 预览图等&#xff0c;这在某些场景下非常的有用&#xff0c;今天给大家介绍的就是如何批量将 PDF 转换为 PDF、JPG、Tiff 等多种格式的操作。 在工作中我们经常需要接触 PP…

【css酷炫效果】纯CSS实现3D翻转卡片动画

【css酷炫效果】纯CSS实现3D翻转卡片动画 缘创作背景html结构css样式完整代码效果图 想直接拿走的老板&#xff0c;链接放在这里&#xff1a;https://download.csdn.net/download/u011561335/90490472 缘 创作随缘&#xff0c;不定时更新。 创作背景 刚看到csdn出活动了&am…

Flask多参数模版使用

需要建立目录templates&#xff1b; 把建好的html文件放到templates目录里面&#xff1b; 约定好参数名字&#xff0c;单个名字可以直接使用&#xff1b;多参数使用字典传递&#xff1b; 样例&#xff1a; from flask import render_template # 模板 (Templates) #Flask 使用…

SVN简明教程——下载安装使用

SVN教程目录 一、开发中的实际问题二、简介2.1 版本控制2.2 Subversion2.3 Subversion的优良特性2.4 工作原理2.5 SVN基本操作 三、Subversion的安装与配置1. 服务器端程序版本2. 下载源码包3. 下载二进制安装包4. 安装5. 配置版本库① 为什么要配置版本库&#xff1f;② 创建目…

OpenCV图像拼接(1)概述

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 此图说明了在Stitcher类中实现的拼接模块流程。使用该类&#xff0c;可以配置/移除某些步骤&#xff0c;即根据特定需求调整拼接流程。流程中的所…

Linux 音频驱动 WM8960 音频 DAC IC 音乐播放与录音

这些先引出一个内容&#xff0c;是 Linux 内核的音频系统&#xff0c;ALSA&#xff0c;提供了对声卡的低级访问&#xff0c;支持 PCM&#xff0c;播放/录音、混音、MIDI 处理等功能。它取代了旧的 OSS&#xff0c;并提供更强大的功能和更好的硬件支持。 ALSA 主要特点&#xf…

OpenHarmony 开源鸿蒙北向开发——3.配置SDK

安装、配置完成之后我们就要配置SDK。 我们创建工程后&#xff0c;点击右上角设置 进入设置 进入OpenHarmony SDK&#xff0c;选择编辑 这里配置一下SDK安装位置 点击完成 这里我们API版本勾选第一个即可 确认安装 勾选接受 这里要等一会 安装完成后&#xff0c;点击完成

C#通过API接口返回流式响应内容---SignalR方式

1、背景 在上两篇《C#通过API接口返回流式响应内容—分块编码方式》和《C#通过API接口返回流式响应内容—SSE方式》实现了流式响应的内容。 上面的这两个主要是通过HTTP的一些功能&#xff0c;除了这些之外&#xff0c;还有WebSocket的方式。C#中的WebSocket的有比较多的方案&…

识别并脱敏上传到deepseek/chatgpt的文本文件中的身份证/手机号

本文将介绍一种简单高效的方法解决用户在上传文件到DeepSeek、ChatGPT,文心一言,AI等大语言模型平台过程中的身份证号以及手机号等敏感数据识别和脱敏问题。 DeepSeek、ChatGPT,Qwen,Claude等AI平台工具快速的被接受和使用,用户每天上传的文本数据中潜藏着大量敏感信息,…

第六:go 操作 redis-go

Redis 在项目开发中redis的使用也比较频繁&#xff0c;本文介绍了Go语言中go-redis库的基本使用。 Redis介绍 Redis是一个开源的内存数据库&#xff0c;Redis提供了多种不同类型的数据结构&#xff0c;很多业务场景下的问题都可以很自然地映射到这些数据结构上。除此之外&am…