python 网络编程要点总结


Posted in Python onJune 18, 2021
目录
  • 1,七层网络协议
  • 2,TCP/UDP
  • 3,例子
  • 4,粘包

 

1,七层网络协议

应表会传网数物:

应用层、表示层、会话层: (这三层又可以合并为应用层,这样就是五层网络协议【osi五层协议】) python '你好'.encoding('utf-8')

传输层: 预备如何传输、使用的端口 (port,tcp,udp); 四层路由器、四层交换机

网络层: ip(ipv4 ipv6); 路由器、三层交换机

数据链路层: mac(mac, arp协议:可以通过ip找到mac); 二层交换机、网卡(单播、广播、组播,arp用到单播和广播)

物理层 : 转成电信号

 

2,TCP/UDP

tcp需要先建立连接,然后才能够通信(类似于打电话)

  • 占用连接,可靠(消息不会丢失),实时性高,慢(效率低、面向连接、可靠、全双工)
  • 三次握手
    • 客户端向服务器端发送syn请求
    • 服务端回复ack并发送syn请求
    • 客户端接收到请求后再回复ack,连接建立
      • 在socket中是由 客户端connect() 和 服务端accept()两个命令完成的
  • 四次挥手
    • 客户端向服务端发送fin请求
    • 服务端回复ack确认
    • 服务端向客户端发送fin请求
    • 客户端回复ack确认
      • 在socket中是由 客户端sk.close() 和 服务端 conn.close()两个命令完成的
      • 挥手时服务端的ack和fin不能同时发送,因为客户端发送完所有信息时,服务端不一定完成了所有信息的发送

udp不需要建立连接,就可以通信(类似于发信息)

不占用连接,不够可靠(消息因为网络不稳定可能丢失),实时性不高(效率高、无连接的、不可靠的)

 

3,例子

'''
------------------------------
TCP协议
------------------------------
'''
'''server'''
import socket

sk = socket.socket()
sk.bind(('127.0.0.1', 6000))
sk.listen()

conn, addr = sk.accept()
conn.send('你好'.encode('utf-8'))
msg = conn.recv(1024)
print(msg.decode('utf-8'))
conn.close()

sk.close()

'''client'''
import socket

sk = socket.socket()
sk.connect(('127.0.0.1', 6000))

msg = sk.recv(1024)
print(msg.decode('utf-8'))
sk.send('再见'.encode('utf-8'))

sk.close()

'''
------------------------------
UDP协议
------------------------------
'''
'''server'''
import socket

sk = socket.socket(type=socket.SOCK_DGRAM)   #SOCK_DGRAM udp    default tcp
sk.bind(('127.0.0.1', 6000))

# msg = sk.recv(1024)
# print(msg.decode('utf-8'))

while True:
    msg = sk.recvfrom(1024)
    print(msg)
    print(msg[0].decode('utf-8'))
    if msg[0].decode('utf-8') == '对方和你断开了连接':
        continue
    msgSend = input('>>>')
    sk.sendto(msgSend.encode('utf-8'), msg[1])

'''client'''
import socket

sk = socket.socket(type=socket.SOCK_DGRAM)
server = ('127.0.0.1', 6000)

while True:
    msgSend = input('>>>')
    if msgSend.upper() == 'Q':
        sk.sendto('对方和你断开了连接'.encode('utf-8'), server)
        break
    sk.sendto(msgSend.encode('utf-8'), server)
    msg = sk.recv(1024).decode('utf-8')
    if msg.upper() == 'Q':
        print('对方和你断开了连接')
        break
    print(msg)

 

4,粘包

只出现在tcp协议中,因为tcp协议中多条消息之间没有边界,并且还有各种优化算法,因此会导致发送端和接收端都存在粘包现象:

发送端:两条消息很短,而且发送的间隔时间也很短

接收端:多条消息没有及时接收,而在接收方的缓存堆在一起导致粘包

'''server'''
import socket

sk = socket.socket()
sk.bind(('127.0.0.1', 6000))
sk.listen()

conn, addr = sk.accept()
conn.send(b'hello')
conn.send(b'byebye')

conn.close()
sk.close()

'''client'''
import time
import socket

sk = socket.socket()
sk.connect(('127.0.0.1', 6000))

time.sleep(0.1)
msg = sk.recv(5)
print(msg)
msg = sk.recv(4)
print(msg)

sk.close()

解决粘包问题的本质:设置边界(发送长度、发送消息,交替进行)

1,自定义协议

'''server'''
import socket

sk = socket.socket()
sk.bind(('127.0.0.1', 6000))
sk.listen()

conn, addr = sk.accept()
msg1 = input('>>>').encode('utf-8')
msg2 = input('>>>').encode('utf-8')

def sendFunc(msg):
    num = str(len(msg))
    ret = num.zfill(4)
    conn.send(ret.encode('utf-8'))
    conn.send(msg)
sendFunc(msg1)
sendFunc(msg2)

conn.close()
sk.close()

'''client'''
import socket

sk = socket.socket()
sk.connect(('127.0.0.1', 6000))

def receiveFunc():
    num = sk.recv(4).decode('utf-8')
    msg = sk.recv(int(num))
    print(msg.decode('utf-8'))

receiveFunc()
receiveFunc()

sk.close()

2,struct模块

import struct
'''~2**32, 排除符号位,相当于1G的数据的长度'''

num1 = 1231341234
num2 = 1342342
num3 = 12

ret1 = struct.pack('i', num1)
print(ret1)
print(len(ret1))
ret2 = struct.pack('i', num2)
print(ret2)
print(len(ret2))
ret3 = struct.pack('i', num3)
print(ret3)
print(len(ret3))

ret11 = struct.unpack('i', ret1)
print(ret11)
print(type(ret11[0]))

以上就是python 网络编程要点总结的详细内容,更多关于python 网络编程的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
使用python实现baidu hi自动登录的代码
Feb 10 Python
python正则实现提取电话功能
Feb 24 Python
python leetcode 字符串相乘实例详解
Sep 03 Python
python中将正则过滤的内容输出写入到文件中的实例
Oct 21 Python
Python 通过调用接口获取公交信息的实例
Dec 17 Python
python实现公司年会抽奖程序
Jan 22 Python
Python多叉树的构造及取出节点数据(treelib)的方法
Aug 09 Python
Pytorch之contiguous的用法
Dec 31 Python
python pymysql链接数据库查询结果转为Dataframe实例
Jun 05 Python
基于Python模拟浏览器发送http请求
Nov 06 Python
Django展示可视化图表的多种方式
Apr 08 Python
python脚本框架webpy模板赋值实现
Nov 20 Python
python opencv检测直线 cv2.HoughLinesP的实现
Jun 18 #Python
教你用Python+selenium搭建自动化测试环境
Jun 18 #Python
详解Python函数print用法
Jun 18 #Python
总结Python使用过程中的bug
简单介绍Python的第三方库yaml
Jun 18 #Python
教你如何使用Python实现二叉树结构及三种遍历
Python实现智慧校园自动评教全新版
You might like
php中3种方法统计字符串中每种字符的个数并排序
2012/08/27 PHP
ThinkPHP跳转页success及error模板实例教程
2014/07/17 PHP
带你了解PHP7 性能翻倍的关键
2015/11/19 PHP
PHP简单获取上月、本月、近15天、近30天的方法示例
2017/07/03 PHP
PHP实现简单的模板引擎功能示例
2017/09/02 PHP
jquery 扑捉回车键事件代码
2014/04/24 Javascript
js用typeof方法判断undefined类型
2014/07/15 Javascript
JS实现进入页面时渐变背景色的方法
2015/02/25 Javascript
Javascript中的call()方法介绍
2015/03/15 Javascript
jquery仅用6行代码实现滑动门效果
2015/09/07 Javascript
学习jQuey中的return false
2015/12/18 Javascript
原生JavaScript实现Ajax的方法
2016/04/07 Javascript
原生JS实现匀速图片轮播动画
2016/10/18 Javascript
jQuery内存泄露解决办法
2016/12/13 Javascript
原生JS实现《别踩白块》游戏(兼容IE)
2017/02/20 Javascript
微信小程序 点击控件后选中其它反选实例详解
2017/02/21 Javascript
vue多层嵌套路由实例分析
2019/03/19 Javascript
详解Vue中使用插槽(slot)、聚类插槽
2019/04/12 Javascript
nodejs提示:cross-device link not permitted, rename错误的解决方法
2019/06/10 NodeJs
解决VUE项目使用Element-ui 下拉组件的验证失效问题
2020/11/07 Javascript
Vue + ts实现轮播插件的示例
2020/11/10 Javascript
详解Python中的正则表达式的用法
2015/04/09 Python
详解Python的Django框架中的Cookie相关处理
2015/07/22 Python
python从入门到精通 windows安装python图文教程
2019/05/18 Python
python将字母转化为数字实例方法
2019/10/04 Python
Python基于pip实现离线打包过程详解
2020/05/15 Python
Python实现快速大文件比较代码解析
2020/09/04 Python
详解HTML5表单新增属性
2016/12/21 HTML / CSS
莫斯科大型旅游休闲商品超市:Camping.ru
2020/09/16 全球购物
法国春天百货官网:Printemps.com
2020/06/29 全球购物
行政管理专业推荐信
2013/11/02 职场文书
班干部演讲稿
2014/04/24 职场文书
医院信息公开实施方案
2014/05/09 职场文书
2015年保险公司个人工作总结
2015/05/22 职场文书
公司岗位说明书
2015/10/08 职场文书
vue3如何优雅的实现移动端登录注册模块
2021/03/29 Vue.js