计算机基础知识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,一经查实,立即删除!

相关文章

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

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

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是一款由百度开发的优秀的数据可视化工具。…

计算机网络基础(三):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…

数据结构---二叉树

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

1.Vue-在独立页面实现Vue的增删改查

题记 在独立页面实现Vue的增删改查&#xff0c;以下是具体的代码&#xff0c;和操作流程。 编写index.html页面 index.html文件如下&#xff1a; <!DOCTYPE html> <html> <head><title>Vue CRUD Example</title><!--在线导入vue文件-->&l…

如何在自动化测试中使用MitmProxy获取数据返回?

背景介绍 当我们在接口或UI自动化项目中&#xff0c;常常会出现这种现象——明明是正常请求&#xff0c;却无法获取到想要的数据返回。 比如&#xff1a; 场景A&#xff1a;页面是动态数据&#xff0c;第一次进入页面获取到的数据&#xff0c;和下次进入页面获取到的数据完全…

ASEMI整流桥GBJ2510参数:拆析其关键性能特点

编辑-Z 在众多的电力电子元件中&#xff0c;GBJ2510整流桥以其高效能和可靠性赢得了工业领域的广泛认可。这款设备是在电力系统、直流电源等一系列设备中不可或缺的组件。本文将详细反析GBJ2510整流桥参数的关键性能特点&#xff0c;以帮助用户更加全面地理解和使用这种电子设…

Blender:制作一个变形动画

就是一个球逐渐地变为一个立方体 首先创建一个球和一个立方体 然后把两个物体放在一起&#xff0c;放缩球&#xff0c;让球包含立方体 之后选中球&#xff0c;为其添加修改器&#xff0c;缩裹 在这里选择缩裹对象为立方体 然后在应用下拉箭头中选择“应用为形态键” 下一步选中…

尚硅谷Flink(二)DStream API

目录 &#x1f320;不会点 &#x1fa90;DataStream API ​编辑 &#x1f320; 执行环境 创建执行环境 执行模式 触发程序执行 &#x1f320;源算子 准备基础类型 从集合中读取数据 从文件读取数据 从 Socket 读取数据 从 Kafka 读取数据 &#xff08;没学过&#xff09; …

【MATLAB-Retinex图像增强算法的去雾技术】

续&#xff1a;【MATLAB-基于直方图优化的图像去雾技术】 【MATLAB-Retinex图像增强算法的去雾技术】 1 原图2 MATLAB实现代码3 结果图示 参考书籍&#xff1a;计算机视觉与深度学习实战:以MATLAB、Python为工具&#xff0c; 主编&#xff1a;刘衍琦, 詹福宇&#xff0c; 王德建…

【ElasticSearch】使用 Java 客户端 RestClient 实现对文档的查询操作,以及对搜索结果的排序、分页、高亮处理

文章目录 前言&#xff1a;RestClient 查询文档的 RestAPI一、全文检索查询1.1 match_all 查询1.2 match 查询1.3 multi_match 查询 二、精确查询2.1 term 查询2.2 range 查询 三、复合查询&#xff1a;Boolean 查询与 function score 查询的综合案例四、对查询结果的处理4.1 将…

ArcGIS笔记5_生成栅格文件时保存报错怎么办

本文目录 前言Step 1 直接保存到指定文件夹会报错Step 2 先保存到默认位置再数据导出到指定文件夹 前言 有时生成栅格文件时&#xff0c;保存在自定义指定的文件夹内会提示出错&#xff0c;而保存到默认位置则没有问题。因此可以通过先保存到默认位置&#xff0c;再数据导出到…

【Eclipse】设置自动提示

前言&#xff1a; eclipse默认有个快捷键&#xff1a;alt /就可以弹出自动提示&#xff0c;但是这样也太麻烦啦&#xff01;每次都需要手动按这个快捷键&#xff0c;下面给大家介绍的是&#xff1a;如何设置敲的过程中就会出现自动提示的教程&#xff01; 先按路线找到需要的页…