今日内容

  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的更多相关文章

  1. Spark Streaming揭秘 Day32 WAL框架及实现

    Spark Streaming揭秘 Day32 WAL框架及实现 今天会聚焦于SparkStreaming中非常重要的数据安全机制WAL(预写日志). 设计要点 从本质点说,WAL框架是一个存储系统, ...

  2. day32 进程

    上午: # 1 开启子进程 #target #args # if __name__ == '__main__' #start() # 2.其它的方法: #方法: #terminate() #is_al ...

  3. day32——进程、操作系统

    day32 进程的基础 程序 一堆静态的代码文件 进程 一个正在运行的程序进程.抽象的概念 被谁运行? 由操作系统操控调用交于CPU运行 ​ 操作系统 管理控制协调计算机中硬件与软件的关系 操作系统的 ...

  4. day32 HTML

    day32 HTML 什么是前端 只要是跟用户打交道的界面都可以称之为前端 # eg:电脑界面, 手机界面,平板界面, 什么是后端? eg:python, java,php,go, 不跟用户直接打交道 ...

  5. javascript DOM,它到底是什么-------Day32

    这一晚上看的我是头疼不已啊,为什么呢? 终究是半路出家,我对javascript的理解仅仅停留在:调用javascript,改变页面样式,元素和实现一些事件的响应,尽管须要的时候可能会用,可是到底使用 ...

  6. Python全栈之路-Day32

    1 类的__slots__ #!/usr/bin/env python # __Author__: "wanyongzhen" # Date: 2017/4/25 # 只能定义__ ...

  7. Day3-2 函数之递归

    递归 定义:一个函数在 内部调用自己,就称为递归. # 如何让10不停的除以2,直到不能除为止. n = 10 while True: n = int(n /2) print(n) if n == 0 ...

  8. day32 process模块用法

    昨日作业: 服务端: 服务端: from socket import * from multiprocessing import Process def server(ip,port): server ...

  9. day32基于tcp协议的远程执行命令

    客户端 from socket import *import structimport json client = socket(AF_INET, SOCK_STREAM)client.connect ...

随机推荐

  1. python-观察者模式

    源码地址:https://github.com/weilanhanf/PythonDesignPatterns 说明: 存在这样的一种情况:公司领导再开例会那天临时有事,他让秘书给所有会上员工群发了一 ...

  2. PHP中NOTICE错误常见解决方法

    对于初学者,肯定会遇到不同的错误提示,比如:警告,致命,等等,其中NOTICE错误等级最低,页面中,好多类似 Notice: Use of undefined constant title - ass ...

  3. css语法和基本知识

    1.CSS全称为“层叠样式表”,它主要是用于定义HTML内容在浏览器内的显示样式,如文字大小.颜色.字体加粗等. 注:使用CSS样式的一个好处是通过定义某个样式,可以让不同网页位置的文字有着统一的字体 ...

  4. BZOJ3108 [cqoi2013]图的逆变换

    Description 定义一个图的变换:对于一个有向图\(G=(V, E)\),建立一个新的有向图: \(V'=\{v_e|e \in E\}\),\(E'=\{(v_b, v_e)|b=(u,v) ...

  5. 【代码笔记】iOS-4个可以单独点击的button

    一,效果图. 二,工程图. 三,代码. ViewController.m #import "ViewController.h" @interface ViewController ...

  6. Input type=number 样式清除

    /* 普通IE浏览器 样式清除 */ input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{ -webkit-appear ...

  7. Flask结合Redis消息队列实现电影弹幕

    用到的弹幕播放器插件:dplayer.js(开源) 1.安装Redis 2.安装flask-redis包 pip install flask-redis3.下载dplayer 页面搭建 1.引入资源 ...

  8. Python 开发者在迁移到 Go(lang) 时需要知道哪些事?

    [编者按]本文最早由 Repustate 发布,主要介绍将代码迁移至 Go(lang) 时的注意事项.文章系国内 ITOM 管理平台 OneAPM 编译呈现,以下为正文. 这是一篇讲述将大块 Pyth ...

  9. c# 通过GroupBy 进行分组

    有时候我们需要数据根据一些字段进行分组,这时候用orderBy很方便.不多说了.直接上代码: class Ma { public int number { get; set; } public str ...

  10. 【转】MySQL双主一致性架构优化

    [原文]https://www.toutiao.com/i6594414914838725133/ 一.双主保证高可用 MySQL数据库集群常使用一主多从,主从同步,读写分离的方式来扩充数据库的读性能 ...