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把对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...
随机推荐
- Mui 微信支付、支付宝支付
利用mui 发起手机微信和支付宝支付 payStatement :调起微信支付接口的参数 参考文档: https://pay.weixin.qq.com/wiki/doc/api/app/app.ph ...
- IDEA复制多行及对多行代码上下左右移动
复制: 复制一行可不需要选中 多行需要选中 mac:command+D window:ctrl+D 移动: 选中代码 左移:tab+shift 右移:tab 上移:shift+alt+向上方向键 下移 ...
- [考试反思]0920csp-s模拟测试48:弱小
注:T1全场46个人里42个AC了. %%%zkt也AK了呢越来越强啊 我是真的越来越弱了吗? 我到底在干什么... 在难度递增的题里分数递增... 考试过程大体还好,但是如此快速地WA掉T1也真是蠢 ...
- 同余类BFS的一些瞎吹
同余类BFS的题,是个OIer基本上都会见过一些,最好的例子就是NOIP 2018 day1 T2---货币系统 虽然这题其实是什么背包就能解决的题目,但数据一变大,出题人坏一点,就没了.... 同 ...
- 手写Spring框架,加深对Spring工作机制的理解!
在我们的日常工作中,经常会用到Spring.Spring Boot.Spring Cloud.Struts.Mybatis.Hibernate等开源框架,有了这些框架的诞生,平时的开发工作量也是变得越 ...
- 易初大数据 2019年11月14日 spss笔记 王庆超
“均匀分布”的随机数 需要打开本章的数据文件“sim.sav.”. 1.设置随机数种子 1选择[转换]--[随机数字生成器],勾选‘设置起点’,并在‘固定值’ 的下‘值’中输入一个用户给定的数值.该数 ...
- PHP压缩文件夹的方法
PHP压缩文件夹的方法<pre> public function addFileToZip($path, $zip) { $handler = opendir($path); //打开当前 ...
- Springboot中的缓存Cache和CacheManager原理介绍
背景理解 什么是缓存,为什么要用缓存 程序运行中,在内存保持一定时间不变的数据就是缓存.简单到写一个Map,里面放着一些key,value数据,就已经是个缓存了 所以缓存并不是什么高大上的技术,只是个 ...
- JSON《===》JavaBean的相互转换
1.JSON的作用和好处 在JavaWeb项目中前后端直接的交互,接口之间的对接等等,基本离不开JSON. JSON: 全称JavaScript Object Notation(JavaScript ...
- Ansible之入门简介
一.ansible简介 ansible是一款由python语言编写的一款自动化运维工具,它集合了众多运维工具(puppet.cfengine.chef.func.fabric)优点,实现了批量系统配置 ...