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使用beautifulsoup从爱奇艺网抓取视频播放
Jan 23 Python
python进阶教程之循环相关函数range、enumerate、zip
Aug 30 Python
Python3 操作符重载方法示例
Nov 23 Python
python实现飞机大战微信小游戏
Mar 21 Python
python实现文件的备份流程详解
Jun 18 Python
python获取地震信息 微信实时推送
Jun 18 Python
python实现字符串完美拆分split()的方法
Jul 16 Python
Tensorflow tensor 数学运算和逻辑运算方式
Jun 30 Python
python中os.remove()用法及注意事项
Jan 31 Python
python中使用asyncio实现异步IO实例分析
Feb 26 Python
Python实现socket库网络通信套接字
Jun 04 Python
Python面向对象之成员相关知识总结
Jun 24 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
Win2003下APACHE+PHP5+MYSQL4+PHPMYADMIN 的简易安装配置
2006/11/18 PHP
PHP+.htaccess实现全站静态HTML文件GZIP压缩传输(一)
2007/02/15 PHP
实例讲解PHP面向对象之多态
2014/08/20 PHP
PHP递归遍历指定目录的文件并统计文件数量的方法
2015/03/24 PHP
浅谈PHP定义命令空间的几个注意点(推荐)
2016/10/29 PHP
基于PHP实现的多元线性回归模拟曲线算法
2018/01/30 PHP
PHP实现的curl批量请求操作示例
2018/06/06 PHP
javascript实现博客园页面右下角返回顶部按钮
2015/02/22 Javascript
浅谈jQuery构造函数分析
2015/05/11 Javascript
jQuery获取复选框选中的当前行的某个字段的值
2017/09/15 jQuery
webpack4+Vue搭建自己的Vue-cli项目过程分享
2018/08/29 Javascript
微信小程序实现复选框效果
2018/12/28 Javascript
vue与bootstrap实现简单用户信息添加删除功能
2019/02/15 Javascript
jquery操作select常见方法大全【7种情况】
2019/05/28 jQuery
vue-router结合vuex实现用户权限控制功能
2019/11/14 Javascript
JS数据类型(基本数据类型、引用数据类型)及堆和栈的区别分析
2020/03/04 Javascript
vue 监听 Treeselect 选择项的改变操作
2020/08/31 Javascript
[01:00:14]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第二场 2月28日
2021/03/11 DOTA
Python下的subprocess模块的入门指引
2015/04/16 Python
python通过定义一个类实例作为ftp回调方法
2015/05/04 Python
Python实现将xml导入至excel
2015/11/20 Python
Python安装图文教程 Pycharm安装教程
2018/03/27 Python
python打包压缩、读取指定目录下的指定类型文件
2018/04/12 Python
python抓取网站的图片并下载到本地的方法
2018/05/22 Python
了解不常见但是实用的Python技巧
2019/05/23 Python
pandas中的series数据类型详解
2019/07/06 Python
Python 利用邮件系统完成远程控制电脑的实现(关机、重启等)
2019/11/19 Python
如何配置关联Python 解释器 Anaconda的教程(图解)
2020/04/30 Python
Python Selenium模块安装使用教程详解
2020/07/09 Python
火山动力Java笔试题
2014/06/26 面试题
财务会计专业应届毕业生求职信
2013/10/18 职场文书
保安员岗位职责
2013/11/17 职场文书
彩色的翅膀教学反思
2014/04/25 职场文书
学生上课看漫画的检讨书
2014/09/26 职场文书
2016年教师节慰问信
2015/12/01 职场文书
Python+腾讯云服务器实现每日自动健康打卡
2021/12/06 Python