网络编程

网络编程

1.引子

加入有两个脚本,foo.py , bar.py ,分别运行,都可以正常运行。但是现在想从两个程序间传递一个数据。

  • 同一台电脑
    • 创建一个文件,讲foo.py的数据读入文件中,bar.py从文件中读取数据。
  • 不同电脑间
    • 该怎么做?

软件的开发架构

C/S架构

C/S即Client和Server—>客户端和服务器端架构

B/S架构

B/S即Browser和Server —>浏览器端和服务器端架构

什么是网络

网络就是一种辅助双方或者多方能够连接在一起的工具。

伴随着网络发展,人们使用了很多通信方法,有些已不再使用,现在使用最广泛的是TCP/IP(Transmission Control Protocol/Internet Protocol)

TCP/IP是标准的协议,其可以使世界范围内的计算机通过Internet或本地网络通信。

TCP/IP事实上是一些协议(protocols)的合集。当前大多数使用中的通信都使用TCP协议。

Internet是在一些共享的线路上发送数据’的。例如:在您的计算机上也许同时运行着几个应用程序,如Web浏览器、通讯软件等程序,而您只须通过一条单一的线路来连接互联网。上面所有的程序都共享这个连接,简单地说,用户往往不会觉察到这个共享的发生。

目的

  • 使用网络把多方连接在一起,然后,进行数据传输

  • 为了让不同电脑上的软件可以互相传递数据

网络编程的定义

让不同的电脑中软件能够进行数据传递,即网络中不同主机间的通信

地址

1. 生活中的地址与标识

不同的网络中,采用唯一的标识来区分不同的主体,比如车牌号、建筑物地址、电话号码、员工编号等等

一台电脑怎么找到很多电脑中的一台呢?

警察怎么找到嫌疑犯的?

2. ip地址的作用

ip地址:用来在网络中标记一台电脑,比如192.168.1.1;在同一网络中是唯一的。

同一网络:好比班级编号,球队编号。

同一网络:例如同一个局域网, 一个教室里。

3. IP地址分类

目前ip主要分为两种

  • ipv4, 32位二进制构成。分成四段,每段范围0~255(2的8次方,四个字节)
  • ipv6, 128位二进制构成

每一个IP地址包括:

  • 网络号

  • 主机号

类似手机号码由区号+电话主机号组成。

无线局域网适配器 WLAN:

   连接特定的 DNS 后缀 . . . . . . . :
   IPv6 地址 . . . . . . . . . . . . : 2001:250:6405:6005:3c24:9133:3cf5:60b8
   临时 IPv6 地址. . . . . . . . . . : 2001:250:6405:6005:8dfe:2f56:9d01:767c
   本地链接 IPv6 地址. . . . . . . . : fe80::3c24:9133:3cf5:60b8%10
   IPv4 地址 . . . . . . . . . . . . : 192.168.1.105
   子网掩码  . . . . . . . . . . . . : 255.255.255.0
   默认网关. . . . . . . . . . . . . : fe80::22a:6aff:fefa:ff3c%10
                                       192.168.1.1
二进制八进制十进制十六进制
0000 00010000 000110000 0001
0000 00100000 000220000 0002
0000 00110000 000330000 0003
0000 10000000 001080000 0008
0000 001190000 0009
100000 000a
0000 1111150000 000f

进制基数为base

各进制到十进制的转化(x为每位上的数字,i为其位数)11111111

高老师 2019/8/5 10:16:15

## 网络通信过程

### 1. 2台电脑的网络

#### 说明

> 1. 如果两台电脑之间通过网线连接是可以直接通信的,但是需要提前设置好ip地址以及网络掩码
> 2. 并且ip地址需要控制在同一网段内,例如 一台为192.168.1.1另一台为192.168.1.2则可以进行通信

### 2. 使用集线器组成一个网络

#### 说明

> 1. 当有多台电脑需要组成一个网时,那么可以通过集线器(Hub)将其链接在一起
> 2. 一般情况下集线器的接口较少
> 3. 集线器有个缺点,它以广播的方式进行发送任何数据,即如果集线器接收到来自A电脑的数据本来是想转发给B电脑,如果此时它还连接着另外两台电脑C、D,那么它会把这个数据给每个电脑都发送一份,因此会导致网络拥堵

### 3. 使用交换机组成一个网络

#### 说明

> 1. 克服了集线器以广播发送数据的缺点,当需要广播的时候发送广播,当需要单播的时候又能够以单播的方式进行发送
> 2. 它已经替代了之前的集线器
> 3. 企业中就是用交换机来完成多态电脑设备的链接成网络的

### 4. 使用路由器连接多个网络

### 5. 通信过程(复杂)

较为复杂的通信过程如:www.baidu.com

#### 说明

> 1. 在浏览器中输入一个网址时,需要将它先解析出ip地址来
> 2. 当得到ip地址之后,浏览器以tcp的方式3次握手链接服务器
> 3. 以tcp的方式发送http协议的请求数据 给 服务器
> 4. 服务器tcp的方式回应http协议的应答数据 给浏览器

总结
* MAC地址:在设备与设备之间数据通信时用来标记收发双方(网卡的序列号)
* IP地址:在逻辑上标记一台电脑,用来指引数据包的收发方向(相当于电脑的序列号)
* 网络掩码:用来区分ip地址的网络号和主机号
* 默认网关:当需要发送的数据包的目的ip不在本网段内时,就会发送给默认的一台电脑,成为网关
* 集线器:已过时,用来连接多态电脑,缺点:每次收发数据都进行广播,网络会变的拥堵
* 交换机:集线器的升级版,有学习功能知道需要发送给哪台设备,根据需要进行单播、广播
* 路由器:连接多个不同的网段,让他们之间可以进行收发数据,每次收到数据后,ip不变,但是MAC地址会变化
* DNS:用来解析出IP(类似电话簿)
* http服务器:提供浏览器能够访问到的数据

高老师 2019/8/5 10:23:45

这个标准定义了网络的七层框架,试图使得计算机在整个世界范围内实现互联。
在OSI中,网络体系结构被分成下面的七层。

- 物理层
- 定义了通信设备的传输规范,规定了激活、维持和关闭通信节点之间的机械特性、电气特性和功能特性等。此层为上层协议提供了一个传输数据的物理媒介。
- 数据链路层
- 定义了数据封装以及传送的方式。这个层次的数据单位称为“帧”。数据链路层包括两个重要的子层:逻辑链路控制层(Logic Link Control,LLC)和介质访问控制层(Media Access Control,MAC)。LLC用来对节点间的通信链路进行初始化,并防止链路中断,确保系统的可靠通信。而MAC则用来检测包含在数据帧中的地址信息。这里的地址是链路地址或物理地址,是在设备制造的时候设置的。网络上的两种设备不能有相同的物理地址,否则会造成网络信息传送失败。
- 网络层
- 定义了数据的寻址和路由方式。这一层负责对子网间的数据选择路由,并实现网络互连等功能。
- 传输层
- 为数据提供端到端传输。这是比网络层更高的层次,是主机到主机的层次。传输层将对上层的数据进行分段并进行端到端传输。另外,还提供差错控制和流量控制机制。
- 会话层
- 用来为通信的双方制定通信方式,包括建立和拆除会话。另外,此层将会在数据中插入校验点来实现数据同步。
- 表示层
- 为不同的用户提供数据和信息的转换。同时还提供解压缩和加解密服务。这一层保证了两个主机的信息可以互相理解。
- 应用层
- 控制着用户绝大多数对于网络应用程序的访问,提供了访问网络服务的接口。

开放式系统互联参考模型(Open system interconnection reference model)—>简称OSI

[外链图片转存失败(img-BNMyMOue-1565001017918)(C:\Users\lx\Desktop\QQ图片20190805102840.jpg)]

端口

整个网络通信通过ip地址+端口来标识不同的网络服务。

端口号是用来表示区别网络中不同的应用,操作系统会对端口进行编号,即端口号。

  • 端口号使用16,也就是2个字节的数字来标识,范围0—2**16—1,0-65535端口的分配是基于一定规则的,而不是随意分配的。

知名端口:

80,分配给http服务的
21,分配给Ftp服务

动态端口(Dynamic Ports)

一般不固定分配某种服务,动态分配.范围:1024-65535

所谓的动态分配,是指一个程序需要网络通信,他向主机申请一个端口,主机从可用的端口号中分配一个供其使用,关闭程序时,同时释放占用的端口.

端口查看:

netstat - ano

Socket简介

不同电脑上进程的标识与识别

用唯一标识来标记一个进程

在电脑上,可以通过用进程号(PID)来唯一标识进程.但是网络上,不可以.需要利用TCP/IP协议族来帮我们解决问题.

用ip可以唯一的标识网络的主机,协议+端口号唯一标识主机中的应用进程.

进程指的是,运行的程序以及运行程序用到的资源的整体就称之为进程.

什么是Socket

Socket(套接字)是进程间通信的一种方式.

与其他进程通信的一个主要不同是:

它能不同主机间的进程间的通信.

现在大多数服务器都是基于Socket来完成通信的

比如:浏览网页,QQ聊天,收发Email.

创建一个socket

import socket
socket.socket(AddressFamily,Type)

参数说明:

  • AddressFamily
    • AF_INET_,internet间进程通信
    • AF_UNIX,同一台机器进程间通信
  • Type 套接字类型
    • SOCK_DGRAM,数据报套接字,主要用于UDP协议
    • SOCK_STREAM,流式套接字,主要用于TCP协议

创建一个TCP SOCKET

server端


import socket
# 创建一个socket对象
serversocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

#主机名
host = socket.gethostname()
#端口号
port = 9994
#绑定端口
serversocket.bind((host,port))
#设置最大连接数,超过后排队
serversocket.listen(5)

while True:
    # 简历客户端连接
    clientsocket,addr = serversocket.accept()
    print("连接地址:\t %s"%(str(addr)))
    msg = "网络编程测试."+"\r\n"
    clientsocket.send(msg.encode("utf-8"))
    clientsocket.close()

client

import socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
host = socket.gethostname()
#设置端口号
port = 9994
#连接服务,指定主机和端口
s.connect((host,port))
#接受小于1024
msg=s.recv(1024)
s.close()
print(msg.decode('utf-8'))

UDP网络程序

UDP—>User Datagram Protocol(用户数据报协议)是一个无连接的简单的面向数据报的运输层协议.

优缺点:

  • 优点:

    • 传输速度快(udp在传输时无需在客户端和服务器端之间建立连接,也无超时重新发送机制)
  • 缺点

    • 不能保证可靠性(udp是一种面向无连接的协议,每个数据都有一个独立的信息,包含完整的源地址或者目的地址,在网络上以任何可能的路径传往目的地.因此,能够到达目的地,以及到达目的地的时间和内容的正确性无法保证)

特点:
UDP是面向无连接的通讯协议;
UDP包括目的端口号和源端口号信息,通讯不需要连接,能够实现广播发送.
UDP数据大小有限制,每个被传输的数据报必须限定64k以内.
UDP是一个不可靠的协议,发送出去的数据报不一定以相同次序到达接收方.

UDP一般多用于多点通信和实时的数据业务.比如:

  • 视频
  • QQ
  • 语言广播等

发送数据

创建一个UDP客户端程序的流程:

1.创建一个客户端套接字

2.发送/接收数据

3.关键套接字

socket和file的区别

  • file针对指定模块进行"打开",“读写”,“关闭”
  • socket针对服务端和客户端socket进行"打开",“读写”,“关闭”

[外链图片转存失败(img-Cn85CreV-1565001017919)(C:\Users\lx\Desktop\rrr111.png)]

[外链图片转存失败(img-jEaV4hkT-1565001017920)(C:\Users\lx\Desktop\6666.png)]


发送,数据

### Socket 对象(内建)方法

函数描述
服务器端套接字
s.bind()绑定地址(host,port)到套接字, 在AF_INET下,以元组(host,port)的形式表示地址。
s.listen()开始TCP监听。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。
s.accept()被动接受TCP客户端连接,(阻塞式)等待连接的到来
客户端套接字
s.connect()主动初始化TCP服务器连接,。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。
s.connect_ex()connect()函数的扩展版本,出错时返回出错码,而不是抛出异常
公共用途的套接字函数
s.recv()接收TCP数据,数据以字符串形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略。
s.send()发送TCP数据,将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。
s.sendall()完整发送TCP数据,完整发送TCP数据。将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。
s.recvform()接收UDP数据,与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址。
s.sendto()发送UDP数据,将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。
s.close()关闭套接字
s.getpeername()返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)。
s.getsockname()返回套接字自己的地址。通常是一个元组(ipaddr,port)
s.setsockopt(level,optname,value)设置给定套接字选项的值。
s.getsockopt(level,optname[.buflen])返回套接字选项的值。
s.settimeout(timeout)设置套接字操作的超时期,timeout是一个浮点数,单位是秒。值为None表示没有超时期。一般,超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作(如connect())
s.gettimeout()返回当前超时期的值,单位是秒,如果没有设置超时期,则返回None。
s.fileno()返回套接字的文件描述符。
s.setblocking(flag)如果flag为0,则将套接字设为非阻塞模式,否则将套接字设为阻塞模式(默认值)。非阻塞模式下,如果调用recv()没有发现任何数据,或send()调用无法立即发送数据,那么将引起socket.error异常。
s.makefile()创建一个与该套接字相关连的文件
import socket
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
Addr = ("192.168.1.149",6555)
sendData = input("其输入要发送的数据:")
udp_socket.sendto(sendData.encode("utf-8"),Addr)

recvData = udp_socket.recvfrom(1024)

print(recvData)
udp_socket.close()

用网络调试助手时,端口号会一直变动.

UDP端口号绑定

一般情况下,在一台电脑上运行的网络程序有很多,为了不与其他的网络程序占用同一个端口号,往往在编程中,udp的端口号一般不绑定

但是如果需要做成一个服务器端的程序的话,是需要绑定的,想想看这又是为什么呢?

如果报警电话每天都在变,想必世界就会乱了,所以一般服务性的程序,往往需要一个固定的端口号,这就是所谓的端口绑定
demo:

import socket
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
local_addr = ("",7788)#ip地址和端口号,ip一般不用写,表示本地ip
udp_socket.bind(local_addr)

recv_data = udp_socket.recvfrom(1024)
print(recv_data[0].decode("gbk"))
udp_socket.close()

总结:

  • 一个udp网络成,可以不绑定端口,此时系统会自动分配一个端口,重新运行此程序,端口可能会生变化
  • 一个udp网络程序,绑定信息(IP,ports).如果绑定成功,那么操作系统用这个端口号来进行区别收到网络数据是否是此进程

TCP简介

tcp协议,传输控制协议(transmission control protocol) ,是一种面向连接,可靠的,基于字节流的传输层,通信协议

TCP通信需要经过创建连接,传输数据,终止连接三个步骤

TCP和UDP的不同点.

  • 面向连接
  • 有序的数据传输
  • 重发丢失数据包
  • 舍弃重复数据包
  • 阻塞/流量控制
  • TCP通信模型,类似"打电话",在通信开始前,一定要建立相关连接,才能发送数据;而udp通信模型,类似"写信,不需要建立相关连接,只需发送数据即可.

TCP特点

面向连接

通信双方必须先建立连接才能进行数据的传输,双方都必须为该连接分配必要的系统内核资源,以管理连接的状态和连接上的传输。

双方间的数据传输都可以通过这个连接进行。

完成数据交换后,双方断开此连接,以释放系统资源。

这种连接是一对一的

因此TCP不适用于广播的应用程序,基于广播的应用程序请使用UDP协议

可靠传输

1)TCP采用发送应答机制

TCP发送的每个报文段都必须得到接收方的应答才认为这个TCP报文段传输成功

2)超时重传

发送端发出一个报文段之后就启动定时器,如果在定时时间内没有收到应答就重新发送这个报文段。

TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。

3)错误校验

TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。

  1. 流量控制和阻塞管理

流量控制用来避免主机发送得过快而使接收方来不及完全收下。
和连接上的传输。

双方间的数据传输都可以通过这个连接进行。

完成数据交换后,双方断开此连接,以释放系统资源。

这种连接是一对一的

因此TCP不适用于广播的应用程序,基于广播的应用程序请使用UDP协议

可靠传输

1)TCP采用发送应答机制

TCP发送的每个报文段都必须得到接收方的应答才认为这个TCP报文段传输成功

2)超时重传

发送端发出一个报文段之后就启动定时器,如果在定时时间内没有收到应答就重新发送这个报文段。

TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。

3)错误校验

TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。

  1. 流量控制和阻塞管理

流量控制用来避免主机发送得过快而使接收方来不及完全收下。

一、综合实战—使用极轴追踪方式绘制信号灯 实战目标:利用对象捕捉追踪极轴追踪功能创建信号灯图形 技术要点:结合两种追踪方式实现精确绘图,适用于工程制图中需要精确定位的场景 1. 切换至AutoCAD 操作步骤: 启动AutoCAD 2016软件 打开随书光盘中的素材文件 确认工作空间为"草图与注释"模式 2. 绘图设置 1)草图设置对话框 打开方式:通过"工具→绘图设置"菜单命令 功能定位:该对话框包含捕捉、追踪等核心绘图辅助功能设置 2)对象捕捉设置 关键配置: 启用对象捕捉(F3快捷键) 启用对象捕捉追踪(F11快捷键) 勾选端点、中心、圆心、象限点等常用捕捉模式 追踪原理:命令执行时悬停光标可显示追踪矢量,再次悬停可停止追踪 3)极轴追踪设置 参数设置: 启用极轴追踪功能 设置角度增量为45度 确认后退出对话框 3. 绘制信号灯 1)绘制圆形 执行命令:"绘图→圆→圆心、半径"命令 绘制过程: 使用对象捕捉追踪定位矩形中心作为圆心 输入半径值30并按Enter确认 通过象限点捕捉确保圆形位置准确 2)绘制直线 操作要点: 选择"绘图→直线"命令 捕捉矩形上边中点作为起点 捕捉圆的上象限点作为终点 按Enter结束当前直线命令 重复技巧: 按Enter可重复最近使用的直线命令 通过圆心捕捉极轴追踪绘制放射状直线 最终形成完整的信号灯指示图案 3)完成绘制 验证要点: 检查所有直线是否准确连接圆心象限点 确认极轴追踪的45度增量是否体现 保存绘图文件(快捷键Ctrl+S)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值