2021/6/3 网络编程-1

'''
网络架构:
C/S架构:client --> server
用户需要下载客户端才能访问服务器
B/S架构:Browser --> server

OSI七层模型
应用层:为应用程序提供网络服务
数据层:数据格式化、加密、解密
会话层:建立、维护、管理会话连接
传输层:建立、委会、管理端到端连接
网络层:IP寻址和路由选择
数据链路层:控制数据帧在物理链路上的传输
物理层:传输比特流

socket:将传输层及以下的数据传输过程封装成一个socket模块
recv()
recvfrom()
以上方法,根本上就是从本地主机的内存中获取数据
对于TCP连接,发送的是流数据,一个TCP连接的开始————一个TCP连接的结束,就可以看作是一个流、
对于UDP连接,发送的是数据包,每一个数据包都会加上IP+PORT,标注来源
所以,对于TCP来说,容易出现粘包问题,对于UDP连接容易出现丢包问题
因为都是从内存中拿取数据,所以数据都是二进制类型
上述两个方法都是阻塞形方法,对于该方法,必须要从内存中获取到值,否则阻塞

因为IP+PORT在socket中都是成对出现的,且都是使用元组括起
对于获取到对端的IP+PORT的格式均为元组,('IP',PORT)

TCP:
TCP服务器步骤:
1. 创建socket连接
socket.AF_INET socket.SOCK_STREAM
2. 绑定本地地址,方便客户端发起请求
s.bind(('ip', port))
3. 设置缓冲区,防止登录用户过多
s.listen(128)
4. 获取客户端的socket连接和IP+PORT
a, b = s.accept()
5. 获取客户端的发来数据
a.recv(1024).decode('utf8')
6. 向客户端发送数据
a.send(''.encode('utf8'))
7. 关闭与客户端建立的连接
a.close()
8. 关闭本地socket连接
s.close()
TCP 客户端:
1. 创建socket连接
socket.AF_INET socket.SOCK_STREAM
2. 指定建立TCP连接的服务器IP+PORT
s.connect(('IP', PORT))
3. 向服务器发送数据
s.send(''.encode('utf8'))
4. 接收服务器发来的数据
s.recv(1024).decode('utf8')
5. 关闭本地socket连接
s.close()
UDP服务器:
1. 创建socket连接
socket.AF_INET socket.SOCK_DGRAM
2. 绑定本地IP+PORT
s.bind(('IP', PORT))
3. 接收来自UDP客户端的信息和信息中的IP+PORT
a, b = s.recvfrom(1024)
a.decode('utf8')
b --> ('IP', PORT)
4. 向UDP客户端发送数据
s.sendto(''.encode('utf8', b))
5. 关闭本地socket连接
s.close()
UDP客户端
1. 创建socket连接
socket.AF_INET socket.SOCK_DGRAM
2. 指定UDP服务器的IP+PORT(可选操作)
s.connect(('IP',PORT))
使用connect绑定服务器的IP+PORT后,后续只需要使用send方法即可发送数据
也可以不适用connect方法,后续只需要一直使用sendto方法来发送数据即可

3. 获取UDP服务器发来的数据
a, b = s.recvfrom(1024)
print(a.decode('utf8'))
4. 向UDP服务端发送数据
s.send(byte)
s.sendto(byte, ('IP', port))
5. 关闭socket连接
s.close()

PS:
建立TCP连接后,不能发送空数据
因为对于操作系统来说,空数据是认为不存在的,不会发送给对端
而对端会因为没有收到数据,从而在recv方法阻塞
而本段也会因为对端的阻塞,从而最终阻塞到recv的执行

实现TCP并发
from socketserver import BaseRequestHandler, ThreadingTCPServer
handle
a, b = self.request, self.client_address
while True:
try:
data = a.recv(1024).decode('utf8')
if len(data) == 0:
break
a.send(data.upper().encode('utf8'))
except Exception as e:
break
a.close()

s = ThreadingTCPServer(('ip', port), class_name)
s.serve_forever()

实现UDP并发

from socketserver import BaseRequestHandler, ThreadingTCPServer

'''
posted @ 2021-06-03 23:47  zzwYYYYYY  阅读(42)  评论(0)    收藏  举报