socket模块:
客户端:CS架构, client -> server
浏览器:BS架构, browser -> server
网络通信本质:传输字节
doc命令查看ip地址:ipconfig / ifconfig(windows系统 / mac系统)
tcp协议和udp协议
TCP(Transmission Conteol Protocol)可靠的,面向连接的协议(eg打电话),传输效率低全双工通信(发送缓存&接收缓存),面向字节流.使用TCP的应用:Web浏览器;电子邮件,文件传输程序.
UDP(User Datagram Protocol)不可靠的,无连接的服务,传输效率高(发送前延时小),一对一,一对多,多对一,多对多,面向报文,尽最大努力服务,无拥塞控制.使用UDP的应用:域名系统(DNS);视频流;IP语音(VoIP).
服务端:
import socket
# 创建服务端socket对象 server = socket.socket()
# 绑定IP和端口 server.bind(('192.168.13.88',5001))
# 后边可以等5个人 server.listen(5) while 1:
conn,addr = server.accept() # 等待客户端来连接,如果没人来就傻傻的等待。
#字节类型 while 1: data = conn.recv(1024) # 一次性最多拿1024字节。 if data == b"exit": break response = data + b'在北京' conn.send(response) # 服务端通过连接对象给客户端回复了一个消息。 conn.close() # 与客户端断开连接
客户端:
import socket
# 创建服务端socket对象 sk = socket.socket()
# 绑定IP和端口 sk.connect(('192.168.13.88',5001)) while 1: name = input('请输入姓名:') sk.send(name.encode('utf-8')) # 链接上服务端后,向服务端发送消息 if name == 'exit': break response = sk.recv(1024) # 等待服务端给他发送消息 print(response.decode('utf-8')) sk.close() # 关闭自己
黏包:
同时执行多条命令之后,得到的结果很可能只有一部分,在执行其他命令的时候又接收到了之前执行的另外一部分结果,这种显现就是黏包.
#_*_coding:utf-8_*_ from socket import * import subprocess ip_port=('127.0.0.1',8888) BUFSIZE=1024 tcp_socket_server=socket(AF_INET,SOCK_STREAM) tcp_socket_server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) tcp_socket_server.bind(ip_port) tcp_socket_server.listen(5) while True: conn,addr=tcp_socket_server.accept() print('客户端',addr) while True: cmd=conn.recv(BUFSIZE) if len(cmd) == 0:break res=subprocess.Popen(cmd.decode('utf-8'),shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE) stderr=res.stderr.read() stdout=res.stdout.read() conn.send(stderr) conn.send(stdout) tcp - server
#_*_coding:utf-8_*_ import socket BUFSIZE=1024 ip_port=('127.0.0.1',8888) s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) res=s.connect_ex(ip_port) while True: msg=input('>>: ').strip() if len(msg) == 0:continue if msg == 'quit':break s.send(msg.encode('utf-8')) act_res=s.recv(BUFSIZE) print(act_res.decode('utf-8'),end='') tcp - client
tcp协议的拆包机制
成因:当发送端缓冲区的长度大于网卡的MTU时,tcp会将这次发送的数据拆成几个数据包发出去.MTU是Maximum Transmission Unit的缩写.意思是网络上传的最大数据包.MTU的单位是字节.大部分网络设备的MTU都是1500.如果本季的MTU比网关的MTU大,大的数据包就会被拆开来传送,这样会产生很多数据包碎片,增加丢包率,降低网络速度.
struct模块:
该模块可以把一个类型,例如数字,转换成固定长度的bytes
struct.pack('i',1111111111111) struct.error: 'i' format requires -2147483648 <= number <= 2147483647 #这个是范围