【python自动化第八篇:网络编程】
一、拾遗
动态导入模块
目的是为了在导入模块的过程中将模块以字符的格式导入。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:wanghui
lib = __import__("lib.aa") #传统方法
lib.aa import importlib
aa = importlib.import_module("lib.aa") #官方做法
print(aa.C().name)
断言
类似于if,实际的意思就是如多对应的条件为真就执行,不为真就报错。
assert type(1223) is str
print("this is str")
#等同于
if type(1223) is str:exit("must be int")
print("this is str")
二、socket继续
1、浅谈server端的原理:
(1)、申明socket实例 server = socket.socket(AF.INET(地址簇),sock.SOCK_STREAM(代表tcp/ip))
地址簇分类:socket.AF_INET ----> ipv4 , socket.AF_INET6 -------> ipv6 , socket.AF_UNIX --------> 本地通信
协议类型:socket.SOCK_STREAM -----> tcp/ip , socket.SOCK_DGRAM -----> udp
(2)、绑定ip地址和端口 server.bind(("localhost",port))
(3)、开始监听:while True:
conn,addr = server.accept() 阻塞状态
(4)、循环接受信息
while True:
print("new conn",addr) #打印连接的客户端ip
data = conn.recv(1024) #接受数据大小(官方最大建议8192),这边接收数据的时候默认也是阻塞的
if not data: ***如果客户端 已断开的话conn.recv就会接收到空数据
break
conn.send(data.upper()) #发送数据
浅谈客户端的原理:
(1)、实例化一个socket client = socket.socket()
(2)、定义一个 链接的地址和端口 client.connect(("server_ip",port))
(3)、这会儿就可以发数据了 client.send(data)
(4)、接收数据 client.recv()
2、通过socket实现一个简单的ssh协议:
client端:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:wanghui
import socket,os
client = socket.socket() #实例化socket
client.connect(("localhost",9999)) #开始连接啦while True: #发送数据啦cmd = input("请输入命令>>:").strip()if len(cmd) == 0:continue #如果长度为0,就继续返回循环client.send(cmd.encode('utf-8')) #发送命令(byte)cmd_res = client.recv(1024) #接收返回结果print(cmd_res.decode()) #打印结果
client.close() #关闭连接
server端:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:wanghui
import socket,osserver = socket.socket() #申明实例
server.bind(('localhost',9999)) #绑定ip和端口
server.listen() #等待连接while True:conn,addr= server.accept() #监听print("开始连接啦",addr)while True: #正式接受数据啦print("开始新连接啦")data = conn.recv(1024) #定义传输大小if not data: #如果客户端断开,那么就退出此次接收,重新回到监听状态breakprint("开始 执行客户端命令",data)cmd_res = os.popen(data.decode()).read() #读取客户端命令(bytes转换成str)print("接受之前:",len(cmd_res))if len(cmd_res) == 0:cmd_res = "cmd has no output ..."conn.send(cmd_res.encode('utf-8')) #向端发送数据,必须是bytesprint("发送完成!")
server.close() #断开连接
上面的基本连接模式会出现客户端发送的指令客户端不能一次性全部返回的问题,这样的话解决方式只能有:超时和确认缓冲区多少次发完的问题
然而多少次将缓冲区的内容发完呢?不晓得。。。所以只能通过在超时问题上做文章了
client:
#!/usr/bin/env python # -*- coding:utf-8 -*- #Author:wanghui import socket,os client = socket.socket() #实例化socket client.connect(("localhost",9999)) #开始连接啦while True: #发送数据啦cmd = input("请输入命令>>:").strip()if len(cmd) == 0:continue #如果长度为0,就继续返回循环client.send(cmd.encode('utf-8')) #发送命令(byte)cmd_res_size = client.recv(1024) #接受返回数据的大小print("接受的数据",cmd_res_size) #打印接收大小received_size = 0received_data = b''while received_size < int(cmd_res_size.decode()): #只要不相等就一直收data = client.recv(1024)received_size += len(data) #每次接收到的数据有可能小于1024,所以要用len判断received_data += data #每次读取进来的data写入received_data# print(data.decode())else:print("cmd rees received done",received_size)print(received_data.decode()) client.close() #关闭连接
View Code
server:
#!/usr/bin/env python # -*- coding:utf-8 -*- #Author:wanghui import socket,osserver = socket.socket() #申明实例 server.bind(('localhost',9999)) #绑定ip和端口 server.listen() #等待连接while True:conn,addr= server.accept() #监听print("开始连接啦",addr)while True: #正式接受数据啦print("等待新指令:")data = conn.recv(1024) #定义传输大小if not data: #如果客户端断开,那么就退出此次接收,重新回到监听状态print("客户端已经断开!")breakprint("执行命令",data)cmd_res = os.popen(data.decode()).read() #读取客户端命令(bytes转换成str)print("接受之前:",len(cmd_res))if len(cmd_res) == 0:cmd_res = "cmd has no output ..."conn.send(str(len(cmd_res.encode())).encode('utf-8')) #先发大小给客户端conn.send(cmd_res.encode('utf-8')) #向客户端发送数据,必须是bytesprint("发送完成!") server.close() #断开连接
View Code
3.粘包问题
server连续调用send的时候缓冲区会将挨着的两次操作发给客户端,导致两次send的内容都同时发给了客户端,所以其中的一个方法就是在服务器端的send之间加入sleep时间,可以解决这个问题
server:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:wanghui
import socket,os,timeserver = socket.socket() #申明实例
server.bind(('localhost',9999)) #绑定ip和端口
server.listen() #等待连接while True:conn,addr= server.accept() #监听print("开始连接啦",addr)while True: #正式接受数据啦print("等待新指令:")data = conn.recv(1024) #定义传输大小if not data: #如果客户端断开,那么就退出此次接收,重新回到监听状态print("客户端已经断开!")breakprint("执行命令",data)cmd_res = os.popen(data.decode()).read() #读取客户端命令(bytes转换成str)print("接受之前:",len(cmd_res))if len(cmd_res) == 0:cmd_res = "cmd has no output ..."conn.send(str(len(cmd_res.encode())).encode('utf-8')) #先发大小给客户端#time.sleep(0.5) #防止粘包的一种方法client_ack= conn.recv(1024) #等待确认print('ack from client:',client_ack)conn.send(cmd_res.encode('utf-8')) #向客户端发送数据,必须是bytesprint("发送完成!")
server.close() #断开连接
client:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:wanghui
import socket,os
client = socket.socket() #实例化socket
client.connect(("localhost",9999)) #开始连接啦while True: #发送数据啦cmd = input("请输入命令>>:").strip()if len(cmd) == 0:continue #如果长度为0,就继续返回循环client.send(cmd.encode('utf-8')) #发送命令(byte)cmd_res_size = client.recv(1024) #接受返回数据的大小print("接受的数据",cmd_res_size) #打印接收大小client.send("准备确认啦".encode('utf-8'))received_size = 0received_data = b''while received_size < int(cmd_res_size.decode()): #只要不相等就一直收data = client.recv(1024)received_size += len(data) #每次接收到的数据有可能小于1024,所以要用len判断received_data += data #每次读取进来的data写入received_data# print(data.decode())else:print("cmd rees received done",received_size)print(received_data.decode())
client.close() #关闭连接
4.简易的文件传输案例
server端的设计:
- 读取文件名
- 检测文件是否存在
- 打开文件
- 检测文件大小
- 发送文件大小和MD5值给客户端
- 等待客户端确认
- 开始边读取边发数据
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:wanghui
import socket,os,time,hashlibserver = socket.socket() #申明实例
server.bind(('localhost',9999)) #绑定ip和端口
server.listen() #等待连接while True:conn,addr= server.accept() #监听print("开始连接啦",addr)while True: #正式接受数据啦print("等待新指令:")data = conn.recv(1024) #定义传输大小if not data: #如果客户端断开,那么就退出此次接收,重新回到监听状态print("客户端已经断开!")breakcmd,filename = data.decode().split() #分割命令和文件名称print(filename) #打印文件名if os.path.isfile(filename): #判断是否为文件f = open(filename,'rb') #打开文件m = hashlib.md5() #定义MD5加密方式file_size = os.stat(filename).st_size #确定文件大小conn.send(str(file_size).encode()) #发送文件大小conn.recv(1024) #等待确认for line in f: #读取文件m.update(line) #边读取边加密conn.send(line) #边发送文件print('file md5',m.hexdigest()) #打印文件的MD5f.close() #关闭文件conn.send(m.hexdigest().encode()) #发送MD5print("发送完成!!")server.close()
client端:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:wanghui
import socket,os,hashlibclient = socket.socket() #实例化socket
client.connect(("localhost",9999)) #开始连接啦while True: #发送数据啦cmd = input(">>:").strip()if len(cmd) == 0:continue #如果长度为0,就继续返回循环if cmd.startwith('get'): #定义开始client.send(cmd.encode()) #客户端发送命令server_resbonce = client.recv(1024) #接收服务器端数据print("server resbonce:",server_resbonce)client.send("准备接收文件".encode())file_total_size = int(server_resbonce.decode()) #定义接受的文件总大小received_size=0 #初始接收文件filename = cmd.split()[1] #获取文件名f = open(filename + '.new','wb') #开始写文件m = hashlib.md5() #定义MD5加密while received_size < file_total_size: #如果接收的文件小于总文件大小,就执行如下data = client.recv(1024) #定义接收文件received_size+=len(data) #接受的文件大小变化m.update(data) #生成客户端接受的MD5f.write(data) #写入数据#print(file_total_size,received_size) #打印文件接受大小和总大小else:new_file_md5 = m.hexdigest()print("接受完了文件:",file_total_size,received_size)f.close() #关闭文件server_md5 = client.recv(1024) #接收服务器端MD5print(server_md5,new_file_md5) #对比MD5client.close()
转载于:https://www.cnblogs.com/wanghui1991/p/5865848.html
【python自动化第八篇:网络编程】相关推荐
- python网络自动化实例_【python自动化第八篇:网络编程】
一.拾遗 动态导入模块 目的是为了在导入模块的过程中将模块以字符的格式导入. #!/usr/bin/env python # -*- coding:utf-8 -*- #Author:wanghui ...
- python的多线程和多进程网络编程
二十八.python的多线程和多进程网络编程 线程和进程关系: 进程是具有独立功能的程序,进程是系统进行资源分配和调度的一个独立单位 线程是进程的一个实体,是cpu调度的基本单位,它是比进程更小的能独 ...
- 黑马程序员_java高级篇网络编程TCP实战Day8(上)
---------------------ASP.Net+Android+IOS开发.Net培训.期待与您交流! ----------- 黑马程序员_java高级篇网络编程TCP实战Day8(上) ( ...
- 2022Java学习笔记八十八(网络编程:UDP通信,一发一收,多发多收消息接收实现)
2022Java学习笔记七十八(网络编程:UDP通信,一发一收,多发多收消息接收实现) 一.快速入门 DatagramPacket:数据包对象 实例代码 定义发送端 package com.zcl.d ...
- java自动化测试语言高级之网络编程
java自动化测试语言高级之网络编程 文章目录 java自动化测试语言高级之网络编程 Java 网络编程 Java 网络编程 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来 ...
- python socket 主动断开_Python网络编程tcp详解(基础篇十四)
网络编程tcp 1 TCP详解 <1> tcp概述 TCP:英文全拼(Transmission Control Protocol)简称传输控制协议,它是一种面向连接的.可靠的.基于字节流的 ...
- unet网络python代码详解_python网络编程详解
最近在看<UNIX网络编程 卷1>和<FREEBSD操作系统设计与实现>这两本书,我重点关注了TCP协议相关的内容,结合自己后台开发的经验,写下这篇文章,一方面是为了帮助有需要 ...
- python socket tcp客户端_python网络编程socketserver模块(实现TCP客户端/服务器)
摘录python核心编程 socketserver(python3.x版本重新命名)是标准库中的网络编程的高级模块.通过将创建网络客户端和服务器所必须的代码封装起来,简化了模板,为你提供了各种各样的类 ...
- python网络平台_python学习(九) 网络编程学习--简易网站服务器
python `网络编程`和其他语言都是一样的,服务器这块步骤为: `1. 创建套接字` `2. 绑定地址` `3. 监听该描述符的所有请求` `4. 有新的请求到了调用accept处理请求` Pyt ...
最新文章
- 集合70多种推荐算法,东北大学老师用Java写了一个开源库,在GitHub上收获近1500个Star...
- ORACLE 10g 数据库体系结构图
- lvs keepalived
- Interesting Finds: 2008.03.17
- Paper:《First Order Motion Model for Image Animation》翻译与解读
- Oracle基础知识-Oracle不同的启动关闭方式
- SAP官方提供的人脸识别API
- 百万数据下几种SQL性能测试
- 这是小小本周的第六篇,本篇小小将会介绍一个很古老很古老很古老的为什么系列之不能重写service方法。...
- java分布式架构的发展
- 2018-2019-20175203 实验二 《Java面向对象程序设计》
- 记:从百度空间搬家到博客园--写博客要写的舒服
- 绥化二中高考成绩查询2021,2014绥化中考
- 仿今日头条项目——登录注册
- 离散时间傅里叶变换Matlab实现
- winpe做服务器系统备份,如何进pe做系统备份-重装系统怎么备份?
- 【Tools系列】Windows下一款好用的文件搜索工具:XSearch
- 使用proteus仿真验证基尔霍夫定律
- 详细设计说明书的书写格式
- Oracle 300问