python 网络编程
目录
软件开发架构
互联网协议
Socket
SockerServer
软件开发架构
问题
1. 在同一个机器中 a.py 读取 b.py,该如何做?
只要在a.py文件使用open()方法即可。
2. 那在不同的机器中,机器A中的python文件如何读取机器B中的python文件?
把B中文件传入A中?
c/s架构
c/s: client端或客户端;server端或服务端。c/s端是从用户层面划分的,
这里的client端一般指安装在设备上的应用。
b/s架构
b/s: browser端或浏览器端;server端或服务端。b/s也是c/s的一种。
这里的b指浏览器。
数据请求流程
c——>network——>s
互联网协议
1. 实现远程网络通信的必要条件
1.1 物理连接介质。网线即为物理连接介质。数据在网线中传递。
1.2 一套公共的标准或协议。按照协议来解析数据。
osi七层、tcp/ip五层、tcp/ip四层
ios七层 | tcp/ip五层 | tcp/ip四层 |
应用层 | 应用层 | 应用层 |
表示层 | ||
会话层 | ||
传输层 | 传输层 | 传输层 |
网络层 | 网络层 | 网络层 |
数据链路层 | 数据链路层 | 网络接口层 |
物理连接层 | 物理连接层 |
说明
物理连接层:基于电信号传输0101的二进制数据。
数据链路层:
1. 规定信号的分组方式。每组表示一个文字。
2. 网卡:每个网卡在生产出来后都是独一无二的。网卡编号由12位16进制数组成,前六位是厂商编号,后六位是流水线编号。
3. 以太网:1和2合起来就是以太网协议。
4. 交换机:基于以太网协议,进行局域网通信。
网络层:
ip协议,每台接入互联网的电脑都有一个ip,ip地址是动态分布的。
IPv4是由点分四位十进制组成,最小为:0.0.0.0;最大为255.255.255.255
传输层:
TCP协议和UDP协议都是基于端口工作的协议。
TCP:基于TCP协议传输,创建双向通道。
TCP安全:
TCP协议有反馈机制,发送信息给对方之后,必须接收到对方回应的信息后才会删除内存中的东西,
没有接收到信息,就会在规定的时间内每隔一段时间发送一次信息,超时后才会删除内存中的信息。
三次握手:
客户端向服务端发送一个syn = n 的请求,服务端回应请求ack = n+1,
同时向客户端发送一个syn = k 请求,客户端回应ack = k+1,建立连接。
四次挥手:
客户端向服务端发送一个syn = i 的请求,服务端回应请求ack = i+1,
服务端检查是否还有一些数据没有发送过去,有就发送过去,
然后服务端向客服端发送一个syn = o 的请求,客户端回应一个ack = o+1,断开连接。
端口(port):
计算机和计算机之间的通信其实就是计算机上的应用程序和应用程序的通信;端口是唯一标识计算机上某个应用程序。
端口使用:建议我们使用端口号为:8000之后的端口号。
各种应用端口:
0~1024是操作系统默认的端口号
MySQL默认的端口号是:3306
Redis默认的端口号是:6379
djingo默认的端口号:8000
flask默认的端口号是:5000
应用层
1. http和https协议
2. FTP协议
socket
1. socket是应用层与TCP/IP协议通信的中间软件抽象层,它是一组接口。
在设计模式中,socket其实是一个门面模式,它把复杂的TCP/IP协议隐藏在socket接口后面,
这对用户来说,就是一组简单的接口,让socke组织数据,以符合指定的协议。
2. socket又称“套接字”,应用程序通常通过“套接字”向网络发出请求或者应答网络请求,
使主机或者一台计算机上的进程间可以通讯。
TCP服务端
import socket from socket import SOL_SOCKET,SO_REUSEADDR # TCP服务端 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建套接字 s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加 s.bind(('127.0.0.1', 9000)) # 绑定套接字到本地IP与端口 # 设置最大连接数,超过后排队 s.listen(5) # 开始监听连接 while True: # 建立客户端连接 conn, addr = s.accept() # 进入循环,不断接受客户端的请求 print("connet addr: %s" % str(addr)) ret = conn.recv(1024) print(ret) conn.send(b'world') # 发送给对方数据 conn.close() # 传输完毕后,关闭套接字
TCP客户端
import socket # TCP 客户端 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建套接字 s.connect(('127.0.0.1', 9000)) # 连接远端地址 s.send(b'hello') # 连接后发送数据 msg = s.recv(1024) # 接受数据 print(msg.decode("utf-8")) s.close() # 关闭套接字
UDP服务端
import socket s = socket.socket(type=socket.SOCK_DGRAM) #创建一个服务器的套接字 s.bind(('127.0.0.1',9000)) #绑定服务器套接字 msg,addr = s.recvfrom(1024) print(msg) s.sendto(b'hi',addr) # 对话(接收与发送) s.close() # 关闭服务器套接字
UDP客服端
import socket ip_port=('127.0.0.1',9000) s=socket.socket(type=socket.SOCK_DGRAM) s.sendto(b'hello',ip_port) back_msg,addr=s.recvfrom(1024) print(back_msg.decode('utf-8'),addr)
粘包现象(只存在TCP中)
产生粘包原因
解决粘包