python-网络编程

news2024/11/17 17:52:08

python-网络编程

网络编程的理论概述:

现在的生活离不开网络,例如手机,电脑,平板,都是网络的代名词,通过一些APP,浏览器,获取大量的信息如
文字、声音、视频,这都是从网络的某个地址存在的或者是网络的另一端某个用户通过设备共享的,那么什么是网
络?是通过又是如何共享的尼?网络是由若干节点和连接这些节点的链路构成,表示诸多对象及其相互联系,像我
们平常办理宽带与手机办卡上网,都是通过向某一服务商缴费注册连上他们的设备,下载相应的聊天软件和浏览器
就可以上网与他人交流、获取资源、浏览一些网络信息。
当然还有一些其他的网络内容包含的范围非常大,只是没有接触到。现在的信息非常的发达,我们接触到的信息也
非常的多,那么我们的信息是怎么完成网络共享,资源共享的尼?
我们第一时间就是想到,浏览器,微信,QQ,这都是非常常见的网络信息传递和获取的方式,那是怎么传递的
尼?网络又是一个什么样的?这里将引入网络模型的概念,常见的七层OSI模型与四层TCP/IP模型诠释了网络的连
接与资源传递,当一个用户或一台主机向另一个用户或一台主机获取或是发送资源,中间的连接方式就封装在模型
概念上传输或连接。

Socket是什么:

我们了解了协议的基本概念,协议之间的关系,与层级之间的关联,完成了对网络的一个理解,当我们在QQ、微
信给别人发送消息时,就是通过这些层级数据传输的协议去传输我们的内容,或是我们浏览网页,打开一个百度页
面,都是基于协议传输的数据显示请求的页面,那我们如何去实现这些?不可能每一步都需要去写,从最底层开始
写起,那就太麻烦了,由此引出一个概念Socket,需要一一解答的问题,Socket在哪里?Socket是什么?目的是为
了做什么?先看下

image.png

Socket也叫套接字(Socket)随着TCP/IP协议的使用,也越来越多地被使用在网络应用程序的构建中。实际上,
Socket编程也已经成为网络中传送和接收数据的首选方法。套接字最早是由伯克利在BSD中推出的一种进程间通信
方案和网络互联的基本机制。现在,已经有多种相关的套接字实现,但是大部分还是遵循着最初的设计要求。套接
字相当于应用程序访问下层网络服务的接口。使用套接字,可以使得不同的主机之间进行通信,从而实现数据交
换。
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面
模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织
数据,以符合指定的协议。

Socket 详细:

本地的进程间通信(IPC)有很多种方式,例如
队列
同步(互斥锁、条件变量等)
以上通信方式都是在一台机器上不同进程之间的通信方式,那么问题来了
网络中进程之间如何通信?
网络中进程之间如何通信
首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!
在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的。
其实TCP/IP协议族已经帮我们解决了这个问题,网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议
+端口”可以唯一标识主机中的应用程序(进程)。
这样利用 ip地址,协议,端口就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交

socket(简称 套接字 ) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的
进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页、QQ 聊
天、收发 email 等等

Socket编程:

那我们如何实现尼?
在 Python 中 使用socket 模块的函数 socket 就可以完成:

说明:
套接字最初是为同一主机上的应用程序所创建,使得主机上运行的一个程序(又名一个进程)与另一个运行的程序
进行通信。这就是所谓的进程间通信(Inter Process Communication,IPC)
有两种类型的套接字:基于文件的和面向网络的。

''
函数 socket.socket 创建一个 socket,返回该 socket 的描述符,该函数带有两个参数:
- Address Family:可以选择 AF_INET(用于 Internet 进程间通信) 或者 AF_UNIX(用于同一台机器进程
间通信),实际工作中常用AF_INET
- Type:套接字类型,可以是 SOCK_STREAM(流式套接字,主要用于 TCP 协议)或者 SOCK_DGRAM(数据报套接
字,主要用于 UDP 协议)

那我们来创建一个基于tcp socket的套接字:

import socket
# 获得socket对象 AF_INET表示基于网络的套接字
# SOCK_STREAM表示的是TCP协议
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print ('Socket Created')

SocketServer

UPD
UDP — 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程
序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器
之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
UDP是一种面向无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任
何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。
UDP特点:
UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广
播发送。 UDP传输数据时有大小限制,每个被传输的数据报必须限定在64KB之内。 UDP是一个不可靠的协议,发
送方所发送的数据报并不一定以相同的次序到达接收方。
【适用情况】
UDP是面向消息的协议,通信时不需要建立连接,数据的传输自然是不可靠的,UDP一般用于多点通信和实时的数
据业务,比如
语音广播
视频
QQ
TFTP(简单文件传送)
SNMP(简单网络管理协议)
RIP(路由信息协议,如报告股票市场,航空信息)
DNS(域名解释)
相比较于TCP注重速度流畅
UDP操作简单,而且仅需要较少的监护,因此通常用于局域网高可靠性的分散系统中client/server应用程序。例如
视频会议系统,并不要求音频视频数据绝对的正确,只要保证连贯性就可以了,这种情况下显然使用UDP会更合理
一些。
那如何实现尼?
我们创建一个udp客户端程序的流程是简单的,具体步骤如下:

'''
1. 创建客户端套接字
2. 发送/接收数据
3. 关闭套接字
'''

image.png

下面一个示例代码

客户端:

image.png

image.png

客户端的结构:

(1)使用socket(),生成套接字描述符;
(2)通过host_post 结构设置服务器地址和监听端口;
(3)向服务器发送数据,sendto() ;
(4)关闭套接字,close() ;

通过客户端发送成功,我们指定了端口,但是我们没有与服务器建立连接,没有确定8080端口的连接对象,可以
将ip地址与端口随意需改符合要求的范围,都可以将数据正常发送
此时数据发送,这里就体现UDP数据的特性,面向无连接的通讯协议
这里我们接受数据该如何实现尼?往下看

服务器端如下代码:
接收数据

image.png

服务器端的结构

image.png

先运行我们的服务器,再运行我们的客户端,输入我们需要给到服务器的数据,
在客户端,观察发现向服务器发送消息的时候没有给客户端绑定端口?原来操作系统在此 做了些隐蔽的事情,当
socket首先向服务器发消息时客户端自动选折IP和一个PORT与该socket关联了起来。
那客户端与服务器之间的交互,能不能绑定端口,更多是多人交互尼,来我们继续往下走
echo服务的应用 ,echo服务是一种非常有用的用于调试和检测的工具。该协议接收到什么原样发回,类似于日常
生活中的“回声”,即存在回显

客户端修改后面代码:

image.png

服务端修改代码:

image.png

image.png

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

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

相关文章

[Linux]------线程同步和信号量

文章目录前言一、条件变量同步概念与竞态条件条件变量函数初始化销毁等待条件满足唤醒等待为什么pthread_cond_wait需要互斥量?条件变量使用规范二、生产者消费者模型为何要使用生产者消费者模型生产者消费者模型的优点基于BlockingQueue的生产者消费者模型C queue模…

1.MyBatis简介

1.概念 MyBatis是一款开源的持久层框架,它支持定制化SQL、存储过程以及高级映射。 与其它ORM框架不同,MyBatis没有将Java对象与数据表关联起来,而是作为Java方法和SQL语句的桥梁,一般称它为“半自动化ORM”框架。 2.Mybatis架构 …

【软件测试】在我刚上岗时,资深测试给我的建议让我受益匪浅......

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 建立测试基线 当我还…

BNB Chain对Zebec生态大力扶持,ZBC或继续登录一线平台

在行业早期开始,流支付赛道就已经具备了早期的轮廓,而在流支付协议Zebec Protocol出现后,该领域被推向了一个新的发展高度,并得到加密领域以及传统商业领域的高度关注。而随着生态的商业进展不断推进、生态不断壮大,Ze…

C++代码优化(1):条款1~4

"不要烟火不要星光,只要问问你内心的想法。" 本栏仅仅 由对《Effictive C》其中的一系列条款,掺杂着自己一些愚钝的理解而写的。 ---前言 条款01: 尽量以const、enum、inline 替换 #define 在谈及上述好几个关键字 与define宏定义的关系&…

Intel i226芯片4端口千兆以太网卡 2.5GPoE工业相机图像采集卡介绍

PCIe-8634图像采集卡是一款基于 Intel i226芯片高性能千兆工业级 PCIe*4 POE网卡,具有传输速度高、兼容性强、性能稳定的特点,可广泛主要应用于网络高清监控、无线覆盖、工业自动化等领域。 RJ45千兆网络采用4 k Intel226千兆网络芯片,支持10/100/1000/2500Mbps传输…

microservices 简介

油鹳视频 Microservices explained - the What, Why and How? https://www.youtube.com/watch?vrv4LlmLmVWk&t2s microservices 是一种软件体系结构, microservices architecture(微服务架构) 是与传统的 monolithic architecture(整体式架构,一体…

微信转盘抽奖小程序如何制作?

微信转盘抽奖小程序如何制作?大概需要多少钱? 价格方面,平台按年收费,一年1498至2498元。 明码标价,7天退款制度,随时退。 微信转盘抽奖小程序如何制作步骤: 1.进入第三方微信转盘抽奖小程序制作平台官…

计算机结构体系:指令调度与循环展开题型 (非凭感觉的方法详解)

文章目录题目初始分析1.确定所使用的各个寄存器的作用2.将循环体内容语句和控制语句分开3.找出每一条循环体内容指令的代价并排序4.找出每一条循环体控制指令的代价并排序5.基于贪婪算法的最优循环展开体系结构这门课程中,指令调度和循环展开可以说是课程最困难的地…

负载均衡反向代理下的webshell

负载均衡(Load Balance) 是一种廉价的扩容的方案,它的概念不是本文的重点,不知道的可以去查资料学习。实现负载均衡的方式有很多种,比如 DNS 方式、HTTP 重定向方式、IP 负载均衡方式、反向代理方式等等。 其中像 HTTP 重定向方式、DNS方式等…

BioPython ② | 面向对象编程Object Oriented Programming

BioPython ② | Python面向对象编程 题目要求 定义分子类(Molecule)作为基类,包含集合elements和weight作为其属性,用初始化函数,将elements初始化为空集,weight初始化为None;定义show_weight…

进阶 - Git的远程仓库

本篇文章,是基于我自用Windows(Win10)系统当做示例演示 Git的远程仓库 之前我们一直在探讨 Git 的一些命令,也提及了仓库的概念。如果只是在一个仓库里管理文件历史,Git 和 SVN 真没啥区别。 Git 是分布式版本控制系…

02 stata入门【计量经济学及stata应用】

安装:建议直接在微信搜索,很多公众号有安装包资源及下载教程 不同版本在基本功能上无较大差异,一般为SE,更为专业MP,只是在处理变量个数或容量等存在不同 界面 历史命令;结果窗口&命令窗口&#xff1b…

字节跳动岗位薪酬体系曝光,看完感叹:不服不行,想高薪还得是学这个。。。。

目录:导读 前言 01岗位职级 02岗位薪酬 03绩效考核与晋升 大厂软件测试岗经验分享 一、软件测试基础篇:2022版 二、MySQL篇:2022版 三、 Linux篇:2022版 四、 Web测试 五、接口测试 六、APP测试 七、性能测试 八、Se…

Nacos一些理解

下载Mysql //下载mysql docker pull mysql:5.7 //运行容器 docker run -p 3306:3306 --name mysql -v /home/mysql/log:/var/log/mysql -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORDxx -d mysql:5.7 将导入数据库 1.新建数据库 nacos /*Navicat Premiu…

HyperMesh宝典 | 跟着老师学,你也可以做好二次开发

说到二次开发,你的脑海里是不是浮现出了“码农”两个字?有人可能会问,码农又是什么? 你是不是觉得二次开发这种码农干的事情感觉起来也太困难了吧? 其实有时候二次开发真的很简单,懂一点二次开发会让你的工…

机器学习中的数学原理——多项式回归

这个专栏主要是用来分享一下我在机器学习中的学习笔记及一些感悟,也希望对你的学习有帮助哦!感兴趣的小伙伴欢迎私信或者评论区留言!这一篇就更新一下《白话机器学习中的数学——多项式回归》! 目录 一、什么多项式回归 二、算法…

Java#33(IO流)

目录 一.IO流 作用: (对于程序而言)用于读写数据(本地数据, 网络数据) 二.IO流体系 1.字节输出流 2.字节输入流 3.文件拷贝 3.字符集 字符流 字符输入流 字符输出流 缓冲流 转换流 序列化流 ​编辑反序列流 打印流 一.IO流 I: input O: output 流: 想流…

Linux下创建动态链接库与静态链接库

动态链接库 Linux下的动态链接库文件扩展名为so,可以用多个文件生成一个动态链接库。 在头文件中定义三个函数,三个函数分别于三个cpp文件中实现。 将三个cpp文件编译成动态库libdynamic.so -fPIC表示编译为位置独立的代码,如果不选择默…

使用YOLOv5练自己的数据集

说明 上次使用学习了如何运行yolov5检测自己的数据,这次学习yolov5如何训练自己的数据集 本次记录如何使用yolov5训练自己的数据集以及遇到报错解决方案 数据 使用数据:水果数据集 数据包含了png图片和相应的标注文件 切分数据 代码如下&#xff1…