Socket 和 WebSocket 的应用

news2024/11/28 6:18:44

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


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


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


    UDP 服务端 :



在这里插入图片描述



import socket

server = 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 socket

client = 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 socket

server = 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()
    break
  print("客户端发送的内容:", msg)
  print("请输入回复内容:")
  client.send(input().encode("utf-8"))


    TCP 客户端 :



在这里插入图片描述



import socket

client = 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("关闭连接")
    break
  data = client.recv(1024).decode("utf-8")
  print("接收到服务端响应:", data)


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



在这里插入图片描述




在这里插入图片描述



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



在这里插入图片描述



在这里插入图片描述



在这里插入图片描述



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



在这里插入图片描述



import socket
import ssl

socket = 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:
     break

data = 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.coloradmin.cn/o/2235502.html

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

相关文章

mac 本地docker-mysql主从复制部署

mac 本地docker-mysql主从复制部署,服务器同理 1.本地docker启动两个mysql服务.端口号不一样 没有选择挂载到宿主机.只做测试用. 只是端口号不一样容器删掉.就没有数据了. 生产测试,需要挂在 master docker run -d --name mysql-slave -p 3308:3306 \ -e MYSQL_ROOT_PASSWORD…

HTML学习笔记十三

系列笔记目录 第一章 HTML的概述 第二章 URL简介 第三章 网页元素的属性 第四章 html字符编码 第五章 网页的语义结构 第六章 文本标签 第七章 列表标签 第八章 图像标签 第九章 链接标签 第十章 多媒体标签 第十一章 iframe 第十二章 表格标签 第十三章 表单标签 表单标签 系列…

在鱼皮的模拟面试里面学习有感

文章目录 1.上半场1.1.引言1.2.鱼皮的建议 2.下半场2.1中间问题 3.我的总结3.1我的体会3.2我的计划 1.上半场 今天的直播,第一次全程的跟下来:也算是放松一下~~ 1.1.引言 上半场是后来总结的,听的时候没有随手记录: 1&#xf…

思源笔记轻松连接本地Ollama大语言模型,开启AI写作新体验!

文章目录 前言1. 下载运行Ollama框架2. Ollama下载大语言模型3. 思源笔记设置连接Ollama4. 测试笔记智能辅助写作5. 安装Cpolar工具6. 配置Ollama公网地址7. 笔记设置远程连接Ollama8. 固定Ollama公网地址 前言 今天我们要聊聊如何通过cpolar内网穿透技术,把国产笔…

前端学习Day12 CSS盒子的定位(相对定位篇“附练习”)

一、相对定位 使用相对定位的盒子会相对于自身原本的位置,通过偏移指定的距离,到达新的位置。盒子的本体仍处于文档流中。使用相对定位,除了要将 position 属性值设置为 relative 外,还需要指定一定的偏移量。其中,水…

AJ-Report:一款开源且非常强大的数据可视化大屏和报表工具

嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和工作学习方法 AJ-Report是一个基于Java的开源报表工具,它集成了ECharts、Ant Design Vue等前端技术,致力于为企业提供一站式的数据可视化解决方案…

【深度学习】InstantIR:图片高清化修复

InstantIR——借助即时生成参考的盲图像修复新方法 作者:Jen-Yuan Huang 等 近年来,随着深度学习和计算机视觉技术的飞速发展,图像修复技术取得了令人瞩目的进步。然而,对于未知或复杂退化的图像进行修复,仍然是一个充满挑战的任务。针对这一难题,研究者们提出了 Insta…

MySQL utf8mb3 和 utf8mb4引发的问题

问题描述 Cause: java.sql.SQLException: Incorrect string value: \xF4\x8F\xBB\xBF-b... for column sddd_aaa_ark at row 1 sddd_aaa_ark 存储中文字符时,出现上述问题 原因分析 sddd_aaa_ark在数据库中结构是 utf8字符的最大字节数是3 byte,但是某些…

日语学习的难易程度

日语学习的难易程度是一个相对主观的问题,它受到多种因素的影响,包括个人的语言学习能力、学习方法、学习时间、学习资源的可获得性以及个人对日语文化的兴趣和投入程度等。以下是对日语学习难易程度的一些分析: 优点与易学之处 文字系统&am…

Win10 连接到 Ubuntu 黑屏无法连接 使用Rustdesk显示 No Displays 没有显示器

Win10 连接到 Ubuntu 黑屏无法连接 使用Rustdesk显示 No Displays 没有显示器 解决办法安装虚拟显示器 安装xorg虚拟显示器 $ sudo apt install xserver-xorg-video-dummy # 提示错误依赖使用下面这个试试 $ sudo apt-get install xserver-xorg-video-dummy --fix-missing配…

Ubuntu安装Python并配置pip阿里镜像教程 - 幽络源

背景 因为要部署yolov8项目到ubuntu系统,但是yolov8要求python版本必须大于3.10,因此ubuntu20.04自带的python3.8不可用,需自行安装python,本教程使用python源码编译式安装python3.12.3,原因是apt下载python无法指定目…

uniapp组件实现省市区三级联动选择

1.导入插件 先将uni-data-picker组件导入我们的HBuilder项目中&#xff0c;在DCloud插件市场搜索uni-data-picker 点击下载插件并导入到我们的项目中 2.组件调用 curLocation &#xff1a;获取到的当前位置&#xff08;省市区&#xff09; <uni-data-picker v-slot:defa…

力扣:94--中序遍历二叉树

树 – 二叉树 完全二叉树&#xff1a; 完全二叉树可以用数组完美匹配位置&#xff08;先序存储&#xff1a;根左右&#xff09;&#xff0c; 推论一 &#xff1a; 位置为k的节点&#xff0c;左孩子&#xff1a;2*k 1 &#xff0c;右孩子 &#xff1a; 2 * &#xff08;k 1&…

「C/C++」C/C++STL篇 之 数组赋值给std::vector多种方法

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

关于 Qt+Osg中使用背景图HUD受到后绘制几何图形顶点颜色影响 的解决方法

若该文为原创文章&#xff0c;转载请注明出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/143607816 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、Op…

使用python向钉钉群聊发送消息

使用python向钉钉群聊发送消息 一、在钉钉群中新建机器人二、使用代码发送消息 一、在钉钉群中新建机器人 在群设置中添加机器人 选择自定义 勾选对应的安全设置 完成后会展示webhook&#xff0c;将地址复制出来&#xff0c;并记录&#xff0c;后面会用到 二、使用代码发送消…

第100+31步 ChatGPT学习:概率校准 Quantile Calibration

基于Python 3.9版本演示 一、写在前面 最近看了一篇在Lancet子刊《eClinicalMedicine》上发表的机器学习分类的文章&#xff1a;《Development of a novel dementia risk prediction model in the general population: A large, longitudinal, population-based machine-learn…

这款神器,运维绝杀 !!!

项目简介 CrowdSec 是一款开源的、基于社区协作的网络安全防护工具&#xff0c;它通过分析和共享IP信誉数据来对抗恶意行为。该软件不仅支持IPv6&#xff0c;而且相较于传统的Python实现&#xff0c;其采用Go语言编写&#xff0c;运行速度提升了60倍。CrowdSec 利用Grok模式解析…

Unreal5从入门到精通之如何在指定的显示器上运行UE程序

前言 我们有一个设备,是一个带双显示器的机柜,主显示器是一个小竖屏,可以触屏操作,大显示器是一个普通的横屏显示器。我们用这个机柜的原因就是可以摆脱鼠标和键盘,直接使用触屏操作,又可以在大屏观看,非常适合用于教学。 然后我们为这款机柜做了很多个VR项目,包括Uni…

R7:糖尿病预测模型优化探索

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、实验目的&#xff1a; 探索本案例是否还有进一步优化的空间 二、实验环境&#xff1a; 语言环境&#xff1a;python 3.8编译器&#xff1a;Jupyter notebo…