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进行数据科学工作的简单入门教程
Apr 01 Python
浅谈python多线程和队列管理shell程序
Aug 04 Python
Windows中安装使用Virtualenv来创建独立Python环境
May 31 Python
Python中的浮点数原理与运算分析
Oct 12 Python
python实现支付宝当面付(扫码支付)功能
May 30 Python
python3.6的venv模块使用详解
Aug 01 Python
Python读取txt内容写入xls格式excel中的方法
Oct 11 Python
Django框架模板的使用方法示例
May 25 Python
Python可变对象与不可变对象原理解析
Feb 25 Python
Python通过2种方法输出带颜色字体
Mar 02 Python
python 动态渲染 mysql 配置文件的示例
Nov 20 Python
python 基于opencv 绘制图像轮廓
Dec 11 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之Smarty入门
2007/01/04 PHP
PHP伪静态页面函数附使用方法
2008/06/20 PHP
smarty自定义函数htmlcheckboxes用法实例
2015/01/22 PHP
cakephp常见知识点汇总
2017/02/24 PHP
解决laravel id非自增 模型取回为0 的问题
2019/10/11 PHP
一些常用的JS功能函数(2009-06-04更新)
2009/06/04 Javascript
Javascript中找到子元素在父元素内相对位置的代码
2012/07/21 Javascript
单击按钮显示隐藏子菜单经典案例
2013/01/04 Javascript
JS求平均值的小例子
2013/11/29 Javascript
jquery form 隐藏的input 选择
2014/04/29 Javascript
JS实现单行文字不间断向上滚动的方法
2015/01/29 Javascript
js实现兼容IE、Firefox的图片缩放代码
2015/12/08 Javascript
JS制作图形验证码实现代码
2020/10/19 Javascript
jQuery实现点击某个div打开层,点击其他div关闭层实例分析(阻止冒泡)
2016/11/18 Javascript
利用vue实现模态框组件
2016/12/19 Javascript
使用jQuery实现动态添加小广告
2017/07/11 jQuery
通过vue-router懒加载解决首次加载时资源过多导致的速度缓慢问题
2018/04/08 Javascript
vue+egg+jwt实现登录验证的示例代码
2019/05/18 Javascript
微信小程序按顺序同步执行的两种方式
2019/12/20 Javascript
微信小程序录音实现功能并上传(使用node解析接收)
2020/02/26 Javascript
JSONP 的原理、理解 与 实例分析
2020/05/16 Javascript
Python切片操作去除字符串首尾的空格
2019/04/22 Python
pytorch 模型可视化的例子
2019/08/17 Python
Python vtk读取并显示dicom文件示例
2020/01/13 Python
Python关于反射的实例代码分享
2020/02/20 Python
Html5 Canvas动画基础碰撞检测的实现
2018/12/06 HTML / CSS
Abbacino官网:包、钱包和女士配饰
2019/04/15 全球购物
大四学生毕业自荐信
2013/11/07 职场文书
工作个人的自我评价
2014/01/14 职场文书
重大事项社会稳定风险评估方案
2014/06/15 职场文书
销售竞赛活动方案
2014/08/23 职场文书
2016新春团拜会致辞
2015/08/01 职场文书
《领导干部从政道德启示录》学习心得体会
2016/01/20 职场文书
委托书范本格式
2019/04/18 职场文书
创业计划书介绍
2019/04/24 职场文书
pandas:get_dummies()与pd.factorize()的用法及区别说明
2021/05/21 Python