【python开发】网络编程(上)

这里写目录标题

  • 一、必备基础
    • (一)网络架构
      • 1、交换机
      • 2、路由器
      • 3、三层交换机
      • 4、小型企业基础网络架构
      • 5、家庭网络架构
      • 6、互联网
    • (二)网络核心词汇
      • 1、子网掩码和IP
      • 2、DHCP
      • 3、内网和公网IP
      • 4、云服务器
      • 5、端口
      • 6、域名
  • 二、网络编程
    • 案例一:智障客服
    • 案例二:上传文件
  • 三、B/S和C/S架构
    • (一)C/S架构
    • (二)B/S架构

一、必备基础

(一)网络架构

两台电脑之间如果想要传输数据,最原始的方法是在两个电脑之间连接一个网线,网线上有网口,网口本质上就是网卡,网卡是专门用来做网络通信的。
请添加图片描述

1、交换机

两台电脑之间可以通过网线进行数据交换,但如果有四台电脑,四个电脑之间想要进行数据交互的时候,就必须让一台电脑拥有三个接口,这显然是低效率的,于是就发明了交换机。请添加图片描述
当四台电脑连接到交换机上,互相之间就可以进行数据传输,此时就形成了小小的局域网,交换机会给四个电脑分配IP地址,IP也可以自己指定,这个IP地址就代表了电脑,每个电脑的网口中有一个网卡,而每个网卡上都有一个mac地址,mac地址是在电脑出厂的时候配置到网卡上的,而网卡一般是连在电脑的主卡上的,如果电脑换了主板,意味着电脑的主板会发生变化。

交换机在局域网内,通过广播的形式实现了电脑的通信:当2号电脑给3号电脑发消息时,电脑会打包一个数据信息,包括头部信息和发送数据,其中,头部信息包括了本机IP和mac地址以及目标机台的IP和mac地址,信息包传递到交换机上,交换机会以广播的形式传送给每天机器,所有的电脑就会进行校验,查看该信息包是否是传送给自己的,当目标机器3号收到信息时,也会给2号信息传递一个已经收到的信息,同样是通过交换机以广播的形式进行传递。但是这样的传递效率还是比较低的,但是随着传送次数多了之后,交换机和局域网内所有电脑就会有记录:IP地址和MAC地址的对应关系,之后交换机就会通过IP地址直接将信息传递给对应的mac地址,这样就免去了广播形式,只需要单播就可以发送信息。

2、路由器

当局域网和局域网之间需要进行数据传递时,如果将交换机之间进行直连,则会产生广播风暴,此时就需要借助另外一个有效的机器——路由器。请添加图片描述
有了路由器之后,则会给不同的局域网配置不一样的ip地址,进行一个区域划分,接着要配置网关地址。

所以不同的局域网之间传递信息,将通过网关检查网段是否正确,然后通过交换机传递到目标电脑上。全球的信息传递就是通过交换机和路由器实现的。
请添加图片描述

3、三层交换机

集成了交换机和路由器的功能,既能够实现在局域网内收发消息,也能够构建不同局域网并在不同局域网内实现通讯。三层交换器内,首先由路由器划分vlan(网段),这一步相当于是交换机脸上了路由器。不同的局域网有不同的网段,不同局域网之间进行数据交互,则需要通过网关检查所属网段,然后发送到目标网段中,再有交换机通过广播/单播的形式发送给目标电脑。

请添加图片描述

4、小型企业基础网络架构

请添加图片描述

5、家庭网络架构

运营商连接光猫连接家用路由器(简单得实现了交换机和路由器的功能)连接电脑,家用路由器性能差,只能连接较少的设备。

6、互联网

与国外的网络进行链接,也需要专门的设备,该设备由三大运营商出资购买。

(二)网络核心词汇

1、子网掩码和IP

每一个IP地址代指一台电脑,IP其实是一个32位的二进制,为了便于记忆将它分为4组,每组8位,由小数点分开,每组的数值在0-255之间。

子网掩码的主要作用是屏蔽IP地址的一部分以区别网络标识和主机标识。一个ip地址可以分为两个部分:网络地址+主机地址。192.168.1.199/24表示前24位是网络地址(被掩盖),后面8位是主机地址。

划分成网络地址+主机地址的意义是什么?
网络地址相同的可以视作是同一个网络,网络地址相同的IP属于同一个网段,在局域网内只有同一个网段的IP才能相互通信,不同网段的IP通信需要借助路由器转发才能通信。在局域网内如果不是同一个网段也不能相互通讯。

2、DHCP

在一个局域网内,给某台电脑分配IP的方法有两种:(1)手动设置;2、自动获取。其中自动获取方式在电脑为“自动获取IP地址”,在路由器或三层交换机,开启DHCP服务,并设置IP地址。

3、内网和公网IP

自己在一个局域网内为电脑分配的IP都称为内网IP,基于内网IP可以在一个局域网内进行互相通信是可以的,但是不能跨运营商进行数据传输。如果想要通过互联网进行通信,就必须借助公司IP,例如家庭电脑想访问某公司服务器上部署的网站:

(1)公司去运营商申请公司的固定IP(办理专线宽带时,运营商会分配至少1个固定IP地址),其实运营商就是将专线和固定IP建立一个绑定关系。
(2)配置公网IP与制定服务器的转发规则。
(3)家庭电脑如果想访问某个公司拂去其上的网站,只需要执行制定IP,运营商就会根据IP找到与之关联的公司专线,并通过公司路由器、防火墙等设备找到服务器。

由于全球用户太多,IP不够分,所以运营商会进行划分,让多个家庭宽带用户共用一个公网IP(动态,所以每次上网公网IP都不一样)。

如果想开发一个网站供全球的用户访问,需要达到以下几个条件:
(1)拉专线,申请固定公网IP;
(2)买一台服务器(性能好的电脑);
(3)公网IP绑定至服务器;
(4)将写好的代码放在服务器上并运行起来。

4、云服务器

简单说,云服务器就是构建了一个机房,买了很多服务器,然后通电+通网,主要对外租赁这些服务器资源,让用户不必再自己拉专线+配置网络+买服务器。

假设在腾讯云租一台服务器,就可以根据自己的需求去选择配置,腾讯云会根据配置在他的物理机上虚拟出一个服务器,并进行相应的环境初始化并绑定公网固定IP,这样就可以快速拥有一台可以被大家访问的服务器了。注:一台性能非常高的物理机虚拟出很多虚拟机,类似于在自己电脑上通过vmware、parallel等搞出多台虚拟机。

5、端口

假设公司在腾讯租了一台云服务器(外网IP:123.206.15.88),然后又开发了两个网站运行在服务器上。那么用户在自己的手机或电脑上如何分别来访问同一台服务器上的两个程序呢?

在计算机中有一个端口,每个程序想要通过网络来进行通讯都必须要制定一个接口,例如:网站A 8001端口、网站B 8002端口。注意:端口的取值范围是:0~65535,其中前5000个端口已经有特定的含义,在自定义的时候最好选择5000之后的端口。

6、域名

对于浏览器来说,如果给了IP地址,但是没有给端口,会自动补全端口,由于IP地址很难记,所以域名就产生了,域名类似于www.baidu.com,为了好查询网址,对域名和IP创建对应关系,用户只需要记住域名就可以了。域名与端口无关。

当用户在自己电脑或手机上输入域名去访问时,有两个步骤:(1)根据域名寻找IP;(2)获得IP后,再通过IP去访问指定的服务器。

在电脑上输入域名后,寻找IP的过程如下:
(1)在自己电脑的DNC缓存记录中寻找域名对应的IP,如果未命中,则执行下一步;
(2)在自己电脑的hosts文件中寻找,如果未命中,则执行下一步;
(3)在自己电脑上找到DNC配置的地址(本地域名服务器),去这个地址寻找域名对应的IP,如果未命中,则进行下一步;
(4)去根域名服务器中询问(全球共13台根域名服务器,离中国最近的一台在日本)。
请添加图片描述
如果想要让自己的网站通过域名来访问,应该怎么办?
(1)租一个域名:ICANN,域名的总管理者(英国的一个非盈利机构),它仅制定域名政策,注册业务会授权一些顶级注册商,可以对外销售域名,但要受国家互联网信息中心的管理。

顶级注册商有:中国万网(阿里云收购)、新网互联、商务中国、中国频道等。
代理注册商:顶级注册商可以再招一些代理帮助他们麦域名。

(2)备案:现在国内注册域名后,需要进行备案(提交一些网站、个人或企业信息后)才能使用,国外的域名无需备案就可以使用。

(3)域名解析:让域名和IP创建关联关系,并将关系同步到相关:本地域名服务器和根域名服务器。

二、网络编程

通常来说需要编写两个程序,一个是对客户的,一个是对服务器的,我们现在自己的电脑上测试,ip地址使用“127.0.0.1”,该地址会自动返回本机IP地址(由于每次云服务器都会随机给每个电脑分配ip地址,所以每次的ip地址都不同)。

服务端:

import socket#1、监听本机的IP和端口
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('127.0.0.1', 8001)) #bind绑定IP和端口,127.0.0.1是回环IP地址,返回本机的IP地址,因为每次上网给出的地址都是随机的。sock.listen(5) #支持排队等待5人while True:#2、等待,有人来连接(阻塞)conn, addr = sock.accept() #等待客户端来连接(阻塞)#3、等待,连接着发送信息(阻塞)client_data = conn.recv(1024) #等待接收客户端发来的数据print(client_data.decode('utf-8')) #正常来说返回的是字节信息,如果想看内容的话需要用utf-8来解码#4、给连接者回复信息conn.sendall("hello world".encode('utf-8'))#5、关闭连接conn.close()#6、停止服务端程序
sock.close()

客户端:

import socket#1、向指定IP发送连接请求
client = socket.socket()
client.connect(('127.0.0.1', 8001))#2、连接成功之后,发送消息
client.sendall('hello'.encode('utf-8'))#3、等待,消息的回复(阻塞)
reply = client.recv(1024)
print(reply)#4、关闭连接
client.close()

案例一:智障客服

服务端

import socket#1、监听本机的ip和端口
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('127.0.0.1', 8001)) #以元组格式上传IP和端口
sock.listen(5)while True:#2、等待有人连接(阻塞)conn, addr = sock.accept()print("来人了")#3、连接成功后立即发送conn.sendall("欢迎使用xx系统,请输入您想办理的业务".encode('utf-8'))while True:#3、等待接收信息data = conn.recv(1024)if not data:breakdata_string = data.decode('utf-8')#4、回复信息conn.sendall("你说啥?".encode('utf-8'))print("断开连接了")conn.close()sock.close()

客户端

import socket#1、向指定IP发送连接请求
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 8001))#2、连接成功后,获取系统登录信息
message = client.recv(1024)
print(message.decode('utf-8'))while True:content = input("请输入(Q/q退出)")if content.upper() == 'Q':breakclient.sendall(content.encode('utf-8'))reply = client.recv(1024)print(reply.decode('utf-8'))client.close()

案例二:上传文件

服务端


import socketsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('127.0.0.1', 8001))
sock.listen(5)conn, adrr = sock.accept()#收集文件大小
data = conn.recv(1024)
total_file_size = int(data.decode('utf-8'))#接收文件
file_obj = open('xxx.png', mode='wb')
recv_size = 0while True:#每次最多接收1024字节data = conn.recv(1024)file_obj.write(data)file_obj.flush()recv_size += len(data)#上传完成if recv_size == total_file_size:break#接收完毕,关闭连接
sock.close()

客户端


import socket
import time
import osclient = socket.socket()
client.connect(('127.0.0.1', 8001))file_path = input("请输入要上传的文件:")#先发送文件大小
file_size = os.stat(file_path).st_size
client.sendall(str(file_size).encode('utf-8'))print("准备中")
time.sleep(2)
print("开始上传")
file_object = open(file_path, mode='rb')
read_size = 0
while True:chunk = file_object.read(1024)client.sendall(chunk)read_size += len(chunk)if read_size == file_size:breakclient.close()

三、B/S和C/S架构

(一)C/S架构

是client和server的简称。开发这种架构的程序意味着既需要开发客户端也需要开发服务端。例如:QQ、百度网盘、钉钉等安装在电脑上的软件。

服务端:互联网公司会开发一个程序放在服务器上,用于给客户端童数据支持。客户端:大家在电脑安装的相关程序,内部会连接服务器进行首发数据并提供交互和展示的功能。

(二)B/S架构

是Browser和server的简称。开发这种架构的程序意味开发服务端即可,客户端用用户电脑上的浏览器来代替。例如:淘宝、京东等网站。

服务端:互联网公司开发一个网站,放在他们的服务器上;
客户端:不需要开发,用现成的浏览器即可。

简而言之:B/S架构是开发网站;C/S架构就是开发安装在电脑的软件。

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

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

相关文章

大数据分析课----实时更新

1:Anaconda3 windows 安装 : 去官网下载; 然后安装好直接点next 点 i agree; 自己的电脑选第一个;学校的话选All Users ; 选择自己存放的目录; 选前三个; 安装即可; 一直…

UE4 Niagara 关卡3.4官方案例解析

Texture sampling is only supported on the GPU at the moment.(纹理采样目前仅在GPU上受支持) 效果:textures can be referenced within GPU particle systems。this demo maps a texture to a grid of particles(纹理可以在GPU粒子系统中被引用这个演…

牛客网C++专项题目整理(1)

1. 若有定义语句:char s[3][10],(*k)[3],*p;则以下赋值语句错误的是 1.p s; 2.p k; 3.p s[0]; 4.k s; 答案:124 char s[3][10] s 是数组指针,类型为char (*)[3],所指向的每个数组长度为10; char (*k)[3] k是一个数组指针&a…

【C++庖丁解牛】初始化列表 | Static对象 | 友元函数

📙 作者简介 :RO-BERRY 📗 学习方向:致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持 目录 1. 再谈构造函数1.1 …

小程序常用样式和组件

常用样式和组件 1. 组件和样式介绍 在开 Web 网站的时候: 页面的结构由 HTML 进行编写,例如:经常会用到 div、p、 span、img、a 等标签 页面的样式由 CSS 进行编写,例如:经常会采用 .class 、#id 、element 等选择器…

【计算机网络】TCP 如何实现可靠传输

TCP通过三次握手建立连接,四次挥手释放连接,确保连接建立和连接释放的可靠。 序列号、检验和、确认应答信号、重发机制、连接管理、窗口控制、流量控制、拥塞控制 标准回答 可靠传输就是通过TCP连接传送的数据是没有差错、不会丢失、不重复并且按序到达的…

React之数据绑定以及表单处理

一、表单元素 像<input>、<textarea>、<option>这样的表单元素不同于其他元素&#xff0c;因为他们可以通过用户交互发生变化。这些元素提供的界面使响应用户交互的表单数据处理更加容易 交互属性&#xff0c;用户对一下元素交互时通过onChange回调函数来监听…

【李沐论文精读】GAN精读

论文&#xff1a;Generative adversarial nets 参考&#xff1a;GAN论文逐段精读、生成对抗网络、李沐视频精读系列 一、介绍 什么是GAN? GAN(Generative adversarial network&#xff0c;生成对抗网络&#xff09;&#xff0c;它由生成器G&#xff08;Generator Neural Netwo…

持安科技孙维伯:零信任在攻防演练下的最佳实践|DISCConf 2023

近日&#xff0c;在2023数字身份安全技术大会上&#xff0c;持安科技联合创始人孙维伯应主办方的特别邀请&#xff0c;发表了主题为“零信任在攻防演练下的最佳实践”的演讲。 孙维伯在2023数字身份安全技术大会上发表演讲 以下为本次演讲实录&#xff1a; 我是持安科技的联合…

二百二十六、Linux——shell脚本查看今天日期、昨天日期、30天前日期、1月前日期

一、目的 由于磁盘资源有限&#xff0c;因为对原始数据的保存有事件限制&#xff0c;因为对于超过一定期限的数据文件则需要删除&#xff0c;要实现定期删除则第一步就是查看日期时间 二、在Linux中创建shell脚本 #! /bin/bash source /etc/profile nowdatedate --date0 da…

计算机系统缺少cv100.dll文件解决方法(最新)

cv100.dll 是一个Windows操作系统中的动态链接库&#xff08;DLL&#xff09;文件。DLL文件是包含可由多个程序共享的代码和数据的模块&#xff0c;以减少磁盘空间占用并提高系统性能。根据收集到的信息&#xff0c;cv100.dll 文件可能与图像处理、计算机视觉相关的功能有关。 …

iOS中卡顿产生的主要原因及优化思路

卡顿本质上是一个UI体验上的问题&#xff0c;而UI的渲染及显示&#xff0c;主要涉及CPU和GPU两个层面。若 CPUGPU渲染耗时超过16.7ms&#xff0c;就会在屏幕vsync信号到来时无法更新屏幕内容&#xff0c;进而导致卡顿。 iOS中UI渲染主要包含Layout->Display->Prepare->…

Sora到底有多强?

北京时间2月16日凌晨&#xff0c;OpenAI发布文本生成视频的AI模型Sora&#xff0c;瞬时刷屏科技圈&#xff0c;成为2024年开年“顶流”。 官方称&#xff0c;Sora只需文本就能自动生成高度逼真和高质量的视频&#xff0c;且时长突破1分钟。这是继文本模型ChatGPT和图片模型Dal…

C 数据类型

在 C 语言中&#xff0c;数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间&#xff0c;以及如何解释存储的位模式。 C 中的类型可分为以下几种&#xff1a; 序号类型与描述1基本数据类型 它们是算术类型&#xff0c;包括整型…

Gitlab 安装部署

目录 1、Jenkins 结合 Gitlab 构建 CI/CD 环境 CI/CD 介绍 CI/CD 流程 Jenkins 简介 GitLab 简介 项目部署方式 CI系统的工作流程 2、搭建 GitLab 安装 GitLab 配置 GitLab 修改root密码 访问 GitLab 开机自启 3、使用 GitLab 管理 GitLab 关闭 GitLab 注册功能…

我的NPI项目之Android 安全系列 -- Keymaster到底是个什么

最近因为一直在调研独立secure element集成的工作&#xff0c;不巧的是目前使用的高通平台只有NFC-eSE的方案。高通目前也并不支持独立的eSE集成&#xff0c;codebase中并无相对应的代码。举个例子&#xff0c;目前使用的STM的一款eSE&#xff0c;但是这款eSE的开发STM还没有完…

【MySQL】数据库中常用的函数

目录 聚合函数COUNT()函数的多种用法COUNT(*)COUNT(主键)COUNT(1)COUNT(常量)COUNT(非主键)COUNT(distinct(字段)) COUNT()函数小结 字符函数length(str)函数&#xff1a;获取参数值的字节个数concat(str1,str2,...)函数&#xff1a;字符串拼接upper(str)、lower(str)函数:大小…

java 商机管理系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 java 商机管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

【数据结构】用队列实现栈

下面是一些思路分析和代码分享&#xff0c;有需要借鉴即可。 1.问题描述 我想用队列来实现栈的功能&#xff0c;具体而言是用两个队列做底层做出栈的功能来。 有人可能会疑问会不会多次一举&#xff0c;这里仅作练习&#xff0c;为了更加进一步了解栈/队列的性质 2.思路分析 …

Android logcat系统

一 .logcat命令介绍 android log系统: logcat介绍 : logcat是android中的一个命令行工具&#xff0c;可以用于得到程序的log信息. 二.C/Clogcat访问接口 Android系统中的C/C日志接口是通过宏来使用的。在system/core/include/android/log.h定义了日志的级别&#xff1a; /…