欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python之网络编程

程序员文章站 2022-04-04 15:30:27
一、引子 问题1: 如果你写了两个python文件a.py和b.py,分别去运行,那你就会发现,这两个python文件分别运行的很好。但是如果两个程序之间互相传输数据,那你要怎么做呢? 问题2: 如果a.py和b.py分别在不同电脑上的时候,互相传递数据,你要怎那么做呢? 类似的机制有计算机网盘,q ......

一、引子

问题1:如果你写了两个python文件a.py和b.py,分别去运行,那你就会发现,这两个python文件分别运行的很好。但是如果两个程序之间互相传输数据,那你要怎么做呢?

Python之网络编程

问题2:如果a.py和b.py分别在不同电脑上的时候,互相传递数据,你要怎那么做呢?

类似的机制有计算机网盘,qq等等。我们可以在我们的电脑和别人聊天,可以在自己的电脑上向网盘中上传,下载数据。这些都是两个程序在通信。

二、软件开发架构

我们了解的涉及到两个程序之间通讯的应用大致可以分为两种:

  1. 应用类:qq、微信,网盘,优酷等都属于需要安装的桌面应用
  2. web类:比如百度、知乎、博客园等使用浏览器访问就可以直接使用的应用

这些应用的本质其实都是两个程序之间的通讯。而这两个分类又对应了两个软件开发的架构~

C/S架构

C/S即:Client与Server ,中文意思:客户端与服务器端架构,这种架构也是从用户层面(也可以是物理层面)来划分的。

这里的客户端一般泛指客户端应用程序EXE,程序需要先安装后,才能运行在用户的电脑上,对用户的电脑操作系统环境依赖较大。

Python之网络编程

B/S架构

B/S即:Browser与Server,中文意思:浏览器端与服务器端架构,这种架构是从用户层面来划分的。

Browser浏览器,其实也是一种Client客户端,只是这个客户端不需要大家去安装什么应用程序,只需在浏览器上通过HTTP请求服务器端相关的资源(网页资源),客户端Browser浏览器就能进行增删改查。

Python之网络编程

三、网络基础

一个程序如何在网络上找到另一个程序?

首先,程序必须要启动,其次,必须有这台机器的地址,我们都知道我们人的地址大概就是国家\省\市\区\街道\楼\门牌号这样字。那么每一台联网的机器在网络上也有自己的地址,它的地址是怎么表示的呢?

就是使用一串数字来表示的,例如:1.0.0.1

接下来需要普及下知识了:

  1. 什么是IP地址

IP地址是指互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),是IP Address的缩写。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。

IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节)。IP地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数。例:点分十进IP地址(100.4.5.6),实际上是32位二进制数(01100100.00000100.00000101.00000110)。

  1. 什么是端口

"端口"是英文port的意译,可以认为是设备与外界通讯交流的出口。

ps:因此ip地址精确到具体的一台电脑,而端口精确到具体的程序。

osi五层模型详解

四、套接字(socket)的发展史

套接字起源于20世纪70年代加利福大学伯克利分校版本的Unix,即人们所说的BSD Unix。因此,有时人们也把套接字称为"伯克利套接字”或“BSD 套接字"。一开始,套接字被设计用在同一台主机上多个应用程序之间的通讯。这也被称进程间通讯或IPC。套接字有两种(或者称为有两个种族),分别是基于文件型的和基于网络型的。

  1. 基于文件类型的套接字家族

套接字家族的名字:AF_UNIX

unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信

  1. 基于网络类型的套接字家族

套接字家族的名字:AF_INET

(还有AF_INET6被用于ipv6,还有一些其他的地址家族,不过,他们要么是只用于某个平台,要么就是已经被废弃,或者是很少被使用,或者是根本没有实现,所有地址家族中,AF_INET是使用最广泛的一个,python支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我么只使用AF_INET)

五、tcp协议和udp协议

TCP(Transmission Control Protocol)可靠的、面向连接的协议(eg:打电话)、传输效率低全双工通信(发送缓存&接收缓存)、面向字节流。使用TCP的应用:Web浏览器;电子邮件、文件传输程序。

UDP(User Datagram Protocol)不可靠的、无连接的服务,传输效率高(发送前时延小),一对一、一对多、多对一、多对多、面向报文,尽最大努力服务,无拥塞控制。使用UDP的应用:域名系统 (DNS);视频流;IP语音(VoIP)。

我知道说这些你们也不懂,直接上图。

Python之网络编程

六、套接字(socket)初使用

基于TCP协议的socket

tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端

server端

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(('127.0.0.1',8080))   # 把地址绑定到套接字
server.listen(5)         # 监听链接
conn,addr = server.accept()   # 接受客户端链接
mgs = conn.recv(1024)   # 接收客户端信息
print(mgs)
conn.send(b'hi')    # 想客户端发送消息
conn.close()     # 关闭客户端套接字
server.close()    # 关闭套接字服务器

client端

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import socket
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)   # 创建客户端套接字

client.connect(('127.0.0.1',8080))  # 尝试连接服务器
client.send(b'hello')    # 向服务器发送消息
res = client.recv(1024)    # 对话(接收)
print(res)
client.close()

基于UDP协议的socket

udp是无链接的,启动服务之后可以直接接受消息,不需要提前建立链接

简单使用

server端

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket

server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)  # 创建一个服务器的套接字
server.bind(('127.0.0.1',8080))   # 绑定服务器套接字
mgs,addr = server.recvfrom(1025)  # 接收
print(mgs)
server.sendto(b'hi',addr)    # 发送
server.close()

client端

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket
ip_port=('127.0.0.1',8080)
udp_sk=socket.socket(type=socket.SOCK_DGRAM)
udp_sk.sendto(b'hello',ip_port)
back_msg,addr=udp_sk.recvfrom(1024)
print(back_msg.decode('utf-8'),addr)

socket参数详解

1. family   地址系列应为AF_INET(默认值),AF_INET6,AF_UNIX,AF_CAN或AF_RDS。(AF_UNIX 域实际上是使用本地 socket 文件来通信)
2. type 套接字类型应为SOCK_STREAM(默认值),SOCK_DGRAM,SOCK_RAW或其他SOCK_常量之一。
   SOCK_STREAM 是基于TCP的,有保障的(即能保证数据正确传送到对方)面向连接的SOCKET,多用于资料传送。 
   SOCK_DGRAM 是基于UDP的,无保障的面向消息的socket,多用于在网络上发广播信息。
3. proto    协议号通常为零,可以省略,或者在地址族为AF_CAN的情况下,协议应为CAN_RAW或CAN_BCM之一。
4. fileno   如果指定了fileno,则其他参数将被忽略,导致带有指定文件描述符的套接字返回。与socket.fromfd()不同,fileno将返回相同的套接字,而不是重复的。这可能有助于使用socket.close()关闭一个独立的插座。