python网络编程教程,python网络编程学习笔记_第1页
python网络编程教程,python网络编程学习笔记_第2页
python网络编程教程,python网络编程学习笔记_第3页
python网络编程教程,python网络编程学习笔记_第4页
python网络编程教程,python网络编程学习笔记_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

网络通信的概念

简单来说,网络是用物理链路将各个孤立的工作站或主机相连在一起,组成数

据链路,从而达到资源共享和通信的目的。

使用网络的目的,就是为了联通多方然后进行通信,即把数据从一方传递给另

外一方。

前面的学习编写的程序都是单机的,即不能和其他电脑上的程序进行通信。为

了让在不同的电脑上运行的软件,之间能够互相传递数据,就需要借助网络的

功能。

使用网络能够把多方链接在一起,然后可以进行数据传递

所谓的网络编程就是,让在不同的电脑上的软件能够进行数据传递,即

进程之间的通信

路由器A路由器B

ip地址

生活中的地址指的就是,找到某人或某机关或与其通信的指定地点。在网络编

程中,如果一台主机想和另一台主机进行沟通和共享数据,首先要做的第一件

事情就是要找到对方。在互联网通信中,我们使用IP地址来查询到各个主机。

怎么传过去?

to:张三

content:来吃晚饭

ip地址:用来在网络中标记一台电脑,比如192.168.L1;在本地局

域网上是唯一的。

ip地址的分类

每一个IP地址包括两部分:网络地址和主机地址。IP地址通常由点分十进制(例

如:)的方式来表示JP地址要和子网掩码(用来区分网络位和主机

位)配合使用。

网络号7位____________________主位

___________________主机号J的

*嗔?主机号.8位

c类■■■■■■■■I

OOOQililiimi

E类二巾应工IIIIIIIIII

图1的地址的类别

A类地址

一个A类IP地址由1字节的网络地址和3字节主机地址组成,网络地址的最

高位必须是“0”,

地址范围:-54

子网掩码:

二进制表示为:00000001000000000000000000000001-01111110

111111111111111111111110

可用的A类网络有126个,每个网络能容纳1677214个主机

B类地址

一个B类IP地址由2个字节的网络地址和2个字节的主机地址组成,网络地

址的最高位必须是“10”,

地址范围:128.1255.255.254

子网掩码:

二进制表示为:10000000000000010000000000000001-10111111

111111111111111111111110

可用的B类网络有16384个,每个网络支持的最大主机数为256的2次方

-2=65534台。

C类地址

网络通信方式

直接通信

说明

1.如果两台电脑之间通过网线连接是可以n接通信的,但是需要提

前设置好ip地址以及网络掩码

2.并且ip地址需要控制在同一网段内,例如一台为另

一台为则可以进行通信

使用集线器通信

说明

1.当有多态电脑需要组成•个网时,那么可以通过集线器(Hub)

将其链接在一起

2.一般情况卜.集线器的接U较少

3.集线器有个缺点,它以广播的方式进行发送任何数据,即如果集

线器接收到来自A电脑的数据本来是想转发给B电脑,如果此时

它还连接着另外两台电脑C、D,那么它会把这个数据给每个电

脑都发送一份,因此会导致网络拥堵

使用交换机通信

说明

1.克服了集线器以广播发送数据的缺点,当需要广播的时候发送广

播,当需要单播的时候又能够以单播的方式进行发送

2.它已经替代了之前的集线器

3.企业中就是用受比机来完成。态电脑设备的链接成网络的

使用路由器连接多个网络

复杂的通信过程

说明

1.在浏览恭中输入•个网址时,需要将它先解析出ip地址来

2.当得到ip地址之后,浏览器以tcp的方式3次握手链接服务器

3.以tcp的方式发送http协议的请求数据给服务器

4.服务器tcp的方式向应http协议的应答数据给浏览器

总结

•MAC地址:在设备与设备之间数据通信时用来标记收发双方(网卡的

序列号)

•IP地址:在逻辑上标记一台电脑,用来指引数据包的收发方向(相当于

电脑的序列号)

•网络掩码:用来区分ip地址的网络号和主机号

•默认网关:当需要发送的数据包的目的ip不在木网段内时,就会发送给

默认的一台电脑,成为网关

•集线器:已过时,用来连接多态电脑,缺点:每次收发数据都进行广播,

网络会变的拥堵

•交换机:集线器的升级版,有学习功能知道需要发送给哪台设备,根据

需要进行单播、广播

•路由器:连接多个不同的网段,让他们之间可以进行收发数据,每次收

到数据后,ip不变,但是MAC地址会变化

•DNS:用来解析出IP(类似电话簿)

•http服务器:提供浏览器能够访问到的数据

端口

端口就像一个房子的门,是出入这间房子的必经之路。如果一个程序需要收发

网络数据,那么就需要有这样的端口

在linux系统中,端口可以有65536(2的16次方)个之多!

既然有这么多,操作系统为了统一管理,所以进行了编号,这就是端口号

端口号

端口是通过端口号来标记的,端口号只有整数,范围是从。到65535.端口号

不是随意使用的,而是按照一定的规定进行分配。端口的分类标准有好几种,

我们这里不做详细讲解,只介绍一下知名端口和动态端口。

知名端口号

知名端口是众所周知的端口号,范围从。到1023,以理解为,一些常用的功能

使用的号码是估计的,好比电话号码110、10086、10010一样。一般情况下,

如果一个程序需要使用知名端口的需要有root权限。

动态端口号

动态端口的范围是从1024到65535

之所以称为动态端口,是因为它一般不固定分配某种服务,而是动态分配「

动态分配是指当一个系统程序或应用程序程序需要网络通信时,它向主机申请

一个端口,主机从可用的端口号中分配一个供它使用。

当这个程序关闭时,同时也就释放了所占用的端口号。

端口号作用

我们知道,一台拥有IP地址的主机可以提供许多服务,比如HTTP(万维网

服务)、FTP(文件传输)、SMTP(电子邮件)等,这些服务完全可以通过

1个IP地址来实现。那么,主机是怎样区分不同的网络服务呢?显然不能只靠

IP地址,因为IP地址与网络服务的关系是一对多的关系。实际上是通过“IP地

址+端口号”来区分不同的服务的。需要注意的是,端口并不是一一对应的。

比如你的电脑作为客户机访问一台WWW服务器时,WWW服务器使用“80”

端口与你的电脑通信,但你的电脑则可能使用“3457”这样的端口。

socket简介

1.不同电脑上的进程之间如何通信

首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在1台电脑

上可以通过进程号(PID)来唯一标识一个进程,但是在网络中这是行不通的。

其实TCP/IP协议族己经帮我们解决了这个问题,网络层的“ip地址”可以唯一

标识网络中的主机,而传输层的“协议+端口”口」以唯一标识主机中的应用在程

(进程)。这样利用ip地址,协议,端口就可以标识网络的进程了,网络中

的进程通信就可以利用这个标志与其它进程进行交互。

注意:

所谓进程指的是:运行的程序以及运行时用到的资源这个整体称

之为进程(在讲解多任务编程时进行详细讲解)

所谓进程间通信指的是:运行的程序之间的数据共享

2.什么是socket

socket(简称套接字)是进程间通信的一种方式,它与其他进程间通信的一个主

要不同是:

它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于

Socket来完成通信的

例如我们每天浏览网页、QQ聊天、收发email等等。

3.创建socket

在Python中使用socket模块的函数socket就可以完成:

importsocket

socket.socket(AddressFamily,Type)

说明:

函数socket.socket创建一个socket,该函数带有两个参数:

AddressFamily:可以选择AF_INET(用于Internet进程间通信)或

者AF_UNIX(用于同一台机器进程向施信),实际工作中常用AFJNET

•Type:套接字类型,可以是SOCK_STREAM(流式套接字,主要用于

TCP协议)或者SOCK_DGRAM(数据板套接字,主要用于UDP协议)

创建一个tcpsocket(tcp套接字)

importsocket

#创建tcp的套接字

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

#...这里是使用套接字的功能(省略)...

#不用的时候,关闭套接字

s.close()

创建一个udpsocket(udp套接字)

importsocket

#创建udp的套接字

s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#...这,是使丘氏接字的功能(省略)…#

不用的时候,关闭套接字

s.close()

说明

套接字使用流程与又件的使用流程很类似

1.创建套接字

2.使用套接字收/发数据

3.关闭套接字

UDP协议

UDP是UserDatagramProtocol的简称,中文名是用户数据报协议。在通

信开始之前,不需要建立相关的链接,只需要发送数据即可,类似于生活中,

“写信”。

UDP通信模型

1.udp网络程序■发送数据

创建一个基于udp的网络程序流程很简单,具体步骤如下:

1.创建客户端套接字

2.发送/接收数据

3.关闭套接字

importsocket#1.创建•介UDP的socket连接

灰口〔1谕入代.内齐

udp_socket=socket.socket(socket.AF_INET?socket.SOCK_DGRAM)#2.1i'

data=input「请输入内容,)#3.准备接收方的地址和5口号

addr=(',,808。)#4.将用户的输入内容进行编码,并发送到指定地址和端口

udp_socket.sendto(data.encode('gbk'),addr)#5.接收/的消息,并指定接受的字节大小

recv_data=udp_socket.recvfrom(1024)#6.接收到的对象是一个元组,元组里有两个元素

print(rccv_data)#6.1元N的第一个数对显示接收到内容

print(recv.data[0].decode(,gbk•))#6.2元组里的第二个数据显示发,的地址和

print(recv_data[l])#7.关闭socket连接

udp_socket.close()

Run:socket通信

/usr/local/bin/python3.7/Users/jiangwei/Desktop/Test/socket通信.py

请铺入内容

nihao

5s5

,一Processfinishedwithexitcode0

运行网络调试助手,查看运行效果:

1.udp网络程序■端口问题

会变的端口号

重新运行多次脚本,然后在“网络调试助手”中,看到的现象如下:

说明:

每重新运行一次网络程序,上图中红圈中的数字,不一样的原因在于,

这个数字标识这个网络程序,当重新运行时,如果没有确定到底用哪个,系统

默认会随机分配

记住一点:这个网络程序在运行的过程中,这个就唯一标识这个程序,

所以如果其他电脑上的网络程序如果想要向此程序发送数据,那么就需要向这

个数字(即端口)标识的程序发送即可

2.UDP绑定信息

<1>.绑定信息

一般情况下,在一台电脑上运行的网络程序有很多,为了不与其他的网络程序

占用同一个端口号,往往在编程中,udp的端口号一般不绑定但是如果需要

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

果报警电话每天都在变,想必世界就会乱了,所以一般服务性的程序,往往需

要一个固定的端口号,这就是所谓的端口绑定。

<2>.绑定示例

fromsocketimport♦

#1.创建套接字

udp_socket=socket(AF_INET,SOCK_DGRAM)

#2.绑定本地的相关信息,如果一个网络程序不绑定,则系统会随机分配

local.addr=(*',7788)*ip地址和端口号,ip一般不用写,表示本机的任何一、ip

udp_socket.bind(local_addr)

#3.等待接收对方发送的数据

recv_data=udp_socket.recvfrom(1024)#1024去小木次接收的最大寸:0数

#4.显示接收到的数据

print(recv_data[0].decode('gbk'))

#5.关闭套接字

udpsocket.close()

运行结果:

C—Qpython($)ubuntu:*/Desktop芋网络请试助手宣叵因

p^thonQubuntu:*/Desktop$python303.py

pythonQubuntu:*/Desktop$

接米设11发送设置

向指定的端口发送数据

□8HR方向文件

□a^»«DWI

□十六进制显示目标口培址192168236128目

□M停覆收显示可以的

।保存数寤]交显示।

伏充建立UDPiSlS成功发送计教72强收计数152££11A

v3>.总结

一个udp网络程序,可以不绑定,此时操作系统会随机进行分配一个端

口,如果重新运行此程序端口可能会发生变化

一个udp网络程序,也可以绑定信息(ip地址,端口号),如果绑定成

功,那么操作系统用这个端口号来进行区别收到的网络数据是否是此进程的

TCP协议

TCP协议,传输控制协议(英语:TransmissionControlProtocol,缩写为

TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF

的RFC793定义。

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

TCP通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据,

类似于生活中,”打电话工

TCP特点

1.面向连接

通信双方必须先建立连接才能进行数据的传输,双方都必须为该连接分配必要

的系统内核资源,以管理连接的状态和连接上的传输。

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

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

这种连接是一对一的,因此TCP不适用于广播的应用程序,基于广播的应用

程序请使用UDP协议。

2.可靠传输

1)TCP采用发送应答机制

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

成功

2)超时重传

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

重新发送这个报文段。

TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接

收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的

确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那

么对应的数据包就被假设为己丢失将会被进行重传。

3)错误校验

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

和。

4)流量控制和阻塞管理

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

3.TCP与UDP的区别

面向连接(确认有创建三方交握,连接己创建才作传输。)

有序数据传输

重发丢失的数据包

舍弃重复的数据包

无差错的数据传输

阻塞/流量控制

TCP通信模型

TCP通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据

服务器和客户端

服务器,也称伺服器,是提供计算服务的设备。曰于服务器需要响应服务请求,

并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。客

户端(Client)也被称为用户端,是指与服务器相对应,为客户提供本地服务

的程序。客户端服务器架构又被称为主从式架沟,简称C/S结构,是一种网

络架构,它把客户端与服务器分开来,一个客户端软件的实例都可以向一个服

务器或应用程序服务器发出请求。

该应用服务器部

署了很多的中间

件负责负载均衡

和路由的功能

负责具体的业务

处理。集群服务

TCP客户端

相比较于TCP服务端,忙p的客户端要简单很多,如果说服务器端是需要自己

买手机、查手机卡、设置铃声、等待别人打电话流程的话,那么客户端就只需

要找一个电话亭,拿起电话拨打即可,流程要少很多。

示例代码:

fromsocketimport

#创建socket

tcp_client_socket=socket(AF_INET,SOCK_STREAM)

#口的信息

server_ip=input("请输入服务器ip:")

server_port=int(input("请输入服务器port:"))

#链接服务器

tcp_client_socket.connect((server_ip,server_port))

#提示用户输入数据

send_data=input(”请输入要发送的数据:”)

tcpclientsocket.send(senddata.encode("gbk"))

#接收对方发送过来的数据,品大接收1024个字节

recvData=tcp_client_socket.recv(1024)

print(,接收到的数据为:,,recvData.decode('gbk*))

#关闭套接字

tcp_client_socket.close()

运行流程

输入服务器ip:7

请输入服务器port:8080

请输入要发送的数据:你好啊

接收到的数据为:我很好,你呢

TCP服务端

在程序中,如果想要完成一个tcp服务器的功能,需要的流程如下:

1.socket创建一个套接字

2.bind绑定ip和port

3.listen使套接字变为可以被动链接

4.accept等待客户端的链接

5.recv/send接收发送数据

示例代码:

fromsocketimport*

#创建socket

tcp_serversocket=socket(AFINET,SOCKSTREAM)

#木地信息

address=(",7788)

#绑定

tcp_server_socket.bind(address)

#使用socket创建的套接字默认的属性是主动的,使用listen将其变为被动

的,这样就可以接收别人的链接了

tcp_server_socket.Iisten(128)

#如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客

户端服务

#client_socket用来为这个客户端服务

#tcp_server_socket就可以省下来专门等待其他新客户端的链接

client_socket,clientAddr=tcp_server_socket.accept()

#接收对方发送过来的数据

recv_data=client_socket.recv(1024)#接收1024个字节

print('接收到的数据为:',recv_data.decode,gbk))

#发送一些数据到客户端

client_socket.send("thankyou!,'.encode('gbk'))

#关闭为这个客户端服务的套接字,只要关闭了,就意味着为不能再为这个客

户端服务了,如果还需要服务,只能再次重新连接

client_socket.close()

TCP注意事项

1.tcp服务器一般情况下都需要绑定,否则客户端找不到这个服务器

2.tcp客户端一般不绑定,因为是主动链接服务器,所以只要确定好服务

器的ip、port等信息就好,本地客户端可以随机

3.tcp服务器中通过listen可以将socket创建出来的主动套接字变为被动

的,这是做tcp服务器时必须要做的

4.当客户端需要链接服务器时,就需要使用connect进行链接,udp是不

需要链接的而是直接发送,但是tcp必须先链接,只有链接成功才能通信

5.当一个tcp客户端连接服务器时,服务器端会有1个新的套接字,这个

套接字用来标记这个客户端,单独为这个客户端服务

6.listen后的套接字是被动套接字,用来接收新的客户端的链接请求的,

而accept返回的新套接字是标记这个新客户端的

7.关闭listen后的套接字意味着被动套接字关闭了,会导致新的客户端不

能够链接服务器,但是之前已经链接成功的客户端正常通信。

8.关闭accept返回的套接字意味着这个客户端已经服务完毕

9.当客户端的套接字调用close后,服务器端会recv解堵塞,并且返回的

长度为0,因此服务器可以通过返回数据的长度来区别客户端是否已经下线

文件下载案例

TCP服务器端:

fromsocketimport*

defget_file_content(file_name):

皿嚎取文件的内容…

try:

withopen(file_name,"rbn)asf:

content=f.read()

returncontent

except:

print("没有下载的文件:%s"%file_name)

defmain():

#创建socket

tcp_server_socket=socket(AFJNET,SOCKSTREAM)

#未地信百~~

address=(“,7890)

#绑定本地信息

tcp_serversocket.bind(address)

#将主动血•妾字变为被动套接字

tcp_server_socket.listen(128)

whileTrue:

#

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论