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 ...
随机推荐
- php中parse_url函数解析
1.在php开发过程中我们经常要用到用户上传文件这个功能,那么用户上传文件我们肯定要知道用户上传文件的合法性,那么我们就要从url中获取文件的扩展名.那么就会用到parse_url()这个函数. pa ...
- python中matplotlib.pyplot中cm的属性
https://matplotlib.org/gallery/color/colormap_reference.html
- vue-router重定向 不刷新问题
前阵子太忙了,自己一个人一边开发着新项目,一边维护着旧项目,没时间写博客,终于让我腾出时间了.废话少说,开始正文. 问题描述: 之前项目是angular开发的,后来用vue重构后.项目路径和vue路径 ...
- js-ES6学习笔记-Class(3)
1.Class之间可以通过extends关键字实现继承. class ColorPoint extends Point { constructor(x, y, color) { super(x, y) ...
- Linux 多个vi、vim进程编辑同一文件时的临时文件问题
多个vi.vim进程编辑同一文件时的临时文件问题 by:授客 QQ:1033553122 使用vi.vim编辑文件,实际是先copy一份临时文件并映射到内存里进行编辑,所以你编辑的是临时文件,不是 ...
- 绝对良心提供百度网盘的jdk1.8源码下载包含sun包的
但是openjdk网站有提供的: http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/6bfaecb8ff77/src/share/classes/ 或者直 ...
- 大数据【四】MapReduce(单词计数;二次排序;计数器;join;分布式缓存)
前言: 根据前面的几篇博客学习,现在可以进行MapReduce学习了.本篇博客首先阐述了MapReduce的概念及使用原理,其次直接从五个实验中实践学习(单词计数,二次排序,计数器,join,分 ...
- [Android] 布局优化技巧
看了一些关于优化布局的资料,了解了很多平时不怎么注意的问题,于是把资料整理了一下,一部分内容是翻译来的,一部分是自己理解加上的.每部分内容都有demo,有些资料里的demo比较好的,我就直接拿来用了: ...
- TSQL使用ADHOC访问Excle文件
如题,今天正好碰到这个问题,现将相关知识点记录如下: --开启高级配置功能 reconfigure --开启导入功能 reconfigure --允许在进程中使用ACE.OLEDB.12 --允许使用 ...
- 小慢歌之基于RHEL8/CentOS8的网络IP配置详解
➡ 在rhel8(含centos8)上,没有传统的network.service,在/etc/sysconfig/network-scripts/里也看不到任何脚本文件,那么该如何进行网络配置呢. ➡ ...