计算机的计量单位
int类型的能表示的范围:2的7次方减一
计算机表示范围为2的8次方
1个小格是一个比特位
8个小格8个比特位是一个字节 1b
1024个字节是1kb
1024kb是1mb
1024mb是1g
基于socket的udp
#服务端
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('xxx'.encode('utf8'),addr)
特点:
不需要建立连接,不需要确认
数据报协议:可以传空
基于socketserver的服务端
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()
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()