day32
今日内容
1、基于TCP协议(通信循环)
2、基于TCP协议(连接循环)
3、粘包问题
4、模拟SSH实现远程执行命令
服务器端
###############################################################################################
from socket import *
import json
import struct Sever = socket(AF_INET, SOCK_STREAM)
IP = '192.168.13.131'
PORT = 8084
Sever.bind((IP, PORT)) Sever.listen(5)
while True: #这里说明了循环链接问题的实现方式,在Sver.accept()上面加一个循环可以使得在客户端断开连接后,服务器再次回到这里继续处于阻塞状态,等待下一个客户端请求连接
conn, address = Sever.accept()
while True:#这里说明了通信循环问题的实现方式,在data = conn.recv(1024)上面这样服务器可以循环的接收客户端的消息,客户端也是要做相同的循环
try:
data = conn.recv(1024)
num = data.decode('utf-8')[0]
if num == '1':
print('从客户端接收到的数据:', data.decode('utf-8'))
#解决粘包问题,在数据前面添加一个报头
with open(r'%s' % data[1::].decode('utf-8'), mode='rb') as f:
msg = b''
for i in f.readlines():
msg += i
file_size = len(msg)
header_dic = {
'file_name': 'aaa',
'file_number': '123456',
'file_size': file_size
}
header_json = json.dumps(header_dic)
header = struct.pack('i', len(header_json))
conn.send(header)
conn.send(header_json.encode('utf-8'))
conn.send(msg)
elif num =='2':
header = conn.recv(4)
header_size = struct.unpack('i', header)[0]
header_json = conn.recv(header_size)
header_dic = json.loads(header_json)
total_size = header_dic['file_size']
print(header_dic)
file_msg = b''
recv_size = 0
with open(r'E:\code\GoodDog\day32\文件上传下载之终极版本\服务器端接收', 'wb') as f:
while recv_size < total_size:
data = conn.recv(1024)
recv_size += len(data)
file_msg += data
f.write(data)
except ConnectionResetError:
break
conn.close()
################################################################################################
客户端
#####################################################################################################
from socket import *
import json
import struct PC = socket(AF_INET,SOCK_STREAM)
IP='192.168.13.131'
PORT = 8084
PC.connect((IP,PORT)) while True:
msg = input('文件地址:').strip()
if len(msg) == 0:continue
PC.send(msg.encode('utf-8'))
if msg[0] == '1':
header = PC.recv(4)
header_size = struct.unpack('i', header)[0]
header_json = PC.recv(header_size)
header_dic = json.loads(header_json)
total_size = header_dic['file_size']
print(header_dic)
file_msg = b''
recv_size = 0
with open(r'E:\code\GoodDog\day32\文件上传下载之终极版本\客户端接收.txt', 'wb') as f:
while recv_size < total_size:
data = PC.recv(1024)
recv_size+=len(data)
file_msg+=data
f.write(data)
elif msg[0] == '2':
with open(r'E:\code\GoodDog\day32\文件上传下载之终极版本\客户端接收.txt', mode='rb') as f:
msg = b''
for i in f.readlines():
msg += i
file_size = len(msg)
print(file_size)
header_dic = {
'file_name': 'aaa',
'file_number': '123456',
'file_size': file_size
}
header_json = json.dumps(header_dic)
header = struct.pack('i', len(header_json))
PC.send(header)
PC.send(header_json.encode('utf-8'))
PC.send(msg)
print(msg)
#####################################################################################################
模拟SSH实现远程执行命令
服务器
#######################33##############################################################################
import socket
import subprocess
import struct
Sever = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ip = '127.0.0.7'
port = 3312
Sever.bind((ip,port)) Sever.listen(2)
while True:
conn,address = Sever.accept()
while True:
try:
msg = conn.recv(1024)
obj = subprocess.Popen(r'%s'%msg.decode('utf-8'), shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
stdout = obj.stdout.read()
stderr = obj.stderr.read()
header = struct.pack('i', len(stdout) + len(stderr))
conn.send(header)
conn.send(stdout)
conn.send(stderr)
except ConnectionResetError:
break
conn.close() Sever.close()
#######################################################################################################
客户端
################################################################################################################
import socket
import struct
PC= socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ip = '127.0.0.7'
port = 3312
PC.connect((ip,port))
while True:
m = input('请输入:').strip()
PC.send(m.encode('utf-8'))
header = PC.recv(4)
total_size = struct.unpack('i',header)[0]
cmd_res = b''
recv_size = 0
while recv_size < total_size:
date = PC.recv(1024)
recv_size+=len(date)
cmd_res+=date
print(cmd_res.decode('gbk'))
################################################################################################################
day32的更多相关文章
- Spark Streaming揭秘 Day32 WAL框架及实现
Spark Streaming揭秘 Day32 WAL框架及实现 今天会聚焦于SparkStreaming中非常重要的数据安全机制WAL(预写日志). 设计要点 从本质点说,WAL框架是一个存储系统, ...
- day32 进程
上午: # 1 开启子进程 #target #args # if __name__ == '__main__' #start() # 2.其它的方法: #方法: #terminate() #is_al ...
- day32——进程、操作系统
day32 进程的基础 程序 一堆静态的代码文件 进程 一个正在运行的程序进程.抽象的概念 被谁运行? 由操作系统操控调用交于CPU运行 操作系统 管理控制协调计算机中硬件与软件的关系 操作系统的 ...
- day32 HTML
day32 HTML 什么是前端 只要是跟用户打交道的界面都可以称之为前端 # eg:电脑界面, 手机界面,平板界面, 什么是后端? eg:python, java,php,go, 不跟用户直接打交道 ...
- javascript DOM,它到底是什么-------Day32
这一晚上看的我是头疼不已啊,为什么呢? 终究是半路出家,我对javascript的理解仅仅停留在:调用javascript,改变页面样式,元素和实现一些事件的响应,尽管须要的时候可能会用,可是到底使用 ...
- Python全栈之路-Day32
1 类的__slots__ #!/usr/bin/env python # __Author__: "wanyongzhen" # Date: 2017/4/25 # 只能定义__ ...
- Day3-2 函数之递归
递归 定义:一个函数在 内部调用自己,就称为递归. # 如何让10不停的除以2,直到不能除为止. n = 10 while True: n = int(n /2) print(n) if n == 0 ...
- day32 process模块用法
昨日作业: 服务端: 服务端: from socket import * from multiprocessing import Process def server(ip,port): server ...
- day32基于tcp协议的远程执行命令
客户端 from socket import *import structimport json client = socket(AF_INET, SOCK_STREAM)client.connect ...
随机推荐
- python学习之老男孩python全栈第九期_day003作业
1. 有变量name = "aleX leNb" 完成如下操作:(1) 移除 name 变量对应的值两边的空格,并输出处理结果name = ' aleX leNb 'print(n ...
- 学习html/css基础的重点笔记
1.权重问题 内联样式表 > id选择符 > class选择符 > 类型选择符(所有html标签名称) 内联样式表 > 内部样式表.外部样式表 内部样式表.外部样式表的权重与书 ...
- 纯小白入手 vue3.0 CLI - 2.1 - 组件 ( component )
vue3.0 CLI 真小白入手全教程系列:https://www.cnblogs.com/ndos/category/1295752.html 我的 github 地址 - vue3.0Study ...
- android踩坑记录之view.setVisiblity()
问题 在某次做悬浮侧边栏的时候,遇到了一个问题:我用windowManager创建的悬浮侧边栏.点击中心view展开菜单,再次点击则隐藏菜单,如此简单的一个需求,却遇到了奇怪的问题,我没有对view的 ...
- Retrofit+RxJava(1)-在Android Studio中配置
在build.gradle中添加 //加入retrolambda需要的plugin声明 apply plugin: 'me.tatarka.retrolambda' //retrolambda的编译路 ...
- 【转】CentOS 6.6 升级GCC G++ (当前最新版本为v6.1.0) (完整)
原文地址:https://www.cnblogs.com/lzpong/p/5755678.html 我这里是centos7 升级到gcc8.1,过程差不多,参考这篇文章,记录一下. ---原文--- ...
- Windows Server查看和记录远程登录信息的方法
前两天我的一台Windows Server 2012R2的服务器中了传说中的cryptowall病毒,所有数据文件都被加密,需要我支付1个比特币才能解码.幸好服务器上没什么重要的文件,还好我没钱,我选 ...
- 《MySQL技术内幕:InnoDB存储引擎(第2版)》书摘
MySQL技术内幕:InnoDB存储引擎(第2版) 姜承尧 第1章 MySQL体系结构和存储引擎 >> 在上述例子中使用了mysqld_safe命令来启动数据库,当然启动MySQL实例的方 ...
- Operating System Error Codes
How To Fix Windows Errors Click here follow the steps to fix Windows and related errors. Instruction ...
- [转]Redis学习---Redis高可用技术解决方案总结
[原文]https://www.toutiao.com/i6591646189714670093/ 本文主要针对Redis常见的几种使用方式及其优缺点展开分析. 一.常见使用方式 Redis的几种常见 ...