python基础-网络编程part02
TCP协议
TCP是传输控制协议,建立双向通道。
三次握手,建立连接
- 客户端向服务端发送建立连接的请求
- 服务端接收请求返回确认信息给客户端,并向客户端发送建立连接的请求
- 客户端接收请求返回确认信息给服务端
反馈机制:一次请求必须有一次响应。即收到请求后,必须告知对方已收到请求。
四次挥手,断开连接
- 客户端向服务端发送断开连接的请求
- 服务端接收请求返回确认信息发给客户端
- 服务端确认所有数据接收完毕以后,发送断开连接的请求给客户端
- 客户端接收请求返回确认信息给服务端
socket套接字通信
定义:python内置的模块,又称套接字,用来封装互联网协议(应用层以下的层)
作用:实现互联网协议应用层以下的工作,提高开发效率
使用方式:见代码
- 服务端server.py
import socket
# 获取socket 对象
server = socket.socket()
# 绑定服务端ip 地址和端口
# 127.0.0.1是回环地址,表示本机ip
server.bind(('127.0.0.1', 8080))
# 半连接池,表示可以同时让多少个客户端访问。
# 一个客户端正在交互,剩下的等待交互,listen(n):n+1个客户端
server.listen(5)
# 阻塞,直到客户端访问,返回连接请求和客户端IP
conn, client = server.accept()
# 接收客户端发送的信息并打印
# 接收默认最大字节数:1024(可根据内存自行调整)
client_data = conn.recv(1024).decode('utf-8')
print(f"来自客户端的消息:{client_data}")
# 向客户端发送消息
send_msg = input("请输入指令>>>>>:").strip().encode('utf-8')
conn.send(send_msg)
# 关闭连接
conn.close()
# 关闭服务
server.close()
- 客户端client.py
import socket
# 创建socket对象
client = socket.socket()
# 向服务端请求连接
client.connect(('127.0.0.1', 9527))
# 向服务端发送数据,send只接收二进制数据
client_msg = input("请输入要发送给服务端的信息>>>>:").strip()
client.send(client_msg.encode('utf-8'))
# 接收服务端返回的数据
# 接收默认最大字节数:1024(可根据内存自行调整)
client_data = client.recv(1024).decode('utf-8')
print(f"来自服务端的消息:{client_data}")
# 关闭连接
client.close()
注意:
- 先启动服务端,再启动客户端
- 一次数据请求必须有一次响应,服务端和客户端不能同时发送请求或同时接收请求
粘包现象
- 现象一:数据多次发送时间间隔短,且量少时,接送一次读取了信息,后续读取记录为空
# 客户端.py
import socket
server = socket.socket()
server.connect(("127.0.0.1", 9527))
# 连续发送
server.send(b"hello")
server.send(b"hello")
server.send(b"hello")
server.close()
# 服务端.py
import socket
from socket import SOL_SOCKET
from socket import SO_REUSEADDR
server = socket.socket()
server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
server.bind(("127.0.0.1", 9527))
server.listen(5)
conn, client = server.accept()
data1 = conn.recv(1024)
data2 = conn.recv(1024)
data3 = conn.recv(1024)
print(data1)
print(data2)
print(data3)
conn.close()
server.close()
输出结果
b'hellohellohello'
b''
b''
- 现象二:当发送数据的字节数超出每次接收的最大限制数,会将上次没有接收完的记录在下次接收
# 客户端.py
import socket
client = socket.socket()
client.connect(('127.0.0.1', 9527))
client.send(b'hello world!')
client.send(b'lift is smart!')
client.close()
# 服务端.py
import socket
from socket import SOL_SOCKET
from socket import SO_REUSEADDR
server = socket.socket()
server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
server.bind(('127.0.0.1', 9527))
server.listen(5)
conn, client = server.accept()
re_data1 = conn.recv(5).decode('utf-8')
re_data2 = conn.recv(5).decode('utf-8')
print(re_data1)
print(re_data2)
conn.close()
server.close()
输出结果
hello
worl
struct模块—解决粘包问题
定义:python内置的模块,可以将 固定长度的数据,打包成固定格式的长度
作用:将真实数据,做成一个固定长度的报头,客户端发送给服务端,服务端可以接收报头(反之亦然)。然后对报头进行解包,获取真实数据的长度,进行接收即可。
使用,以现象二举例(实质都一样解决)
# 客户端.py
import socket
import struct
client = socket.socket()
client.connect(('127.0.0.1', 9527))
msg1 = 'hello world!'
# 使用struct模块中的pack方法,模式‘i’表示4个字节
# 将要发送的数据长度打包成一个header
header1 = struct.pack('i', len(msg1))
# 先将报头发送给服务端
client.send(header1)
# 再将真实数据发送给服务端
client.send(msg1.encode('utf-8'))
# 服务端.py
import socket
import struct
server = socket.socket()
server.bind(('127.0.0.1', 9527))
server.listen(5)
conn, client = server.accept()
# 读取报头
header = conn.recv(4)
# 使用struct.unpack 解析真实数据长度
header_len = struct.unpack('i', header)[0]
# 读取真实数据
re_data = conn.recv(header_len)
print(re_data.decode('utf-8'))
conn.close()
server.close()
python基础-网络编程part02的更多相关文章
- python 基础网络编程2
python 基础网络编程2 前一篇讲了socketserver.py中BaseServer类, 下面介绍下TCPServer和UDPServer class TCPServer(BaseServer ...
- python 基础网络编程1
python 基础网络编程1 Source code: Lib/socketserver.py lib的主目录下有一个sockserver.py文件, 里面是python基本的网络编程模型 共有一个b ...
- python基础网络编程--转
python之网络编程 本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类: 消息传递(管道.FIFO.消息队列) 同步(互斥量.条件变量.读写锁.文件和写记录锁.信号量) 共享内存(匿名的 ...
- python基础-网络编程part01
软件开发架构 C/S(Client / Server) 架构 概念:是一种软件系统体系结构.Client是客户端,Server是服务端.客户端需要安装专用的客户端软件. 比如:微信.QQ.王者荣耀等应 ...
- Python基础-网络编程request使用
import requests#get请求 url = "http://127.0.0.1:8000/login" data={"username":" ...
- python之网络编程
本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类: 消息传递(管道.FIFO.消息队列) 同步(互斥量.条件变量.读写锁.文件和写记录锁.信号量) 共享内存(匿名的和具名的) 远程过程调用 ...
- Python高级网络编程系列之第一篇
在上一篇中我们简单的说了一下Python中网络编程的基础知识(相关API就不解释了),其中还有什么细节的知识点没有进行说明,如什么是TCP/IP协议有几种状态,什么是TCP三次握手,什么是TCP四次握 ...
- python基础-函数式编程
python基础-函数式编程 高阶函数:map , reduce ,filter,sorted 匿名函数: lambda 1.1函数式编程 面向过程编程:我们通过把大段代码拆成函数,通过一层一层 ...
- python基础——面向对象编程
python基础——面向对象编程 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...
随机推荐
- reduce,map,filter 的用法
# filter用法 (对每一个数据进行筛选,满足条件的就保留)# 1,filter(功能函数,容器类型数据)# 2,过滤出来是一个地址,用list,或tuple进行包装# 3,过滤出来的是原容器类型 ...
- JVM参数及调优
## 3.2.1 JVM参数及调优 ### 调优基本概念 在调整JVM性能时,通常有三个组件需要考虑:1. 堆大小调整2. 垃圾收集器调整3. JIT编译器 大多数调优选项都与调整堆大小和选择合适的垃 ...
- Web for pentester_writeup之XSS篇
Web for pentester_writeup之XSS篇 XSS(跨站脚本攻击) Example 1 反射性跨站脚本,URL中name字段直接在网页中显示,修改name字段, Payload: h ...
- Feeling after reading《Jane Eyre》
Yesterday I read and listened over the book named <Jane Eyre>, the book is very thoughtful, th ...
- 关于多线程start()方法原理解读
1.为什么启动线程不用run()方法而是使用start()方法 run()方法只是一个类中的普通方法,调用run方法跟调用普通方法一样 而start()是创建线程等一系列工作,然后自己调用run里面的 ...
- 爬虫之selenium爬取斗鱼主播图片
这是我GitHub上简单的selenium介绍与简单使用:https://github.com/bwyt/spider/tree/master/selenium%E5%9F%BA%E7%A1%80 & ...
- 八、springboot 简单优雅的通过docker-compose 构建
前言 这个项目有一段时间没有更新了,不过我可没有偷懒哟,是偷偷准备了一个大招,现在是时候展示啦哈哈. 我们今天要做的,就是将我们的项目通过docker-compose 构建成镜像运行.为什么要这样做呢 ...
- P3105 [USACO14OPEN]公平的摄影(正解是乱搞,我却二分了)(+二分答案总结)
照例化简题意: 给定一个01区间,可以把0改成1,问其中最长的01数量相等的区间长度. 额很容易想到前缀和,把w弄成1,h弄成-1,然后求前缀和,然后乱搞就行了. 但是一直不太会乱搞的我却直接想到了二 ...
- tarjan学习(复习)笔记(持续更新)(各类找环模板)
题目背景 缩点+DP 题目描述 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只 ...
- jdbc 加载数据库驱动如何破坏双亲委托模式
导读 通过jdbc链接数据库,是每个学习Java web 方向的人必然一开始会写的代码,虽然现在各路框架都帮大家封装好了jdbc,但是研究一下jdbc链接的套路还是很意义 术语以及相 ...