计算机基础知识32

Socket抽象层(socket编程)

# Socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单     的接口供应用层调用已实现进程在网络中通信

socket () 对象

bind () 函数来绑定

listen () 监听,等别人电话

accept()接收,已发送真实数据,真正等待客户端发信息

read()接收,真正拿到客户端信息  recv

write()send过程,发送,回应客户端

read()不会立刻断掉

close()断开

# socket抽象层把复杂的事已做比如(三次握手四次挥手),我们不需要操心,只需简单的      发送和接收

基于TCP协议的套接字(socket)编程

基于文件类型的套接字家族:
    # 套接字家族的名字:AF_UNIX

基于网络类型的套接字家族:
    # 套接字家族的名字:AF_INET

客户端先发送消息,需要服务端先运行起来

"""服务端代码:"""

import socket  # 导入socket模块
from socket import AF_INET
server=socket.socket(family=AF_INET, type=socket.SOCK_STREAM) 
# AF_INET, type=SOCK_DGRAM: 基于UDP协议的
server.bind(('127.0.0.1', 8000))     # 绑定IP地址和port
# 绑定谁,谁就是服务端,可用你的客户端给他的服务端发信息
server.listen(3)  # 服务端做监听,也称为是半链接池(服务端能够同时等待客户端的数量)
sock, addr = server.accept()  # sock:当前链接的客户端的链接, addr:就是客户端的地址:ip,port
data=sock.recv(1024) # 接收的数据类型是bytes类型,二进制的 1024 代表接收的最多的字节数
print("接收客户端的数据:",data)
sock.send(data.upper()) # 发送的数据是字节类型的
sock.close()   # 关闭链接
server.close()

# sock, addr = server.accept() 代码会卡住,等待客户端开发链接和发送信息

"""客户端代码"""

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
server=socket.socket(family=AF_INET, type=socket.SOCK_STREAM) 
server.bind(('127.0.0.1', 8000))     
server.listen(3)
while True:  sock, addr = server.accept()  while True:try:data=sock.recv(1024) print("接收客户端的数据:",data)sock.send(data.upper()) except Exception as e:print(e)     # 答应出错误breaksock.close()   
server.close()
"""客户端"""
import socket
from socket import AF_INET
client=socket.socket(family=AF_INET, type=socket.SOCK_STREAM)
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()

1、在accept()用while True循环,可支持多个客户端的数据(一个服务端)

2、当前:客户端只能说一句话

      在send()用while循环,把发送的信息用input写活,可以多次发送信息了

3、问题:客户端还可以发送信息,但是此时服务端接收一个就已经close

      在第一个close之前再一次循环,accept下

4、客户端发送的数据是空时,一个客户端出现了问题,整个服务器都将会报错

      用异常捕捉,try

基于UDP协议的套接字编程

"""服务端"""

import socket
server = 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()

"""客户端"""

import socket
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 数据报协议-》UDP
while 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 subprocess
res = subprocess.Propen(tasklist,shell=True,stderr=subprocess.PIPE,stdout=subprocess.PIPE)
# shell脚本(linux)
# tasklist命令,其实它是一个shell语言,bash解释器
# 正确stderr=subprocess.PIPE,错误stdout=subprocess.PIPE

# 粘包:管道里的数据没有取完,造成数据的丢失,但是可以多次取

# 在内存一定的情况下解决粘包问题:

        1、知道服务端发过来字节的大小/每次接收的字节大小=总次数

        2、struct模块

import struct
res = struct.pack('i',1024)    # 1024给打包
print(res)   # b'\x00\xo4\xoo... 二进制
print(len(res))    # 4 不管输入多大,固定长度还是4

# 解包

res1 = struct.unpack('i',res)
print(res1[0])   # 1024

过程:1、把服务端发过来字节打包,长度4

           2、客户端  sock.recv(4) 只接4个

           3、unpack('i',res)  解包/大小

           4、得到总次数

TCP的流式协议

sock,addr = sever.accept()
print('jerry',encode('utf-8'))

在短时间内,短时间客户端可发送多个数据,服务端可以一次性接收完

今日思维导图:

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

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

相关文章

canal rocketmq

上篇文章canal 消费进度说到直接使用ClusterCanalConnector并发消费是有问题的,可以先用单点将canal事件发送到mq中,再由mq并发处理,另外mq还可以做到削峰的作用,让canal数据不至于阻塞。 使用队列,可以自己起一个单实…

AI电销机器人好不好用关键是什么?

影响AI电销机器人是否好用的两个因素分别是,识别系统以及线路。 有很多电销企业都想找一个好用的AI电销机器人,可是什么样的机器人才是好用的机器人呢?有哪些因素会影响AI电销机器人好不好用呢? 添加图片注释,不超过 140 字(可选…

groupnorm_backward反向公式推导

前向 均值 μ n g ∑ i 1 M ( X i ) M (1) {\large \mathit{\color{Blue} \mu_{ng} \frac{\sum_{i1}^M(X^{i})}{M}} } \tag{1} μng​M∑i1M​(Xi)​(1) 方差 σ n g 2 ∑ i 1 M ( X i − μ n g ) M (2) {\large \mathit{\color{Blue} \sigma_{ng}^2 \frac{\sum_{i …

在 Linux 上保护 SSH 服务器连接的 8 种方法

SSH 是一种广泛使用的协议,用于安全地访问 Linux 服务器。大多数用户使用默认设置的 SSH 连接来连接到远程服务器。但是,不安全的默认配置也会带来各种安全风险。 具有开放 SSH 访问权限的服务器的 root 帐户可能存在风险。尤其是如果使用的是公共 IP 地…

qt中json类

目录 QJsonValue QJsonObject QJsonArray QJsonDocument 案例: Qt 5.0开始提供了对Json的支持,我们可以直接使用Qt提供的Json类进行数据的组织和解析,下面介绍4个常用的类。 QJsonValue 该类封装了JSON支持的数据类型。 布尔类型&#xf…

【Power BI】Power BI 入门指南:版本、下载和报表创建的步骤

文章目录 一、前言二、了解 Power BI 版本三、下载 Power BI Desktop四、如何开始使用 Power BI Desktop五、在 Power BI Desktop 中创建报表六、文末总结 一、前言 Power BI 是微软于 2013 年推出的产品,为一款商业智能与数据可视化工具。它通过引人注目的视觉效果…

[Linux 基础] Linux编辑器Vim,你值得拥有

文章目录 1、Linux 软件包管理器 yum1.1 什么是软件包1.2 如何安装软件1.3 如何卸载软件 2、vim的使用2.1 vim的安装和配置2.2 vim的基本概念2.3 vim的基本操作 3、vim正常模式命令集4、vim注释与去注释5、Liunx编辑器-gcc/g使用5.1 如何使用gcc编译c程序5.2 gcc的翻译过程5.2.…

Python-pyecharts和pandas库

目录 pyecharts库 pandas库 示例1 示例2 pyecharts库 pyecharts是一个基于Python的交互式数据可视化库,旨在帮助用户轻松地创建各种类型的图表和可视化效果。该库是在Echarts开源项目的基础上开发的,Echarts是一款由百度开发的优秀的数据可视化工具。…

为什么机器学习中需要假设检验

最近由于研究需要,需要在机器学习项目的结果中加入假设检验的内容,但是机器学习中的假设检验和数理统计中的假设检验不同,是数理统计中假设检验的延申。但是,本来假设检验就是数理统计中的比较绕的一部分,比较难懂&…

泛在电力物联网的关键技术与未来发展策略-安科瑞黄安南

摘要: 文章分析了泛在电力物联网的内涵及其主要特征,针对泛在电力物联网的建设目标、基本构架以及关键技术与未来发展策略进行综合探讨,期待得到专业人士的指点。 关键词: 泛在电力物联网, 网络规划, 网络发展 随着能源革命的不…

MAC版idea如何安装maven?

什么是maven项目 Maven 是 Apache 组织下的一个跨平台的项目管理工具,它主要用来帮助实现项目的构建、测试、打包和部署。它的跨平台性保证了在不同的操作系统上可以使用相同的命令来完成相应的任务。 为什么选择Maven项目,而非普通的Java项目。普通的Java项目如果依赖其他…

kafka消费者程序日志报错Offset commit failed问题研究

生产环境偶尔会遇到kafka消费者程序日志报错的问题 截取主要日志如下: 2023-10-02 19:35:28.554 {trace: d7f97f70dd693e3d} ERROR[Thread-49:137] ConsumerCoordinator$OffsetCommitResponseHandler.handle(812) - [Consumer clientIdconsumer-1, groupIdcid_yin…

计算机网络基础(三):IPv4编址方式、子网划分、IPv4通信的建立与验证及ICMP协议

**IPv4地址是一个32位长的二进制数。**而这个32位二进制数又通常会表示为4个用点隔开的十进制数。那么,这个32位二进制数要如何通过4个十进制数表示出来呢? 我们在配置IPv4地址时,同时配置的“掩码”又有何用途? 1.IPv4编址方式…

第 367 场 LeetCode 周赛题解

A 找出满足差值条件的下标 I 模拟 class Solution { public:vector<int> findIndices(vector<int> &nums, int indexDifference, int valueDifference) {int n nums.size();for (int i 0; i < n; i)for (int j 0; j < i; j)if (i - j > indexDiffe…

软件测试的调用接口怎么调用,逻辑是什么?

一、什么是接口测试&#xff1f; 接口测试是测试系统组件之间接口的测试。接口主要用于检测外部系统和内部子系统之间的交互点。测试的重点是检查数据交换、传输、控制和管理过程&#xff0c;以及系统之间的相互逻辑依赖。 二、为什么要做接口测试&#xff1f; 在淘宝系统的历…

Go编程:使用 Colly 库下载Reddit网站的图像

概述 Reddit是一个社交新闻网站&#xff0c;用户可以发布各种主题的内容&#xff0c;包括图片。本文将介绍如何使用Go语言和Colly库编写一个简单的爬虫程序&#xff0c;从Reddit网站上下载指定主题的图片&#xff0c;并保存到本地文件夹中。为了避免被目标网站反爬&#xff0c…

C++入门篇(3)---引用

1.引用 你有没有被人起过外号?比如身边的朋友,喊他的时候不会叫他的全名,像我很好的朋友,我一般都喜欢叫他"阿威",而不会去称呼全名.我叫他"阿威",他还是他没有什么问题. 这里新登场的引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&am…

多线程使用处理数据库导致锁表解决办法

问题描述&#xff1a; 当使用ON DUPLICATE KEY UPDATE的sql来访问时&#xff0c; 可能会出现多个线程同时写入一个已有的数据里。 解决办法&#xff1a; 使用 REPLACE INTO 原因&#xff1a; 保持更好的并发性&#xff1a;REPLACE INTO 在插入记录时会先删除原有记录&#xf…

数据结构---二叉树

树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 树形结构中&#xff0c;子树之间不能有交集&#xff0c;…

Ubuntu22常用软件

别存太多重要东西在Ubuntu &#xff0c;硬盘损坏就麻烦 Tweaks自定义UI sudo apt intall gnome-tweaks为了方便管理和添加&#xff0c;还需添加&#xff1a; sudo apt install gnome-shell-extension-prefs gnome-shell-extension-manager -y1.打开Extension应用&#xff0c;添…