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把对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...
随机推荐
- Hibernate---快速入门
Hibernate简介 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可 ...
- 深入理解C#第三版部分内容
最近,粗略的读了<深入理解C#(第三版)>这本技术书,书中介绍了C#不同版本之间的不同以及新的功能. 现在将部分摘录的内容贴在下面,以备查阅. C#语言特性: 1.C#2.0 C#2的主 ...
- 识别手写数字增强版100% - pytorch从入门到入道(一)
手写数字识别,神经网络领域的“hello world”例子,通过pytorch一步步构建,通过训练与调整,达到“100%”准确率 1.快速开始 1.1 定义神经网络类,继承torch.nn.Modul ...
- 详解Spring Security的HttpBasic登录验证模式
一.HttpBasic模式的应用场景 HttpBasic登录验证模式是Spring Security实现登录验证最简单的一种方式,也可以说是最简陋的一种方式.它的目的并不是保障登录验证的绝对安全,而是 ...
- Java自学基础、进阶、项目实战网站推荐
推荐一个自学的好平台,有Java基础,前端,后端,基础的内容都有讲解,还有框架的讲解和实战项目,特别适合自学 JAVA 自学网站 JAVA 练习题 Spring 教程 Mybatis 教程 Sprin ...
- Linux下rpm仓库搭建
一.概念 1.rpm是什么?在帮助文档里我们可以看到,rpm的名字是rpm package manage 的缩写, 从名字上看就可以知道rpm就是一个包管理工具.简单说rpm包就是把一些程序编译成二进 ...
- 【algo&ds】3.栈和队列
1.堆栈 堆栈(Stack):具有一定操作约束的线性表(只在一端(栈顶,Top)做插入.删除) 先进后出特性 1.1堆栈的抽象数据类型描述 类型名称: 堆栈(Stack) 数据对象集:一个有0个或多个 ...
- JavaScript with Image:创建缩略图
当图片很大,直接把图片从Server下载到浏览器上看是一种很不明智的做法,浪费了服务器的资源,网络带宽和客户端的资源.所以,通常Server和Client之间会传输缩略图,只有当Client请求某张图 ...
- AngularJS: Error reports on $injector:modulerr
Angular JS最常见的问题是,程序启动失败,error为$injector:modulerr 错误是因为加载对应的Module失败,但很难找到需要修改的Module. 一个简单的小技巧是,不要使 ...
- 设计模式(Java语言)- 简单工厂模式
简单工厂模式有称为静态工厂模式,属于设计模式中的创建型模式.简单工厂模式通过对外提供一个静态方法来统一为类创建实例.简单工厂模式的目的是实现类与类之间解耦,其次是客户端不需要知道这个对象是如何被穿创建 ...