Socket 和 WebSocket 的应用

    Socket(套接字)是计算机网络中的一个抽象层,它允许应用程序通过网络进行通信。套接字用于跨网络的不同主机上的应用程序之间的数据交换。在互联网中,套接字通常基于 TCP(传输控制协议)或 UDP(用户数据报协议)来实现数据的可靠传输或快速传输。应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。它是一组用于网络通信的API,包括了一系列的函数和数据结构,它提供了一种标准的网络编程接口,使得应用程序可以在网络中进行数据传输。Socket本身并不是一个具体的实现,而是一个抽象的概念。不同的操作系统和编程语言可以通过不同的方式来实现Socket API。


    通信协议可分为TCP、UDP。 TCP(Transmission Control Protocol传输控制协议)是一种面向连接的,可靠的,基于字节流的传输通信协议。UDP(User Data Protocol,用户数据报协议)是无连接的,即发送数据之前不需要建立连接,类似于发短信,我只管发,能不能接收到跟我关系不大。


    Socket 基于UDP实现客户端与服务端通信


    UDP 服务端 :



在这里插入图片描述



import socketserver = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
server.bind(('127.0.0.1',8888))
print('UDP服务端已经启动了')while True:data,client = server.recvfrom(1024)print('接收到客户端发来的消息:', data.decode(('utf-8')))server.sendto('我是服务端'.encode('utf-8'),client)


    UDP客户端 :



在这里插入图片描述



import socketclient = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
client.sendto('我是客户端'.encode('utf-8'),('127.0.0.1',8888))
data,server = client.recvfrom(1024)
print(data.decode('utf-8'))
client.close()


    启动通信后,服务端和客户端各自收到信息



在这里插入图片描述



在这里插入图片描述



    Socket 基于TCP实现客户端与服务端通信


    TCP 服务端 :



![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/8db77a519ad74f7b9d7bc5ab75fd0512.png)

import socketserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("127.0.0.1", 8888))
server.listen(5)
print("服务端已经启动,等待客户端连接======》")
client, address = server.accept()
print("已经建立连接")while True:recv = client.recv(1024)msg = recv.decode("utf-8")if msg == "close":print("服务端关闭=======》")server.close()breakprint("客户端发送的内容:", msg)print("请输入回复内容:")client.send(input().encode("utf-8"))


    TCP 客户端 :



在这里插入图片描述



import socketclient = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(("127.0.0.1", 8888))while True:print("请输入内容:")send_data = input()client.send(send_data.encode("utf-8"))if send_data == "close":client.close()print("关闭连接")breakdata = client.recv(1024).decode("utf-8")print("接收到服务端响应:", data)


    启动通信后,服务端和客户端各自收到信息



在这里插入图片描述




在这里插入图片描述



    Socket 发送数据请求,对API 返回服务器响应数据校检



在这里插入图片描述



在这里插入图片描述



在这里插入图片描述



    服务器返回响应的结果和网页响应的结果一样,但通过 Socket 发送请求数据,在 Python 3.7 开始被淘汰,这方法不太稳定。还是建议用 requests module 实现 API 测试。



在这里插入图片描述



import socket
import sslsocket = ssl.wrap_socket(socket.socket())
socket.connect(('cache.video.iqiyi.com',443))
socket.send(b'GET /dash?tvid=4597713829135000&bid=600&vid=&src=01010031010000000000&vt=0&rs=1&uid=&ori=pcw&ps=0&k_uid=f1537f4b540b36ae037319d96057892e&pt=0&d=0&s=&lid=0&cf=0&ct=0&authKey=b29751afde35506a135a284bb3948662&k_tag=1&dfp=a156c252dc52ca492495717f29b16891db84c5deb50ec59a40abd7c7e43ab41d2b&locale=zh_cn&pck=&up=&sr=1&apdl=1&qd_v=a1&tm=1730953737580&ppt=0&k_ft1=704237197590532&k_ft4=1161221785001988&k_ft5=137573171201&k_ft7=4&fr_1020=120_120_120_120_120_120&fr_800=120_120_120_120_120_120&fr_600=120_120_120_120_120_120&fr_500=120_120_120_120_120_120&fr_300=120_120_120_120_120_120&bop=%7B%22version%22%3A%2210.0%22%2C%22dfp%22%3A%22a156c252dc52ca492495717f29b16891db84c5deb50ec59a40abd7c7e43ab41d2b%22%2C%22b_ft1%22%3A24%7D&ut=0&vf=cce71ada467c905cd37b0f9b20a5bccd\r\nHTTP/1.1\r\nAccept: application/json, text/javascript\r\nAccept-Encoding: gzip, deflate, br\r\nAccept-Language: zh-CN,zh;q=0.9\r\nConnection: keep-alive\r\nCookie: PD005=rtlyy1rxbollcqa6ts2x30n50emiwnom; QC005=f1537f4b540b36ae037319d96057892e; T00404=ef9fe59fc32ae4ea19888e7de5001342; QC234=c33ce7207a12eb1d51b4909f7fe5da68; QC006=a8e0e4ab15b3349a39989270647b135c; QP0030=1; QC235=3a17828e79024c448c1f320cabc11e3f; QP0037=0; QP0035=4; QP0034=%7B%22v%22%3A17%2C%22dp%22%3A1%2C%22dm%22%3A%7B%22wv%22%3A1%7D%2C%22m%22%3A%7B%22wm-vp9%22%3A1%2C%22wm-av1%22%3A1%7D%2C%22hvc%22%3Afalse%7D; QC173=0; QC191=; QC008=1729398080.1729398080.1730951272.2; nu=0; TQC030=1; QC010=190827388; curDeviceState=width%3D304%3BconduitId%3D%3Bscale%3D100%3Bbrightness%3Ddark%3BisLowPerformPC%3D0%3Bos%3Dbrowser%3Bosv%3D10.0.19044; QC007=DIRECT; QP0027=4; QP0036=2024117%7C16.414; QP007=116340; __dfp=a156c252dc52ca492495717f29b16891db84c5deb50ec59a40abd7c7e43ab41d2b@1732208864278@1730912865278; IMS=IggQABj_x7O5BiomCiAyM2YyODcxMTVmYzA0ZmI2YWIxMjMyMmM2NGY0NDNjYhAAIgByJAogMjNmMjg3MTE1ZmMwNGZiNmFiMTIzMjJjNjRmNDQzY2IQAIIBBCICEBWKASQKIgogMjNmMjg3MTE1ZmMwNGZiNmFiMTIzMjJjNjRmNDQzY2I\r\nHost: cache.video.iqiyi.com\r\nOrigin: https://www.iqiyi.com\r\nReferer: https://www.iqiyi.com/\r\nSec-Fetch-Dest: empty\r\nSec-Fetch-Mode: cors\r\nSec-Fetch-Site: same-site\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36\r\nsec-ch-ua: "Not_A Brand";v="99", "Google Chrome";v="109", "Chromium";v="109"\r\nsec-ch-ua-mobile: ?0\r\nsec-ch-ua-platform: "Windows"')buffer_lst = []while True:data = socket.recv(1024)if data:buffer_lst.append(data)else:breakdata = b''.join(buffer_lst)
socket.close()
print(data.decode('utf-8'))


    WebSocket 是一种网络通信协议,它实现了客户端与服务器之间的全双工通信,是 HTML5 一种新的协议。与传统的 HTTP 协议不同,WebSocket 允许服务器主动向客户端发送消息,这对于实时应用(如在线聊天、游戏等)来说非常重要。


WebSocket 的工作原理(连接过程 ---- 握手过程) 如下:

  1. 浏览器、服务器建立TCP连接,三次握手。这是通信的基础,传输控制层,若 失败后续都不执行。

  2. TCP连接成功后,浏览器通过HTTP协议向服务器传送WebSocket支持的版本号等信息。(开始前的HTTP握手)

  3. 服务器收到客户端的握手请求后,同样采用HTTP协议回馈数据。

  4. 当收到了连接成功的消息后,通过TCP通道进行传输通信。

WebSocket 相比 HTTP 协议有以下优点:

  1. 实时性:服务器可以主动向客户端发送消息,实现实时通信。

  2. 双向通信:客户端和服务器之间可以同时发送和接收数据。

  3. 性能:WebSocket 连接建立后,数据传输效率更高,减少了 HTTP 请求的次数。

  4. 兼容性:WebSocket 协议在大多数浏览器中得到了支持,无需额外插件。

    实现 WebSocket 通信通常需要使用 JavaScript 和后端语言(例如 Node.js、Python、Java 等)。一个简单的 WebSocket 实现示例:


    客户端 - JavaScript



const socket = new WebSocket('ws://localhost:8888');
socket.onopen = function(event) {console.log('连接成功');
};socket.onmessage = function(event) {console.log('收到消息:', event.data);
};socket.onclose = function(event) {console.log('连接关闭');
};socket.onerror = function(error) {console.log('连接出错:', error);
};function sendMessage(msg) {socket.send(msg);
}


    服务器端 - Node.js



const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });wss.on('connection', function(socket) {console.log('新连接');socket.on('message', function(msg) {console.log('收到消息:', msg);});function sendMessageToClient(msg) {socket.send(msg);}setInterval(() => {sendMessageToClient('服务器消息');}, 1000);
});


    再写一个简单的在线聊天示例 :


    客户端 - JavaScript



const socket = new WebSocket('ws://localhost:8888');socket.onopen = function(event) {console.log('连接成功');
};socket.onmessage = function(event) {const msg = document.createElement('div');msg.textContent = '服务器:' + event.data;document.body.appendChild(msg);
};socket.onclose = function(event) {console.log('连接关闭');
};socket.onerror = function(error) {console.log('连接出错:', error);
};function sendMessage(msg) {socket.send(msg);
}
const input = document.createElement('input');
input.type = 'text';
input.placeholder = '输入消息';
input.addEventListener('input', function(event) {sendMessage(event.target.value);
});
document.body.appendChild(input);

    服务器端 - Node.js


const WebSocket = require('ws');const wss = new WebSocket.Server({ port: 8888});
wss.on('connection', function(socket) {console.log('新连接');socket.on('message', function(msg) {console.log('收到消息:', msg);wss.clients.forEach(function each(client) {if (client !== socket && client.readyState === WebSocket.OPEN) {client.send(msg);}});});function sendMessageToClient(msg) {socket.send(msg);}setInterval(() => {sendMessageToClient('服务器消息');}, 1000);
});

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

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

相关文章

Materials Studio 2023安装教程(仅作分享参考)

目录 一、软件下载 二、软件介绍 2.1 软件特点 2.2 功能模块 2.3 应用领域 三、安装步骤 一、软件下载 软件名称:Materials Studio 2023 软件语言:英文 软件大小:2.03G 系统要求:Windows10或更高, 64位操作系…

Spark SQL大数据分析快速上手-DataFrame应用体验

【图书介绍】《Spark SQL大数据分析快速上手》-CSDN博客 《Spark SQL大数据分析快速上手》【摘要 书评 试读】- 京东图书 大数据与数据分析_夏天又到了的博客-CSDN博客 本节主要介绍如何使用DataFrame进行编程。 4.1.1 SparkSession 在旧版本中,Spark SQL提供…

SSM中maven

一:maven的分模块开发 maven分模块就是在多人操作一个项目时将maven模块导入依赖,注意仓库里面没有资源坐标,需要使用install操作下载。 二:maven的依赖管理 pom文件中直接写的依赖叫做直接依赖,直接依赖中用到的依…

25中海油笔试测评春招秋招校招暑期实习社招笔试入职测评行测题型微测网题型分享

中海油笔试一般采用线上机考的形式。考试时间为 120 分钟,满分 100 分。笔试内容主要包括思想素质测评和通用能力测评两个科目。以下是具体介绍: 1. 思想素质测评: ✅价值观:考察考生对工作、职业、企业等方面的价值观念和态度&…

【笔记】变压器-热损耗-频响曲线推导 - 04 额定功率处损耗特性

0.最大的问题 - 散热 对变压器这类功率器件,最大的问题是散热的效率。因为传统的电路基板热导率并不高,几乎和良性导热材料有近乎两个数量级的导热差异,所以,会采用特殊的导热技术,把热量尽可能快地传导到散热片。 传…

定高虚拟列表:让大数据渲染变得轻松

定高虚拟列表 基本认识 在数据如潮水般涌来的今天,如何高效地展示和管理这些数据成为了开发者们面临的一大挑战,传统的列表渲染方式在处理大量数据时,往往会导致页面卡顿、滚动不流畅等问题,严重影响用户体验(在页面…

我的博客网站为什么又回归Blazor了

引言 在博客网站的开发征程中,站长可谓是一路披荆斩棘。从最初的构思到实践,先后涉足了多种开发技术,包括 MVC、Razor Pages、Vue、Go、Blazor 等。在这漫长的过程中,网站版本更迭近 10 次,每一个版本都凝聚着站长的心…

Uniapp安装Pinia并持久化(Vue3)

安装pinia 在uni-app的Vue3版本中,Pinia已被内置,无需额外安装即可直接使用(Vue2版本则内置了Vuex)。 HBuilder X项目:直接使用,无需安装。CLI项目:需手动安装,执行yarn add pinia…

<网络> 协议

目录 文章目录 一、认识协议 1. 协议概念 2. 结构化数据传输 3. 序列化和反序列化 二、网络计算器 1. 封装socket类 2. 协议定制 request类的序列化和反序列化 response类的序列化和反序列化 报头的添加与去除 Json序列化工具 Jsoncpp 的主要特点: Jsoncpp 的使用方法: 3. Ser…

群控系统服务端开发模式-应用开发-文件上传功能开发

一、文件上传路由 在根目录下route文件夹中app.php文件中,添加文件上传功能路由,代码如下: Route::post(upload/file,common.Upload/file);// 上传文件接口 二、功能代码开发 在根目录下app文件夹下common文件夹中创建上传控制器并命名为Up…

pycharm小游戏贪吃蛇及pygame模块学习()

由于代码量大,会逐渐发布 一.pycharm学习 在PyCharm中使用Pygame插入音乐和图片时,有以下这些注意事项: 插入音乐: - 文件格式支持:Pygame常用的音乐格式如MP3、OGG等,但MP3可能需额外安装库&#xf…

检索增强和知识冲突学习笔记

检索增强生成任务(Retrieval-Augmented Generation, RAG)是一种自然语言处理技术,它结合了信息检索和生成模型,用于生成高质量的文本输出。具体来说,RAG 模型在生成文本时,会先通过检索模块从外部知识库或文…

从0开始深度学习(25)——多输入多输出通道

之前我们都只研究了一个通道的情况(二值图、灰度图),但实际情况中很多是彩色图像,即有标准的RGB三通道图片,本节将更深入地研究具有多输入和多输出通道的卷积核。 1 多输入通道 当输入包含多个通道时,需要…

网管平台(进阶篇):如何正确的管理网络设备?

网络设备作为构建计算机网络的重要基石,扮演着数据传输、连接和管理的关键角色。从交换机、路由器到防火墙、网关,各类网络设备共同协作,形成了高效、稳定的网络系统。本文将详细介绍网络设备的种类,并探讨如何正确管理这些设备&a…

论文 | Teaching Algorithmic Reasoning via In-context Learning

这篇论文《通过上下文学习教授算法推理》探讨了如何通过上下文学习(In-context Learning, ICL)有效训练大型语言模型(LLMs)以进行算法推理。以下是从多个角度对这项工作的详细解读: 1. 问题陈述与研究动机 算法推理的…

RK3568平台(基础篇)性能分析工具

一.Linux 性能优化工具简介 Linux 系统性能指标无非就是这几个方面,CPU、内存、磁盘 I/O、文件系统、网络等相关指标。不同的性能指标都有对应的具体命令工具进行查看与监控,接下来我们将介绍一些常见的 Linux 系统性能指标及其对应的命令工具(通过命令工具找出 Linux 系统性…

2024阿里云CTF Web writeup

《Java代码审计》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484219&idx1&sn73564e316a4c9794019f15dd6b3ba9f6&chksmc0e47a67f793f371e9f6a4fbc06e7929cb1480b7320fae34c32563307df3a28aca49d1a4addd&scene21#wechat_redirect 前言 又是周末…

Bartender 5 for Mac 菜单栏管理软件 安装教程【保姆级教程,操作简单小白轻松上手使用】

Mac分享吧 文章目录 Bartender 5 for Mac 菜单栏管理软件 安装完成,软件打开效果一、Bartender 5 菜单栏管理软件 Mac电脑版——v5.2.3⚠️注意事项:1️⃣:下载软件2️⃣:安装软件3️⃣:打开软件,根据自己…

职场逆袭!学会管理上司,你也能成为职场赢家

书友们,不要错过了!我挖到了一本真正让我彻夜难眠的小说,情节跌宕起伏,角色鲜活得就像从书里跳出来陪你聊天。每一页都是新的惊喜,绝对让你欲罢不能。要是你也在寻找那种让人上瘾的阅读体验,这本书就是你的…

Actor-Critic方法【A2C,A3C,Policy Gradient】

强化学习笔记系列目录 第一章 强化学习基本概念 第二章 贝尔曼方程 第三章 贝尔曼最优方程 第四章 值迭代和策略迭代 第五章 强化学习实例分析:GridWorld 第六章 蒙特卡洛方法 第七章 Robbins-Monro算法 第八章 多臂老虎机 第九章 强化学习实例分析:CartPole 第十章 时序差分法…