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 相关文章推荐
PyMongo安装使用笔记
Apr 27 Python
在Python的Flask框架中验证注册用户的Email的方法
Sep 02 Python
mac系统安装Python3初体验
Jan 02 Python
Python3.6实现连接mysql或mariadb的方法分析
May 18 Python
Python中判断输入是否为数字的实现代码
May 26 Python
Python实现多属性排序的方法
Dec 05 Python
python 实现分页显示从es中获取的数据方法
Dec 26 Python
PYTHON绘制雷达图代码实例
Oct 15 Python
python 中值滤波,椒盐去噪,图片增强实例
Dec 18 Python
python如何通过pyqt5实现进度条
Jan 20 Python
Matplotlib自定义坐标轴刻度的实现示例
Jun 18 Python
pymysql模块使用简介与示例
Nov 17 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 curl模拟post请求内容后并下载文件的解决思路
2015/09/20 PHP
PHP数组游标实现对数组的各种操作详解
2016/01/26 PHP
Yii开启片段缓存的方法
2016/03/28 PHP
Yii 2.0在Grid中格式化时间方法示例
2017/06/06 PHP
PHP中soap用法示例【SoapServer服务端与SoapClient客户端编写】
2018/12/25 PHP
JS获取dom 对象 ajax操作 读写cookie函数
2009/11/18 Javascript
js以对象为索引的关联数组
2010/07/04 Javascript
十个迅速提升JQuery性能让你的JQuery跑得更快
2012/12/10 Javascript
js中Image对象以及对其预加载处理示例
2013/11/20 Javascript
jQuery实现验证年龄简单思路
2016/02/24 Javascript
js实现前端分页页码管理
2017/01/06 Javascript
js实现5秒倒计时重新发送短信功能
2017/02/05 Javascript
js图片放大镜效果实现方法详解
2020/10/28 Javascript
React-Native左右联动List的示例代码
2017/09/21 Javascript
Angular实现双向折叠列表组件的示例代码
2017/11/21 Javascript
详解Vue项目编译后部署在非网站根目录的解决方案
2018/04/26 Javascript
vue项目中实现图片预览的公用组件功能
2018/10/26 Javascript
微信小程序车牌号码模拟键盘输入功能的实现代码
2018/11/11 Javascript
vue实现百度下拉列表交互操作示例
2019/03/12 Javascript
js实现简单页面全屏
2019/09/17 Javascript
vue实现树形结构样式和功能的实例代码
2019/10/15 Javascript
node实现mock-plugin中间件的方法
2019/12/25 Javascript
在Uni中使用Vue的EventBus总线机制操作
2020/07/31 Javascript
prettier自动格式化去换行的实现代码
2020/08/25 Javascript
[01:15]PWL S2开团时刻第二期——他们杀 我就白给
2020/11/25 DOTA
Anaconda2下实现Python2.7和Python3.5的共存方法
2018/06/11 Python
python3字符串操作总结
2019/07/24 Python
python之PyQt按钮右键菜单功能的实现代码
2019/08/17 Python
详解python 支持向量机(SVM)算法
2020/09/18 Python
JDBC操作数据库的基本流程是什么
2014/10/28 面试题
企业总经理职责
2014/02/02 职场文书
学习之星事迹材料
2014/05/17 职场文书
股东授权委托书范本
2014/09/13 职场文书
2015教师个人工作总结范文
2015/03/31 职场文书
python数据可视化使用pyfinance分析证券收益示例详解
2021/11/20 Python
Win11 25163.1010更新补丁KB5016904推送,测试服务验证管道(附更新修复汇总)
2022/07/23 数码科技