day35
今日内容概要
-
Socket抽象层(socket编程)
-
基于TCP协议的借助socket可以编程客户端和服务端的程序
-
链接循环
-
通信循环
-
-
基于UDP协议的套接字(socket)编程
-
粘包现象
-
如何解决粘包现象(重要的是解决的思路)
-
struct模块的使用(打包、解包)
今日内容详细
Socket抽象层(socke编程)
我们知道两个进程如果需要进行通讯最基本的一个前提是能够唯一标示一个进程,在本地进程通讯中我们可以使用PID来唯一标示一个进程,但PID只在本地唯一,网络中的两个进程PID冲突几率很大,这时候我们需要另辟蹊径,我们知道IP层的IP地址可以唯一标示主机,而TCP层协议和端口号可以唯一标示主机的一个进程,这样我们可以利用IP地址+协议+端口号可以唯一标示主机的一个进程。
能够唯一标示网络中的进程后,它们就可以利用Socket进行通信了,什么是Socket呢?我们经常把Socket翻译为套接字,Socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信

Socket起源于UNIX,在Unix一切皆文件哲学下的思想下,Socket是一种“打——读/写——关闭”魔模式的实现,在服务器和客户端各自维护一个“文件”,在建立链接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。
基于文件类型的套接字家族:
# 套接字家族的名字:AF_UNIX
基于网络类型的套接字家族
# 套接字家族的名字:AF_INET
基于TCP协议的套接字(socket)编程
客户端和服务端应该是谁先发送消息:
客户端先发送消息,需要服务端先运行起来
“服务端代码”
import socket
from socket import AF_INET
# socket.socket() # AF_INET, type=SOCK_STREAM: 基于TCP协议的
server=socket.socket(family=AF_INET, type=socket.SOCK_STREAM) # AF_INET, type=SOCK_DGRAM: 基于UDP协议的# 绑定IP地址和port
server.bind(('127.0.0.1', 8000))# 服务端做监听,也称为是半链接池(服务端能够同时等待客户端的数量)
server.listen(3)
print(123)
# 该接收客户端发来的消息
sock, addr = server.accept() # """我们知道代码运行到这里,就会卡主,等待客户端开发链接和发送消息"""
"""sock:当前链接的客户端的链接, addr:就是客户端的地址:ip,port"""
print(234)
# 想拿到客户端实际发过来的数据
data=sock.recv(1024) # 接收的数据类型是bytes类型,二进制的 1024 代表接收的最多的字节数
print("接收客户端的数据:",data)
# 要给客户端返回一个数据
sock.send(data.upper()) # 发送的数据是字节类型的# 关闭链接
sock.close()server.close()
“客户端代码”
import socket
from socket import AF_INET
client=socket.socket(family=AF_INET, type=socket.SOCK_STREAM)
# socket.socket()client.connect(('127.0.0.1', 8000))# 开始给服务端发送消息
client.send('hello'.encode('utf-8'))# 接收服务端发来的消息
data=client.recv(1024)
print("服务端发来的消息:", data)
client.close()
加上通信和通信循环
import socket
from socket import AF_INET
# socket.socket() # AF_INET, type=SOCK_STREAM: 基于TCP协议的
server=socket.socket(family=AF_INET, type=socket.SOCK_STREAM) # AF_INET, type=SOCK_DGRAM: 基于UDP协议的# 绑定IP地址和port
server.bind(('127.0.0.1', 8000))# 服务端做监听,也称为是半链接池(服务端能够同时等待客户端的数量)
server.listen(3)while True:# 该接收客户端发来的消息sock, addr = server.accept() # """我们知道代码运行到这里,就会卡主,等待客户端开发链接和发送消息""""""sock:当前链接的客户端的链接, addr:就是客户端的地址:ip,port"""while True:# 想拿到客户端实际发过来的数据try:"""客户端发送过来的数据是个空,或者"""data=sock.recv(1024) # 接收的数据类型是bytes类型,二进制的 1024 代表接收的最多的字节数print("接收客户端的数据:",data)# 要给客户端返回一个数据sock.send(data.upper()) # 发送的数据是字节类型的except Exception as e:print(e)break# 关闭链接sock.close()server.close()###########################客户端####################################
import socket
from socket import AF_INET
client=socket.socket(family=AF_INET, type=socket.SOCK_STREAM)
# socket.socket()client.connect(('127.0.0.1', 8000))while True:send_data = input('请输入你要发送给服务端的数据:')# 开始给服务端发送消息client.send(send_data.encode('utf-8'))# 接收服务端发来的消息data=client.recv(1024)print("服务端发来的消息:", data)
client.close()
基于UDP协议的套接字编程
“客户端”
import socketclient = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 数据报协议-》UDPwhile True:msg = input('>>: ').strip() # msg=''client.sendto(msg.encode('utf-8'), ('127.0.0.1', 8080))data, server_addr = client.recvfrom(1024)print(data)client.close()"""服务端"""
import socketserver = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 数据报协议-》UDP
server.bind(('127.0.0.1', 8080))while True:"""client_addr: 客户端的地址"""data, client_addr = server.recvfrom(1024) # 接收的最大字节数print('===>', data, client_addr)server.sendto(data.upper(), client_addr)server.close()
粘包现象
注意:只有TCP有粘包现象,UDP永远不会粘包
粘包的两种情况
1.发送端需要等缓冲区满才发送出去,造成粘包(发送数据时间间隔很短,数据了很小,会合到一起,产生粘包
服务端
Copy# _*_coding:utf-8_*_
__author__ = 'lqz'
from socket import *
ip_port = ('127.0.0.1', 8080)TCP_socket_server = socket(AF_INET, SOCK_STREAM)
TCP_socket_server.bind(ip_port)
TCP_socket_server.listen(5)conn, addr = TCP_socket_server.accept()data1 = conn.recv(10)
data2 = conn.recv(10)print('----->', data1.decode('utf-8'))
print('----->', data2.decode('utf-8'))conn.close()
客户端
Copy# _*_coding:utf-8_*_
__author__ = 'lqz'
import socket
BUFSIZE = 1024
ip_port = ('127.0.0.1', 8080)s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
res = s.connect_ex(ip_port)s.send('hello'.encode('utf-8'))
s.send('feng'.encode('utf-8'))
2.接收方不及时接收缓冲区的包,造成多个包接收(客户端发送了一段数据,服务端只收了一小部分,服务端下次再收的时候还是从缓冲区拿上次遗留的数据,产生粘包)
服务端
Copy# _*_coding:utf-8_*_
__author__ = 'lqz'
from socket import *
ip_port = ('127.0.0.1', 8080)TCP_socket_server = socket(AF_INET, SOCK_STREAM)
TCP_socket_server.bind(ip_port)
TCP_socket_server.listen(5)conn, addr = TCP_socket_server.accept()data1 = conn.recv(2) # 一次没有收完整
data2 = conn.recv(10) # 下次收的时候,会先取旧的数据,然后取新的print('----->', data1.decode('utf-8'))
print('----->', data2.decode('utf-8'))conn.close()
客户端
Copy# _*_coding:utf-8_*_
__author__ = 'lqz'
import socket
BUFSIZE = 1024
ip_port = ('127.0.0.1', 8080)s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
res = s.connect_ex(ip_port)s.send('hello feng'.encode('utf-8'))
相关文章:
day35
今日内容概要 Socket抽象层(socket编程) 基于TCP协议的借助socket可以编程客户端和服务端的程序 链接循环 通信循环 基于UDP协议的套接字(socket)编程 粘包现象 如何解决粘包现象(重要的是解决的思路) struct模块的使用(打包、解包) 今日内容详细 Socket抽象层&#x…...
js原型链以及实现继承的手段
1.原型链 其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。 简单回顾一下构造函数、原型和实例的关系:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。…...
jdk8u201版本cpu.load过高问题的排查和解决
文章目录 1、背景2、现象3、排查定位4、原因总结5、解决 1、背景 jdk8u45版本存在安全漏洞,性能问题。需要升级到8u201 2、现象 升级到201版本后,出现cpu.load过高 3、排查定位 使用压测工具压测时,cpu.load过高问题必现,确认…...
【计算机网络笔记】数据交换之报文交换和分组交换
系列文章目录报文交换分组交换存储-转发报文交换 vs 分组交换总结 系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 报文交换 报文:源(应用)发送的信息整体。比如一个文件、一…...
【广州华锐互动】利用VR开展细胞基础实验教学有什么好处?
在科技发展的驱动下,虚拟现实(VR)技术已被广泛应用于各个领域,包括教育和医学。尤其是在医学教育中,VR技术已成为一种革新传统教学模式的有效工具。本文将探讨使用VR进行细胞基础实验教学的优势。 首先,VR技…...
基于SSM+Vue的咖啡销售系统
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…...
L2-026 小字辈
本题给定一个庞大家族的家谱,要请你给出最小一辈的名单。 输入格式: 输入在第一行给出家族人口总数 N(不超过 100 000 的正整数) —— 简单起见,我们把家族成员从 1 到 N 编号。随后第二行给出 N 个编号,…...
linux 查看系统版本
命令:lsb_release -a 可能遇到的问题: 问题1: 报错:command not found: lsb_release原因:系统没有安装 lsb_release解决方案:sudo apt-get install lsb-release 问题2: 报错: Tra…...
Python实现PDF转换文件格式
最近工作中经常遇到收到其他人提供的pdf文档,想要编辑修改下或者复制部分内容比较困难,想通过现有的pdf工具软件转换文档格式,基本都要充钱,为了免费实现pdf转换工具,网上查了下相关技术方案,整理了下代码&…...
【Ceph Cluster】完全删除Ceph集群
注意:在执行这些步骤之前,请确保你已经备份了所有重要的数据,并且你明白这些步骤将永久删除 Ceph 集群。 停止 Ceph 服务: systemctl stop ceph.target卸载 Ceph 包:卸载 Ceph 相关的软件包,使用你的 Linux…...
4.Vue-Vue调用第三方接口
题记 用vue调用第三方接口,以下是全部代码和操作流程。 寻找第三方接口网站 推荐:免费API - 提供免费接口调用平台 (aa1.cn) 下面的代码以下图中的接口为例 安装axios模块 在终端输入以下命令: npm install axios 调用第三方接口代码 调…...
大语言模型在推荐系统的实践应用
本文从应用视角出发,尝试把大语言模型中的一些长处放在推荐系统中。 01 背景和问题 传统的推荐模型网络参数效果较小(不包括embedding参数),训练和推理的时间、空间开销较小,也能充分利用用户-物品的协同信号。但是它的缺陷是只能利用数据…...
第三章 交换技术及应用
目录 3.1 port-vlan技术 3.1.1 VLAN概述 3.1.2 VLAN划分方法——Port-VLAN 3.1.3 Port-VLAN工作原理 3.1.3 Port-VLAN配置 3.2 port-vlan仿真演示 3.2.1 实验背景 3.2.2 实验目的 3.2.3 实验设备 3.2.4 实验步骤思维导图 3.3 tag-vlan技术 3.3.1 问题分析 3.3.2 T…...
地震勘探原理部分问题解答
1、二维/三维(陆地/海洋)地震勘探,炮点(激发点)和检波点(接收点)的排布位置如何?画图作答? (1)陆地地震勘探 二维陆地地震野外采集:震…...
两个步骤轻松搞定批量合并视频
你是否曾经有过批量合并视频的需求,但是却苦于不知道如何下手?今天,我将为你介绍一个简单易行的方法,只需两个步骤,让你轻松实现批量合并视频。 第一步:下载并打开固乔智剪软件 首先,你需要下载…...
VR虚拟现实在室内设计仿真教学中的应用演示
1. 虚拟实景漫游:利用VR技术,学生可以通过戴上VR头盔来进入一个虚拟的室内环境中,感受真实的空间氛围。他们可以自由移动和观察,感受室内设计的效果。这样的体验可以增强学生的想象力和空间感知能力,提高他们的设计水平…...
Python操作串口通信
Python操作串口通信 注意Linux下先要修改串口的权限: sudo chmod 777 /dev/ttyUSB0 以下是python代码: # codingutf-8 # 包:pyserial,pymysql # 权限:sudo chmod 777 /dev/ttyUSB0 import serial # import pymysql …...
图详解第四篇:单源最短路径--Dijkstra算法
文章目录 1. 最短路径问题2. 单源最短路径--Dijkstra算法算法思想图解如何存储路径及其权值代码实现调式观察打印最短路径Dijkstra算法的缺陷 3. 源码 1. 最短路径问题 最短路径问题: 从带权有向图(求最短路径通常是有向图)G中的某一顶点出发…...
CRMEB多商户商城系统阿里云集群部署教程
注意: 1.所有服务创建时地域一定要选择一致,这里我用的是杭州K区 2.文件/图片上传一定要用类似oss的云文件服务, 本文不做演示 一、 创建容器镜像服务,容器镜像服务(aliyun.com) ,个人版本就可以 先创建一个命名空间 然后创建一个镜像仓库 查看并记录镜像公网地址…...
Java第三方登录封装工具类
Java中可以使用第三方登录来简化用户登录流程,常见的第三方登录如QQ、微信、微博等。下面是一个Java封装第三方登录的工具类: import java.io.IOException; import java.util.HashMap; import java.util.Map;import org.apache.http.client.ClientProto…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
