程序猿成长之路之socket篇-socket通信原理简介

hello,各位小伙伴们大家好,上次以RSA加解密算法介绍作为密码学篇的结尾后,时光飞逝,转眼到了新一年的春季,这次将介绍一下socket通信和编程原理。

什么是socket(套接字)?

socket(套接字)是网络传输的一种工具,它是介于应用层与传输层之间,了解过七层OSI协议的同学应该知道,socket是基于TCP/IP协议进行网络传输的。socket分为server端和client端,它支持全双工式网络通信。

socket(套接字)有哪些用途?

说起socket的用途,大家可能首先会联想到聊天室,没错,这个就是socket的一类应用。由于全双工式的通信,socket可以支持双向的信息发送与接收。此外,socket还可以编写服务端向客户端主动发送消息。总之,有了socket,网络通信就变得容易了。

socket(套接字)其他知识

socket 生命周期在这里插入图片描述
在这里插入图片描述

什么是websocket?

WebSocket是一种在单个TCP连接上进行全双工通信的协议。它允许客户端和服务器之间进行简单而有效的双向数据传输。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocket API也被W3C定为标准。

WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。这个握手过程是通过HTTP/1.1协议的101状态码进行的。

websocket实现方式

websocket client端

const host = 'localhost'//设置自己的socket host
const port = 8888 	//设置自己的socket port
const ws =  new WebSocket(`ws://${host}:${port}/websocket/${username}`)
ws.onopen = () => {//创建完成websocketconsole.log('client opened')
}ws.onmessage = (msg) => {//接收到消息console.log(msg);
}ws.onerror = (err) => {//出错console.log(err);
}ws.onclose = () => {//websocket关闭时执行console.log("client closed")
}

websocket server端(node.js版)

onst ws = require('ws');const wss = new ws.Server({port:8888});wss.on('connection',function onConnection(ws) {ws.on('open',function onOpen(){console.log('connected!');ws.send("hello");});ws.on('message',function onMessage(msg){//批量群发wss.clients.forEach(function each(client) {//如果socket 为连接状态就发送消息if (client.readyState === ws.OPEN) {client.send(msg);}})})ws.on('close',function onOpen(){console.log('closed!');});
})

websocket server端(java版)
配置类:

/*** WebSocket配置类。开启WebSocket的支持*/
@Configuration
public class WebSocketConfig {/*** bean注册:会自动扫描带有@ServerEndpoint注解声明的Websocket Endpoint(端点),注册成为Websocket bean。* 要注意,如果项目使用外置的servlet容器,而不是直接使用springboot内置容器的话,就不要注入ServerEndpointExporter,因为它将由容器自己提供和管理。*/@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}
}

websocket 消息 实体类

/*** 消息实体类* @author zygswo*/
@Data
@Accessors(chain = true)
@NoArgsConstructor
@ToString
public class Message implements Serializable {/*** 来源*/private String from;/*** 目标*/private String to;/*** 正文*/private String message;/*** 发送时间*/private String date;/*** 是否系统消息*/private boolean sysmsg;
}

websocket实现类:

package com.myhouse.common.utils.myWebsocket;import com.alibaba.fastjson.JSON;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;/*** ServerEndpoint注解表示开启websocket并且参数表示websocketserver 路径*/
@Component
@Slf4j
@Getter
@ServerEndpoint("/websocket/{username}")
public class MyWebSocket {/*** 在线人数*/private static AtomicInteger totalNb = new AtomicInteger(0);/*** websocket列表*/private static Map<String,MyWebSocket> socketMap = new ConcurrentHashMap<>();/*** 在线人数*/private Session session;/*** 用户名*/private String username;/*** 开启服务* @param username 用户名称* @param session session*/@OnOpenpublic void onOpen(@PathParam("username") String username, Session session) {this.username = username;this.session = session;     //保存当前会话addOnlineCount();           //在线数加1log.info("欢迎用户" + username +  " 加入聊天室!当前在线人数为: " + getOnlineCount());}/*** 获取到消息后* @param message 消息*/@OnMessagepublic void onMessage(String message) {Message msg = JSON.parseObject(message, Message.class);try {if (msg.getTo().equalsIgnoreCase("all")) {for (MyWebSocket socket : socketMap.values()) {socket.sendMessage(message);}} else {socketMap.get(msg.getTo()).sendMessage(message);}}catch (IOException e) {e.printStackTrace();}}/*** 发送消息* @param message 消息*/private void sendMessage(String message) throws IOException {this.session.getBasicRemote().sendText(message);}/*** 获取到消息后* @param session session* @param err 错误消息*/@OnErrorpublic void onError(Session session, Throwable err) {System.out.println("发生错误");try {session.close();} catch (IOException e) {e.printStackTrace();}log.error(err.getMessage());err.printStackTrace();}/*** socket连接关闭*/@OnClosepublic void onClose() {log.info(this.username + "退出聊天室!当前在线人数为" + getOnlineCount());socket.sendMessage(msg);socketMap.remove(this.username);}/*** 新增在线人数*/private static void addOnlineCount() {totalNb.incrementAndGet();}/*** 减少在线人数*/private static void substractOnlineCount() {totalNb.decrementAndGet();}/*** 获取在线人数* @return 在线人数*/public static int getOnlineCount() {return totalNb.get();}
}

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

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

相关文章

Matlab|【分布鲁棒】数据驱动的多离散场景电热综合能源系统分布鲁棒优化算法

目录 主要内容 1.1 主要难点-分布鲁棒优化 1.2 程序求解步骤-主子问题迭代 部分结果 下载链接 主要内容 本程序主要对《基于场景聚类的主动配电网分布鲁棒综合优化》-高海淑的方法复现&#xff0c;应用到综合能源电热微网方向&#xff0c;采用拉丁超立方抽样对不同…

[计算机效率] 在当前文件夹以管理员身份运行批处理

2.7 在当前文件夹以管理员身份运行批处理 这个功能对于要经常运行批处理程序的人来说真的很方便。每次要要运行批处理&#xff0c;要么就是直接打开的批处理不是以管理员身份运行的&#xff0c;要么就是在批处理中要一步步的切换进入到目标文件夹中&#xff0c;非常费时间。 方…

录屏直播技巧大揭秘,轻松捕捉精彩瞬间

录屏直播作为一种流行的线上内容创作方式&#xff0c;备受关注。无论是游戏主播、教程讲解还是线上会议&#xff0c;录屏直播都能轻松应对。本文将介绍三种录屏直播方法&#xff0c;并对其进行分步骤详细说明&#xff0c;帮助读者轻松掌握录屏直播的技巧&#xff0c;为内容创作…

c语言 线性搜索算法

线性搜索被定义为一种顺序搜索算法&#xff0c;从一端开始&#xff0c;遍历列表中的每个元素&#xff0c;直到找到所需的元素&#xff0c;否则搜索将继续&#xff0c;直到数据集的末尾。 线性搜索算法 线性搜索算法如何工作&#xff1f; 在线性搜索算法中&#xff1a; …

Linux VM虚拟环境 设置静态IP

目录 查看自己的网卡配置说明重启网卡实例测试配置情况测试网络 查看自己的网卡 ip a配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens32配置说明 [rootlinux-server ~]# cd /etc/sysconfig/network-scripts/ #网卡配置文件存放路径 [rootlinux-server network-scri…

凡得首席战略官蔡聪,将出席“ISIG-流程挖掘技术与应用发展峰会”

3月16日&#xff0c;第四届「ISIG中国产业智能大会」将在上海中庚聚龙酒店拉开序幕。本届大会由苏州市金融科技协会指导&#xff0c;企智未来科技&#xff08;RPA中国、AIGC开放社区、LowCode低码时代&#xff09;主办。大会旨在聚合每一位产业成员的力量&#xff0c;深入探索R…

开源导出html表格项目-easyHtml

开源导出html表格项目-easyHtml 背景介绍 背景 项目的由来&#xff0c;在面试的过程中&#xff0c;发现这个需求&#xff08;导出html表格&#xff09;比较常见&#xff0c;同时也引起我的兴趣&#xff0c;所以就有了开源项目easyHtml第一个版本 介绍 功能 支持自定义表格标…

【JavaScript 漫游】【035】同源限制

文章简介 本篇文章为【JavaScript 漫游】专栏的第 035 篇文章&#xff0c;记录了浏览器模型同源限制相关的知识点。 概述 浏览器安全的基石是“同源政策”&#xff08;same-origin policy&#xff09;。1995 年&#xff0c;该政策由 Netscape 公司引入浏览器。目前&#xff…

云服务器与传统服务器价格对比

在信息化时代&#xff0c;服务器作为企业数据存储和计算的核心设备&#xff0c;扮演着举足轻重的角色。传统的物理服务器与近年来兴起的云服务器在功能、性能、安全性等方面各有千秋&#xff0c;而价格则是企业在选择时不得不考虑的重要因素。本文将简要科普云服务器与传统服务…

[答疑]AI能做“需求分析”吗+警惕造词圈子割韭菜

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 第五元素 2024-3-10 21:02 潘老师&#xff0c;AI热度不减&#xff0c;现在sora出来更是火爆。有些在github上有几万star的程序员&#xff0c;宣称能用AI做“需求分析”&#xff0c;好…

TCP/IP协议栈

TCP/IP协议栈&#xff08;Transmission Control Protocol/Internet Protocol Suite&#xff09;是互联网上进行数据通信的一系列网络协议的集合&#xff0c;它是现代计算机网络通信的基础架构。 它由多个不同的协议层构成&#xff0c;每层负责不同层面的数据处理和传输工作&…

京津冀协同发展:北京·光子1号金融算力中心——智能科技新高地

京津冀协同发展是党中央在新的历史条件下提出的一项重大国家战略&#xff0c;对于全面推进“五位一体”总体布局&#xff0c;以中国式现代化全面推进强国建设、民族复兴伟业&#xff0c;具有重大现实意义和深远历史意义。随着京津冀协同发展战略的深入推进&#xff0c;区域一体…

模板模式-C#实现

在模板模式&#xff08;Template Pattern&#xff09;中&#xff0c;一个抽象类公开定义了执行它的方法的方式/模板。 意图&#xff1a;定义一个操作中的算法的骨架&#xff0c;而将一些步骤延迟到子类中。 主要解决&#xff1a;一些方法通用&#xff0c;却在每一个子类都重新…

javaEE13(网站第8章两个课后题)

1、对“jspservletjavabean实现分页查询”功能做如下补充&#xff1a; &#xff08;1&#xff09;记录批量删除&#xff1a;每个记录前添加复选框&#xff0c;点击批量删除&#xff0c;删除选中记录。 增加跳转到任意页功能。用户可改变每页记录条数。 页面&am…

[vscode]使用cmake时将命令行参数传递给调试目标

一、简介 本文介绍了在vscode中使用cmake工具时&#xff0c;如何传递参数给编译目标的方法。 前提&#xff1a;使用vscodecmake编译C/C程序。 二、方法 在.vscode/目录下新建settings.json文件&#xff0c;并将待传底的参数写在 cmake.debugConfig里。 下面介绍了一个示例&a…

selenium元素定位问题

一、按钮点击 具体网页信息如下&#xff1a; 定位的时候driver.find_element(By.CLASS_NAME, 方法搞不定。 定位方法&#xff1a; 方法一&#xff1a;通过文本定位 driver.find_element(By.XPATH, "//*[text()高分一号]").click() time.sleep(3) 如果是部分文字…

抗生素净化提纯大孔吸附树脂

一、介绍 ADS-800级吸附树脂 ADS-800是一款功能强大的&#xff0c;大孔&#xff0c;湿润的球形交联聚合物吸附型树脂。 ADS-800 具有优良的物理特性&#xff0c;化学和热稳定性。它的特定的多孔性和其表面积使的本产品适合于分离技术的应用。 ADS-800 是为了流程工业中的专业…

2024第八届通信与未来互联网国际会议(ICCFI 2024)即将召开!

2024年第8届通信与未来互联网国际会议&#xff08;ICCFI 2024&#xff09; 日本鹿儿岛 | 2024年7月19-21日 ICCFI 2024 | Communications and Future Internet | Kagoshima-shi, Japanhttps://www.iccfi.org/ 主办单位&#xff1a; ◆ 出版 ▪ 会议论文集 投稿论文将经过严…

honle电源维修UV电源控制器维修EVG EPS60

好乐UV电源控制器维修&#xff1b;honle控制器维修&#xff1b;UV电源维修MUC-Steuermodul 2 LΛmpen D-82166 主要维修型号&#xff1a; EVG EPS 60/120、EVG EPS 100、EVG EPS200、EVG EPS 220、EVG EPS 340、EVG EPS40C-HMI、EVG EPS60 HONLE好乐uv电源维修故障包括&#…

DARTS: DIFFERENTIABLE ARCHITECTURE SEARCH

DARTS&#xff1a;可微架构搜索 论文链接&#xff1a;https://arxiv.org/abs/1806.09055 项目链接&#xff1a;https://github.com/quark0/darts ABSTRACT 本文通过以可微分的方式表述任务&#xff0c;解决了架构搜索的可扩展性挑战。与在离散和不可微搜索空间上应用进化或强…