python的socket编程执行顺序_Python篇-Socket网络编程
TZ:多读英文,少点烦躁
一 : 科普一分钟
简单来说Socket就是对TCP/IP等网络协议的封装和应用,其重要的两个动作就是发送和接受当我们需要调用网络连接时只需建立Socket连接,Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可。
二: Socket创建客户端与服务端
客户端
1.导入socket模块
import socket
2.创建实体类,发送数据,端口号的作用是连接后具体指定哪个程序响应
#声明 socket 类型,同时生成socket连接对象
client = socket.socket()
#连接ip地址和端口号
client.connect(('www.TianTianbaby.com',9999))
while True:
mes = input(">> :").strip()
if len(mes) == 0:
continue
if mes == 'q':
break
#客户端发送数据
client.send(mes.encode())
#客户端接收服务端返回的数据
data = client.recv(1024)
#打印返回信息
print("recv:",data.decode())
client.close()
服务端
1.导入socket模块
import socket,os
2.创建实体类接收数据
server = socket.socket()
#绑定要监听的端口
server.bind(('www.TianTianbaby.com',9999))
#监听,参数为最大监听数量
server.listen(5)
print("等待ing")
while True:
#conn就是客户端连过来而在服务器端为其生成的一个连接实例
conn, addr = server.accept()
while True:
#接收数据,参数最大为 1024*8
data = conn.recv(1024)
print("Severrecv:",data)
#客户端断开
if not data:
print("client has lost")
break
#把执行的数据返回给客户端
res = os.popen(data).read()
conn.send(res)
server.close()
三:Socket粘包
产生原因:
1.发送端需要等本机的缓冲区满了以后才发送出去,造成粘包(发送数据时间间隔很端,数据很小,会合在一个起,产生粘包)
2.接收端不及时接收缓冲区的包,造成多个包接受(客户端发送一段数据,服务端只收了一小部分,服务端下次再收的时候还是从缓冲区拿上次遗留的数据 ,就产生粘包)
解决办法: 介绍两个比较简单的方法
1.sleep 让上一次缓冲区超时.不等下一条.(不建议用)
缺点:造成速度延迟
conn.send(str(len(cmd_res.encode())).encode())
time.sleep(0.5)
conn.send(cmd_res.encode())
2.插入交互 : 插入一个接受响应,如果不响应,第一个发送就不会等待.解决了粘包问题
conn.send(str(len(cmd_res.encode())).encode())
client_ack = conn.rec(1024)#等待确认
conn.send(cmd_res.encode())
另一端手动加一个响应:
伪代码:上一次接收 client.recv(1024)
# client.send("准备好接收了,可以发了".encode())
四:SocketServer服务端
SocketServer简化了网络服务器的编写。在进行socket创建时,使用SocketServer会大大减少创建的步骤.
使用方法:
创建服务器的步骤。首先,你必须创建一个请求处理类,它是BaseRequestHandler的子类并重载其handle()方法。
实例化一个服务器类,传入服务器的地址和请求处理程序类。
调用handle_request()(一般是调用其他事件循环或者使用select())或serve_forever()。
继承关系:
+------------+
| BaseServer |
+------------+
|
v
+-----------+ +------------------+
| TCPServer |------->| UnixStreamServer |
+-----------+ +------------------+
|
v
+-----------+ +--------------------+
| UDPServer |------->| UnixDatagramServer |
+-----------+ +--------------------+
代码步骤:
1导入模块SocketServer
import socketserver
2.创建类
class MyTCPHandler(socketserver.BaseRequestHandler):
#与客户端所有的交互在handle完成
def handle(self):
while True:
try:
#接收客户端数据
self.data = self.request.recv(1024).strip()
print("ip",self.client_address[0])
print(self.data)
# 如果客户端断开
if not self.data:
print(self.client_address, "断开了")
break
#给客户端发送数据
self.request.sendall(self.data.upper())
#如果客户端断开了
except ConnectionResetError as e:
print("err",e)
break
3.创建实例
if __name__ == "__main__":
HOST,PORT = 'www.TianTianbaby.com',9999
server =
#创建一个多并发的服务
socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandler)
#永久打开
server.serve_forever()
五:总结
数据链路层上识别mac(物理)地址,在网络层识别ip地址,而在传输层基于一些基本的协议如TCP/IP,'UDP'建立连接发送消息.
TCP/IP要建立三次握手,四次接受,上学时候学习网络时候都有学习.
既然是建立的连接,就要发送和接受消息,所以侧重点就是发和收,每个协议都要自己去实现发和收.比较繁琐麻烦.
简单来说socket就是简化那么复杂的东西,封装给我们一个可以建立连接的模块方便我们使用.
在使用socket的时候 我们只关心如何收和发就好了,编写出更高效的程序
附:在评论处留下邮箱地址即可获得全注释源码
python的socket编程执行顺序_Python篇-Socket网络编程相关推荐
- python类中方法的执行顺序-Python实例化class的执行顺序实例方法
Python中实例化class的执行顺序示例详解 前言 本文主要介绍了关于Python实例化class的执行顺序的相关内容,下面话不多说了,来一起看看详细的介绍吧 Python里对类的实例化时有怎样的 ...
- Python 的装饰器执行顺序问题(二)
2019独角兽企业重金招聘Python工程师标准>>> 一.问题分析 具体问题可见:Python 的装饰器执行顺序问题 原代码如下: def testwra(func):print ...
- Java核心类库篇8——网络编程
Java核心类库篇8--网络编程 1.七层网络模型 OSI(Open System Interconnect),即开放式系统互联,是ISO(国际标准化组织)组织在1985 年研究的网络互连模型. 当发 ...
- 【JavaSe】网络编程篇(一) 网络编程入门
JavaSe·网络编程篇(一) 网络编程入门 1. 软件结构 C/S结构:全称为Client/Server结构,是指客户端和服务器结构.常见程序有QQ.百度网盘等软件 B/S结构 :全称为Browse ...
- python装饰器执行顺序_python unittest单元测试框架-3用例执行顺序、多级目录、装饰器、fixtures...
1.用例执行顺序 unittest默认会按照ascii码的顺序,依次执行.类名--方法名排序,使用discover也是默认排序.如果不想使用默认排序,就使用testsuite测试集的方式. impor ...
- python两个for循环顺序_python两个for循环顺序_Python编程基础2——顺序、循环、选择...
1.课前阅读 1.1学习目标 ①了解Python编程语言中的三大编程结构. ②重点:Python中如何使用顺序.循环.选择结构. ③学习第一个Python库函数. 1.2实践内容 ①学习使用Pytho ...
- python如何控制程序的运行顺序_Python流程控制-1 顺序执行
流程控制指的是代码运行逻辑.分支走向.循环控制,是真正体现我们程序执行顺序的操作.流程控制一般分为顺序执行.条件判断和循环控制. 顺序执行 Python代码在执行过程中,遵循下面的基本原则: 普通语句 ...
- python两个装饰器执行顺序_python中多个装饰器的执行顺序
今天讲一下python中装饰器的执行顺序,以两个装饰器为例. 装饰器代码如下: def wrapper_out1(func): print('--out11--') def inner1(*args, ...
- python多个装饰器执行顺序_Python面试题之多个装饰器执行顺序
疑问 大部分涉及多个装饰器装饰的函数调用顺序时都会说明它们是自上而下的,比如下面这个例子:def decorator_a(func): print 'Get in decorator_a' def i ...
最新文章
- shell脚本中的case语句使用要点
- python中decode和encode的区别
- 孕期骨质疏松危害大 及时补钙很重要
- Windows Phone Developer Tools Beta 发布
- SQL Server调优系列基础篇(联合运算符总结)
- 大数据对六大领域的挑战
- adb 重命名_adb中常用的命令
- ARM汇编编程基础之一 —— 寄存器
- ubuntu手动修改anaconda环境变量
- MyBatis框架笔记03:MyBatis实现CRUD
- 初次汇编程序 masm5
- 1.R语言基本绘图分类
- 国内各大企业邮箱,选择看重哪几个方面?
- [AHK]按文件的年份归档到不同年份目录里
- 【技术分享】Ubuntu20.04启动LGSVL-2021.03闪退解决方案
- Docker Harbor——拥有独特UI界面的私有仓库
- 网易AI携手新东方布局“AI+教育”
- 城市精细化治理过程中的智能图像识别如何更精准、更智能?
- Linux系统重装时保留重要分区
- 再白也能学会的C-C语言的前世今生
热门文章
- 图片与Byte相互转换,文件和字节流的转换方法
- c语言之 malloc函数详解 在堆中动态分配内存malloc和new的区别
- IP地址不是唯一的吗?为什么路由器的IP地址都是这样的呢?
- IOS开发基础之使用Xcode12.3连线storyboard与属性
- Python连接Mysql数据库入门
- 遍历同辈节电的方法_JQuery遍历DOM节点的方法
- 之全能忙内_全能水适能指导员流行到山西,你是否跟上?
- python中什么是实例-在Python中使用’__rsub__’方法的典型实例是什么?
- 计算机课讲什么学生爱学,学生党“最喜欢”的4门课程,尤其是最后1门,学渣:我们的最爱...
- Matlab中的类(Class),Matlab中的class用法