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 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);
});

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp发布到微信小程序,提示接口未配置在app.json文件中

使用uniapp打包上传微信小程序发布,在提交审核时提示 “接口未配置在app.json文件中” 如下图所示 解决方法:在manifest.json文件中打开源码视图,添加 requiredPrivateInfos 字段键入所需要的接口(数组)

Golang | Leetcode Golang题解之第557题反转字符串中的单词III

题目&#xff1a; 题解&#xff1a; func reverseWords(s string) string {length : len(s)ret : []byte{}for i : 0; i < length; {start : ifor i < length && s[i] ! {i}for p : start; p < i; p {ret append(ret, s[start i - 1 - p])}for i < le…

[产品管理-58]:安索夫矩阵矩阵帮助创业者确定研发出来的产品在市场中定位策略

目录 一、提出背景 二、核心思想与结构 三、应用背景与领域 四、实践案例 安索夫矩阵&#xff08;Ansoff Matrix&#xff09;&#xff0c;也被称为产品/市场方格或成长矢量矩阵&#xff0c;其应用背景可以从以下几个方面进行详细阐述&#xff1a; 一、提出背景 安索夫矩阵…

使用 Vue 配合豆包MarsCode 实现“小恐龙酷跑“小游戏

作者&#xff1a;BLACK595 “小恐龙酷跑”&#xff0c;它是一款有趣的离线游戏&#xff0c;是Google给Chrome浏览器加的一个有趣的彩蛋。当我们浏览器断网时一只像素小恐龙便会出来提示断网。许多人认为这只是一个可爱的小图标&#xff0c; 但当我们按下空格后&#xff0c;小恐…

运行ts文件出错及解决办法

运行ts文件出错及解决办法 TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension “.ts” 这个错误是因为 ts-node 无法直接处理 TypeScript 文件作为 ES 模块。你可以尝试以下解决方案&#xff1a; 解决方案 1: 使用 --loader ts-node/esm 选项 如果你使用的是 …

Unity中IK动画与布偶死亡动画切换的实现

在Unity游戏开发中&#xff0c;Inverse Kinematics&#xff08;IK&#xff09;是创建逼真角色动画的强大工具。同时&#xff0c;能够在适当的时候切换到布偶物理状态来实现死亡动画等效果&#xff0c;可以极大地增强游戏的视觉体验。本文将详细介绍如何在Unity中利用IK实现常规…

JS爬虫实战之TikTok_Shop验证码

TikTok_Shop验证码逆向 逆向前准备思路1- 确认接口2- 参数确认3- 获取轨迹参数4- 构建请求5- 结果展示 结语 逆向前准备 首先我们得有TK Shop账号&#xff0c;否则是无法抓取到数据的。拥有账号后&#xff0c;我们直接进入登录。 TikTok Shop 登录页面 思路 逆向步骤一般分为…

易泊车牌识别相机:4S 店的智能之选

在当今数字化时代&#xff0c;科技的进步不断为各个行业带来更高效、便捷的解决方案。对于 4S 店来说&#xff0c;易泊车牌识别相机的出现&#xff0c;无疑为其运营管理带来了全新的变革。 一、易泊车牌识别相机的强大功能 易泊车牌识别相机以其卓越的性能和精准的识别能力&…

音频数据的处理

前言 在研究android音频架&#xff0c;音频驱动等的时候&#xff0c;就有涉及到dump音频数据debug&#xff0c;重采样&#xff0c;downmixer&#xff0c;位深转换的处理&#xff0c;那这些的操作原理以及相关算法是如何实现的呢&#xff1f; 带着这个问题&#xff0c;开始探讨…

【前端】手写一个简单的分页器

1. 前言 分页器基本上是任何网站必须要有的一个组件&#xff0c;为什么需要分页器&#xff0c;当后台传入了大量的数据&#xff0c;那么在前端拿到数据&#xff0c;如果直接展示很有可能或造成卡顿&#xff0c;同时消耗过多的内存&#xff0c;给用户带来的浏览效果就不好。所以…

如何在Linux中使用Cron定时执行SQL任务

文章目录 前言一、方案分析二、使用步骤1.准备脚本2.crontab脚本执行 踩坑 前言 演示数据需要每天更新监控数据&#xff0c;不想手动执行&#xff0c;想到以下解决方案 navicat 创建定时任务java服务定时执行linux crontab 定时执行sql脚本 一、方案分析 我选择了第三个方案…

超好用shell脚本NuShell mac安装

利用管道控制任意系统 Nu 可以在 Linux、macOS 和 Windows 上运行。一次学习&#xff0c;处处可用。 一切皆数据 Nu 管道使用结构化数据&#xff0c;你可以用同样的方式安全地选择&#xff0c;过滤和排序。停止解析字符串&#xff0c;开始解决问题。 强大的插件系统 具备强…

过程自动化的新黄金标准:Ethernet-APL

| Ethernet-APL为终客户和设备制造商带来益处 Ethernet-APL&#xff08;Advanced Physical Layer&#xff0c;高级物理层&#xff09;是一种两线制以太网物理层&#xff0c;它使用了由IEEE 802.3cg所定义的10BASE-T1L&#xff0c;并采用了新的工艺制造规定&#xff0c;因此构成…

扫雷游戏代码分享(c基础)

hi , I am 36. 代码来之不易&#x1f44d;&#x1f44d;&#x1f44d; 创建两个.c 一个.h 1&#xff1a;test.c #include"game.h"void game() {//创建数组char mine[ROWS][COLS] { 0 };char show[ROWS][COLS] { 0 };char temp[ROWS][COLS] { 0 };//初始化数…

OceanBase 应用实践:如何处理数据空洞,降低存储空间

问题描述 某保险行业客户的核心系统&#xff0c;从Oracle 迁移到OceanBase之后&#xff0c;发现数据存储空间出现膨胀问题&#xff0c;数据空间 datasize9857715.48M&#xff0c;实际存储占用空间17790702.00M。根据 required_mb - data_mb 值判断&#xff0c;数据空洞较为严重…

算法学习第一弹——C++基础

早上好啊&#xff0c;大佬们。来看看咱们这回学点啥&#xff0c;在前不久刚出完C语言写的PTA中L1的题目&#xff0c;想必大家都不过瘾&#xff0c;感觉那些题都不过如此&#xff0c;所以&#xff0c;为了我们能更好的去处理更难的题目&#xff0c;小白兔决定奋发图强&#xff0…

立体工业相机提升工业自动化中的立体深度感知

深度感知对仓库机器人应用至关重要&#xff0c;尤其是在自主导航、物品拾取与放置、库存管理等方面。 通过将深度感知与各种类型的3D数据&#xff08;如体积数据、点云、纹理等&#xff09;相结合&#xff0c;仓库机器人可以在错综复杂环境中实现自主导航&#xff0c;物品检测…

【测试框架篇】单元测试框架pytest(3):用例执行参数详解

一、前言 上一篇内容介绍了用例编写的规则以及执行用例&#xff0c;执行用例时我们发现有些print输出内容&#xff0c;结果没有给我们展示&#xff0c;这是因为什么原因呢&#xff1f;接下来我们会针对这些问题进行阐述。 二、参数大全 我们可以在cmd中通过输入 pytest -h 或…

web安全测试渗透案例知识点总结(上)——小白入狱

目录 一、Web安全渗透测试概念详解1. Web安全与渗透测试2. Web安全的主要攻击面与漏洞类型3. 渗透测试的基本流程 二、知识点详细总结1. 常见Web漏洞分析2. 渗透测试常用工具及其功能 三、具体案例教程案例1&#xff1a;SQL注入漏洞利用教程案例2&#xff1a;跨站脚本&#xff…

罕见的 iPhone 14 Pro 原型机固态按钮设计曝光

虽然 iPhone 16 已出&#xff0c;但是看看苹果旧的原型机也很有趣&#xff0c;因为它可以展示苹果在开发过程中一些被舍弃的细节。现在&#xff0c;一款罕见的 iPhone 14 Pro 原型机可以看到了传闻中的触觉音量按钮的样子。 2022 年初关于 iPhone 15 Pro 的第一个传闻表明&…