第一阶段:Python开发基础 day34 网络编程之sockerserver详细讲解
一、基于socket的udp
#计算机的计量单位
# int类型的能表示的范围:2的7次方-1
# 2的8次方
# 1 个小格是一个比特位
#8个小格8个比特位是一个字节 1b
#1024个字节是1kb
#1024kb是1mb
#1024mb是g
import socket
soc = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
soc.bind(('127.0.0.1',8009))
data,addr=soc.recvfrom()
soc.sendto('sss'.encode('uft-8'),addr)
'''
#特点:
-不需要建立连接,不需要确认
-数据报协议:可以传空
'''
二、基于socket的udp
import socketserver
class Mytcp(socketserver.BaseRequestHandler):
def handle(self):
pass
if __name__ == '__main__':
#得到一个对象
server=socketserver.ThreadingTCPServer(('127.0.0.1',8008),Mytcp)
server.serve_forever()
#udp服务端
# import socketserver
#
# class Mytcp(socketserver.BaseRequestHandler):
# def handle(self):
# pass
#
# if __name__ == '__main__':
# #得到一个对象
# server=socketserver.ThreadingUDPServer(('127.0.0.1',8008),Mytcp)
# server.serve_forever()
三、socketserver源码分析
import socketserver
class MyTcp(socketserver.BaseRequestHandler):
def handle(self):
# self.server ThreadingTCPServer的对象:
# self.request conn
#self.client_address addr
pass
if __name__ == '__main__':
server=socketserver.ThreadingTCPServer(('127.0.0.1',8001),MyTcp)
# server=socketserver.ThreadingUDPServer(('127.0.0.1',8001),MyTcp)
'''
1 ThreadingTCPServer实例化:走__init__方法
-ThreadingTCPServer(ThreadingMixIn, TCPServer)的__init__方法,没有,走的父类:TCPServer(BaseServer)的__init__
-TCPServer(BaseServer)的__init__又调用了父类的__init__
-赋值操作:self.server_address = server_address
self.RequestHandlerClass = RequestHandlerClass
-数据放到谁当中了?放到了server这个对象中
-socket.bind()
-socker.listen()
2 server.serve_forever()
-一堆代码不需要要管:self._handle_request_noblock
-request, client_address = self.get_request()
-self.get_request()在Tcpserver这个类: self.socket.accept()
- self.process_request(request, client_address):ThreadingMixIn类的process_request
-开启线程执行ThreadingMixIn类的process_request_thread,执行了finish_request(request, client_address, self) 在 BaseServer 类中
-request :就是咱的连接对象,conn
-client_address 客户端ip和端口
-self:server对象,实例化得到的server对象
-实例化RequestHandlerClass得到一个对象:会走__init__方法
-RequestHandlerClass没有,走的BaseRequestHandler类的__init__
-会执行handle方法,通信逻辑
'''
server.serve_forever()
四、网络编程汇总
'''
网络是什么:链接介质+协议
协议:osi7层
5层协议:
-物理层 01000101010
-数据链路层:做分组:数据报/数据帧 mac
-网络层:ip 通过ip得到mac地址---arp协议 mac地址学习
-传输层:tcp/udp 三次握手四次挥手,可靠传输
-应用层:写的程序都是应用层,基于socket(基于网络和传输抽象出来的)/http协议/邮件
socket编写tcp的客户端和服务端:
-传输文件:自己定制了协议
-粘包问题终极解决方案
-struct模块先把头的长度包成四个字节,发送四个字节
-发送头
-发送内容
-接收端:
-接收4个字节,解除头部长度
-接收头部,取出数据长度
-接收数据长度
socket编写udp的客户端和服务端
-不需要建立连接,传输不可靠,数据报协议(自己有头)
socketserver写支持并发的服务端
'''
#with 上下文管理器
# with open('a.avi','rb') as f:
# for line in f:
# print(line)
class Open():
def __enter__(self):
print('xxxxx')
pass
def __exit__(self, exc_type, exc_val, exc_tb):
print('yyyyy')
pass
with Open() as f:
#代码
f.name='xxx'