欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

python 网络编程--socket模块/struct模块

发布时间:2025/7/25 102 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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模块的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。