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 opencv之SURF算法示例
Feb 24 Python
python 字符串只保留汉字的方法
Nov 16 Python
Python绘制频率分布直方图的示例
Jul 08 Python
python Tcp协议发送和接收信息的例子
Jul 22 Python
使用Python实现文字转语音并生成wav文件的例子
Aug 08 Python
python提取照片坐标信息的实例代码
Aug 14 Python
python定义类self用法实例解析
Jan 22 Python
python 实现在shell窗口中编写print不向屏幕输出
Feb 19 Python
Python+redis通过限流保护高并发系统
Apr 15 Python
Python退出时强制运行一段代码的实现方法
Apr 29 Python
Python中无限循环需要什么条件
May 27 Python
python编程的核心知识点总结
Feb 08 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+DBM的同学录程序(4)
2006/10/09 PHP
php 操作调试的方法
2012/07/12 PHP
服务器变量 $_SERVER 的深入解析
2013/07/02 PHP
PHP读取文件内容的五种方式
2015/12/28 PHP
javascript 实用的文字链提示框效果
2010/06/30 Javascript
JQuery跨Iframe选择实现代码
2010/08/19 Javascript
javascript使用activex控件的代码
2011/01/27 Javascript
分享10篇优秀的jQuery幻灯片制作教程及应用案例
2011/04/16 Javascript
YUI Compressor压缩JavaScript原理及微优化
2013/01/07 Javascript
js随机颜色代码的多种实现方式
2013/04/23 Javascript
jQuery动态显示和隐藏datagrid中的某一列的方法
2013/12/11 Javascript
提取jquery的ready()方法单独使用示例
2014/03/25 Javascript
js+css绘制颜色动态变化的圈中圈效果
2016/01/27 Javascript
深入浅析jQuery对象$.html
2016/08/22 Javascript
基于JavaScript实现的希尔排序算法分析
2017/04/14 Javascript
关于vue.js组件数据流的问题
2017/07/26 Javascript
Laravel整合Bootstrap 4的完整方案(推荐)
2018/01/25 Javascript
vue 自定义右键样式的实例代码
2019/11/06 Javascript
js实现div色块拖动录制
2020/01/16 Javascript
Vue插槽_特殊特性slot,slot-scope与指令v-slot说明
2020/09/04 Javascript
python socket 超时设置 errno 10054
2014/07/01 Python
使用django的ORM框架按月统计近一年内的数据方法
2019/07/18 Python
解决python flask中config配置管理的问题
2019/07/26 Python
pytorch 输出中间层特征的实例
2019/08/17 Python
python处理excel绘制雷达图
2019/10/18 Python
python实现word文档批量转成自定义格式的excel文档的思路及实例代码
2020/02/21 Python
Python3.7在anaconda里面使用IDLE编译器的步骤详解
2020/04/29 Python
基于PyTorch的permute和reshape/view的区别介绍
2020/06/18 Python
Python 通过正则表达式快速获取电影的下载地址
2020/08/17 Python
CSS3网格的三个新特性详解
2014/04/04 HTML / CSS
详解CSS3+JS完美实现放大镜模式
2020/12/03 HTML / CSS
英国著名的小众美容品牌网站:Alyaka
2017/08/08 全球购物
Beach Bunny Swimwear官网:设计师泳装和性感比基尼
2019/03/13 全球购物
意大利文具和办公产品在线商店:Y-Office
2020/02/27 全球购物
电子商务专业毕业生求职信
2014/06/12 职场文书
婚宴主持词
2015/06/30 职场文书