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操作RabbitMQ服务器实现消息队列的路由功能
Jun 29 Python
Python中的异常处理相关语句基础学习笔记
Jul 11 Python
Python实现批量检测HTTP服务的状态
Oct 27 Python
Python sorted函数详解(高级篇)
Sep 18 Python
一文了解Python并发编程的工程实现方法
May 31 Python
Django高级编程之自定义Field实现多语言
Jul 02 Python
Python3实现配置文件差异对比脚本
Nov 18 Python
Python pickle模块实现对象序列化
Nov 22 Python
Keras 利用sklearn的ROC-AUC建立评价函数详解
Jun 15 Python
python转化excel数字日期为标准日期操作
Jul 14 Python
python中sys模块是做什么用的
Aug 16 Python
教你使用Sublime text3搭建Python开发环境及常用插件安装另分享Sublime text3最新激活注册码
Nov 12 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 发送图片处理代码分享
2015/07/09 PHP
PHP开发API接口签名生成及验证操作示例
2020/05/27 PHP
如何在Laravel之外使用illuminate组件详解
2020/09/20 PHP
JavaScript 特殊字符
2007/04/05 Javascript
javaScript parseInt字符转化为数字函数使用小结
2009/11/05 Javascript
setTimeout与setInterval在不同浏览器下的差异
2010/01/24 Javascript
JavaScript 对象模型 执行模型
2010/10/15 Javascript
当某个文本框成为焦点时即清除文本框内容
2014/04/28 Javascript
jQuery中:password选择器用法实例
2015/01/03 Javascript
javascript面向对象之this关键词用法分析
2015/01/13 Javascript
使用jQuery在对象中缓存选择器的简单方法
2015/06/30 Javascript
gameboy网页闯关游戏(riddle webgame)--仿微信聊天的前端页面设计和难点
2016/02/21 Javascript
jquery插件之文字间歇自动向上滚动效果代码
2016/02/25 Javascript
微信小程序中post方法与get方法的封装
2017/09/26 Javascript
VUE2.0中Jsonp的使用方法
2018/05/22 Javascript
React中嵌套组件与被嵌套组件的通信过程
2018/07/11 Javascript
vue中使用heatmapjs的示例代码(结合百度地图)
2018/09/05 Javascript
Angular PWA使用的Demo示例
2019/01/31 Javascript
VScode格式化ESlint方法(最全最好用方法)
2019/09/10 Javascript
微信浏览器左上角返回按钮监听的实现
2020/03/04 Javascript
Python用Bottle轻量级框架进行Web开发
2016/06/08 Python
python时间日期函数与利用pandas进行时间序列处理详解
2018/03/13 Python
python3.6数独问题的解决
2019/01/21 Python
详解python执行shell脚本创建用户及相关操作
2019/04/11 Python
python生成器推导式用法简单示例
2019/10/08 Python
python交互模式基础知识点学习
2020/06/18 Python
如何教少儿学习Python编程
2020/07/10 Python
有关pycharm登录github时有的时候会报错connection reset的问题
2020/09/15 Python
HTML+CSS3+JS 实现的下拉菜单
2020/11/25 HTML / CSS
HTML5的video标签的浏览器兼容性增强方案分享
2016/05/19 HTML / CSS
BIBLOO波兰:捷克的一家在线服装店
2018/03/09 全球购物
借款担保书范文
2014/05/13 职场文书
学前教育专业求职信
2014/09/02 职场文书
妈妈别哭观后感
2015/06/08 职场文书
导游词之日月潭
2019/11/05 职场文书
mapstruct的用法之qualifiedByName示例详解
2022/04/06 Java/Android