python 网络编程--socket模块/struct模块
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":breakresponse = 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':breakresponse = sk.recv(1024) # 等待服务端给他发送消息print(response.decode('utf-8'))sk.close() # 关闭自己
黏包:
同时执行多条命令之后,得到的结果很可能只有一部分,在执行其他命令的时候又接收到了之前执行的另外一部分结果,这种显现就是黏包.
#_*_coding:utf-8_*_ from socket import * import subprocessip_port=('127.0.0.1',8888) BUFSIZE=1024tcp_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:breakres=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 黏包实例:TCP/服务端
#_*_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:continueif msg == 'quit':breaks.send(msg.encode('utf-8'))act_res=s.recv(BUFSIZE)print(act_res.decode('utf-8'),end='')tcp - client 黏包实例:TCP/客户端
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 #这个是范围
转载于:https://www.cnblogs.com/zbw582922417/p/9578978.html
总结
以上是生活随笔为你收集整理的python 网络编程--socket模块/struct模块的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: WPF 异常其他信息: “对类型“Bas
- 下一篇: pythonのgevent同步异步区别