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单元测试框架unittest简明使用实例
Apr 13 Python
使用Python脚本和ADB命令实现卸载App
Feb 10 Python
基于Django用户认证系统详解
Feb 21 Python
python定向爬取淘宝商品价格
Feb 27 Python
在win10和linux上分别安装Python虚拟环境的方法步骤
May 09 Python
Python检测数据类型的方法总结
May 20 Python
python区分不同数据类型的方法
Oct 14 Python
基于SpringBoot构造器注入循环依赖及解决方式
Apr 26 Python
python实现自动清理重复文件
Aug 24 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
Nov 17 Python
Python爬虫之Selenium实现窗口截图
Dec 04 Python
python机器学习Github已达8.9Kstars模型解释器LIME
Nov 23 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之第四天
2006/10/09 PHP
PHP 实用代码收集
2010/01/22 PHP
php 冒泡排序 交换排序法
2011/05/10 PHP
PHP编程函数安全篇
2013/01/08 PHP
php检测iis环境是否支持htaccess的方法
2014/02/18 PHP
ThinkPHP 3.2.3实现加减乘除图片验证码
2018/12/05 PHP
PHP实现获取url地址中顶级域名的方法示例
2019/06/05 PHP
Thinkphp 框架配置操作之动态配置、扩展配置及批量配置实例分析
2020/05/15 PHP
漂亮的widgets,支持换肤和后期开发新皮肤
2007/04/23 Javascript
JQuery的Validation插件中Remote验证的中文问题
2010/07/26 Javascript
JS实现根据当前文字选择返回被选中的文字
2014/05/21 Javascript
jQuery圆形统计图开发实例
2015/01/04 Javascript
在Node.js中使用Javascript Generators详解
2016/05/05 Javascript
客户端验证用户名和密码的方法详解
2016/06/16 Javascript
如何利用JSHint减少JavaScript的错误
2016/08/23 Javascript
jQuery动态生成表格及右键菜单功能示例
2017/01/13 Javascript
react-router JS 控制路由跳转实例
2017/06/15 Javascript
React Native中Navigator的使用方法示例
2017/10/13 Javascript
微信小程序自定义多选事件的实现代码
2018/05/17 Javascript
微信小程序实现人脸检测功能
2018/05/25 Javascript
解决vue中使用Axios调用接口时出现的ie数据处理问题
2018/08/13 Javascript
vue webpack打包后图片路径错误的完美解决方法
2018/12/07 Javascript
Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法
2015/04/24 Python
Python中列表和元组的相关语句和方法讲解
2015/08/20 Python
详解python之配置日志的几种方式
2017/05/22 Python
python并发2之使用asyncio处理并发
2017/12/21 Python
python实现实时视频流播放代码实例
2020/01/11 Python
利用scikitlearn画ROC曲线实例
2020/07/02 Python
使用css3匹配手机屏幕横竖状态
2014/01/27 HTML / CSS
css3针对移动端卡顿问题的解决(动画性能优化)
2020/02/14 HTML / CSS
Giglio美国站:意大利奢侈品购物网
2018/02/10 全球购物
2015年机关后勤工作总结
2015/05/26 职场文书
2016新春团拜会致辞
2015/08/01 职场文书
pytorch锁死在dataloader(训练时卡死)
2021/05/28 Python
Python anaconda安装库命令详解
2021/10/16 Python
Nginx的gzip相关介绍
2022/05/11 Servers