python10-网络编程
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]))
python10-网络编程的更多相关文章
- 猫哥网络编程系列:HTTP PEM 万能调试法
注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...
- python select网络编程详细介绍
刚看了反应堆模式的原理,特意复习了socket编程,本文主要介绍python的基本socket使用和select使用,主要用于了解socket通信过程 一.socket模块 socket - Low- ...
- Linux Socket 网络编程
Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...
- 猫哥网络编程系列:详解 BAT 面试题
从产品上线前的接口开发和调试,到上线后的 bug 定位.性能优化,网络编程知识贯穿着一个互联网产品的整个生命周期.不论你是前后端的开发岗位,还是 SQA.运维等其他技术岗位,掌握网络编程知识均是岗位的 ...
- 浅谈C#网络编程(一)
阅读目录: 基础 Socket编程 多线程并发 阻塞式同步IO 基础 在现今软件开发中,网络编程是非常重要的一部分,本文简要介绍下网络编程的概念和实践. Socket是一种网络编程接口,它是对传输层T ...
- C++11网络编程
Handy是一个简洁优雅的C++11网络库,适用于linux与Mac平台.十行代码即可完成一个完整的网络服务器. 下面是echo服务器的代码: #include <handy/handy.h&g ...
- Java - 网络编程
Java的网络编程学习,关于计算机基础的学习参考:计算机网络基础学习 - sqh. 参考:
- Linux网络编程-IO复用技术
IO复用是Linux中的IO模型之一,IO复用就是进程预先告诉内核需要监视的IO条件,使得内核一旦发现进程指定的一个或多个IO条件就绪,就通过进程进程处理,从而不会在单个IO上阻塞了.Linux中,提 ...
- Python Socket 网络编程
Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...
- iOS网络编程
今天的重点是UIWebView.NSURLSession.JSon. 网络编程联网准备:1.在Info.plist中添加AppTransportSecurity类型Dictionary:2.在AppT ...
随机推荐
- <JVM中篇:字节码与类的加载篇>01-Class字节码文件结构
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...
- 前端基础问题:CSS居中的几种方式
水平居中 (1)内联元素: text-align: center; 利用 text-align: center :可以实现在块级元素内部的内联元素水平居中. 如果一行中有多个块级元素,可以通过设置块级 ...
- 攻防世界Web刷题记录(进阶区)
攻防世界Web刷题记录(进阶区) 1.baby_web 发现去掉URLhttp://111.200.241.244:51461/1.php后面的1.php,还是会跳转到http://111.200.2 ...
- 【转】风控中的特征评价指标(三)——KS值
转自:https://zhuanlan.zhihu.com/p/79934510 风控业务背景 在风控中,我们常用KS指标来评估模型的区分度(discrimination).这也是风控模型同学最为追求 ...
- 基于ray的分布式机器学习(二)
基本思路:基于parameter server + multiple workers模式.同步方式:parameter server负责网络参数的统一管理,每次迭代均将参数发送给每一个worker,多 ...
- solidworks中 toolbox调用出现未配置的解决方法
解决步骤:1:win7卸载安全补丁:KB3072630 WIN10,忽略.2:关闭所有Solidworks的进程3:CMD命令行进入:cd c:\program files\solidwokrs co ...
- QFNU 10-16 training
7-9.小字辈 思路:建立一个类,并且类中存有其父节点,其地位,其儿子节点(因为儿子节点有很多,所以要用vector进行存储),通过-1这个祖先节点进行查找.首先找到-1这个祖先节点,并且读入其他位置 ...
- 爬虫:获取动态加载数据(selenium)(某站)
如果网站数据是动态加载,需要不停往下拉进度条才能显示数据,用selenium模拟浏览器下拉进度条可以实现动态数据的抓取. 本文希望找到某乎某话题下讨论较多的问题,以此再寻找每一问题涉及的话题关键词(侵 ...
- 敏杰开题——软工团队项目选择与NABCD分析
这是一篇软件工程课程博客 Q A 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 团队项目选择 我们在这个课程的目标是 团队协作实践敏捷开发 这个作业在哪个具 ...
- SDK安全测试
设备调试 strace MI 5X 链接:https://pan.baidu.com/s/1KfsfEgjniozXGUD_69m0SQ 提取码:mulo 推strace到手机中 adb push s ...