网络编程ssh,粘包
1.什么是socket?
TCP,可靠地,面向连接协议,有阻塞rect
udp,不可靠的,无线连接的服务 这里因为不需要阻塞,所以速度会很快,但安全性不高
2.关于客户端退出而服务器未退出的解决办法
import socket
sock=socket.socket() # TCP协议
IP_PORT=("127.0.0.1",8899)
sock.bind(IP_PORT)
sock.listen(5)
while 1:
conn,addr=sock.accept()
while 1:
try:#这里是因为如果当客户端完成登陆后,由于客户端的退出,而
#服务端只是刚刚退出第一层循环,还在等着接收客户端传来的信息,所以
#会报错 只需要加一个异常处理,如果客户端离开则不会等待客户传来信息
#会处于待命状态,等待下一次传入
data=conn.recv(1024).decode("utf8")
print("接收信息:",data)
print("接收信息:",type(data))
print("-----",data.split("|"))
user,pwd=data.strip().split("|")
# 文件操作
flag=False
with open("account","r") as f: for line in f:
print("===",line.strip().split(":"))
username,password=line.strip().split(":")
if username==user and password==pwd:
flag=True
break
if flag:
conn.send(b"success")
else:
conn.send(b"fail")
except Exception as e:
break
客户端
import socket sock=socket.socket() # TCP
sock.connect(("127.0.0.1",8899)) while 1:
user=input("用户名>>>>")
pwd=input("密码>>>>")
val=("%s|%s"%(user,pwd)).encode("utf8")
sock.send(val)
response=sock.recv(1024)
print(response.decode("utf8"))
if response.decode("utf8")=="success":
break
else:
print("用户名或者密码错误!")
continue
3.模拟ssh
import struct #打包
res=struct.pack("i","")#这里可以放数字 print(res)#最终显示的是4个字节
print(len(res))#始终四个字节.长度为4 obj=struct.unpack("i",res)#用于解包,最后显示元祖,后面一逗号结尾
print(obj[0])#获取解包后的数字
#struct模块主要用于当发生粘包时.由于向客户端/服务端发送两个
#字节时,计算机无法判断前后位置,所以又来区分因为打包后固定长度为4
#所以取前四段
b'xxx/xxx/xxx/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'
#就可以区分了
#当然也可以用时间(睡眠)来区分
import subprocess#可以使cmd之间的程序在python中显示
res=subprocess.Popen("dir",#进行命令
shell=True,
stderr=subprocess.PIPE,#终端错误输出stderr
stdout=subprocess.PIPE)# 终端输出stdout
print(res.stdout.read().decode("gbk"))##返回的字节所以用gbk
#可以实现将cmd中的命令显示在python
import socket
import subprocess
server = socket.socket()
server.bind(('127.0.0.1',8008))
server.listen(5)
while True:
print("server is working.....")
conn,addr = server.accept()
# 字节类型
while True:
# 针对window系统
try:
cmd = conn.recv(1024).decode("utf8") # 阻塞#客户端传入的命令需要解码显示成字符串的形式 if cmd == b'exit':
break
# res=subprocess.Popen(cmd,#subprocess模块
# shell=True,
# stderr=subprocess.PIPE,
# stdout=subprocess.PIPE,
# )
# print("stdout",res.stdout.read())
# print("stderr",res.stderr.read().decode("gbk"))
out=res.stdout.read()#终端输出 显示的是使用命令的正确
err=res.stderr.read()#终端错误 显示的是不是系统命令的报错提示 print("out响应长度",len(out))#知道长度才可以使他们逐一实现
print("err响应长度",len(err))
if err:
import struct
header_pack = struct.pack("i", len(err))#首先一定要给出长度,客户端才会跟据长度
#来显示
conn.send(header_pack)
conn.send(err)
else:#没阻塞一次就发过去了
#构建报头
import struct#构建
header_pack=struct.pack("i",len(out))#数字的长度压缩完成报头
print("header_pack",header_pack)
# # 发送报头#将报文连在一起发送
conn.send(str(len(out)).encode("utf8"))#把数字转换成字符串,再转化成字节才可以发过去
# 发送数据
conn.send(out)#整体的数据 except Exception as e:
break
conn.close()
客户端
sk.connect(('127.0.0.1',8008))
while 1:
cmd = input("请输入命令:")
sk.send(cmd.encode('utf-8')) # 字节
if cmd=="":
continue
if cmd == 'exit':
break
header_pack=sk.recv(4)#取前四个字节
data_length=struct.unpack("i",header_pack)[0]#解包
print("data_length",data_length)
'''
b'xxx/xxx/xxx/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'
'''
data_length=int(sk.recv(1024).de- code("utf8"))
print("data_length",data_length)
recv_data_length=0#判断是否小于接收到的字节
recv_data=b""
while recv_data_length<data_length:
data=sk.recv(1024)
recv_data_length+=len(data)#接收多少就是这个
#实现的前提需要总长度,
recv_data+=data
print(recv_data.decode("gbk"))
sk.close()
3.关于粘包
粘包:发送长度和数据但是计算机不知道怎么去区分 两个send计算机不知道怎么区分
我们丢的东西没有丢
1.间隔短 2.文件不大3.
sleep 不让粘包
关于加密
import hashlib # md5=hashlib.md5()
# md5.update(b"hello")#当分别输入hello 和 yaun时 结果与helloyuan
#一样,但是这样的好处是可以分开存储节省内存,要是一次写入那么多
#会疯的
# md5.update(b"yuan")
#
# print(md5.hexdigest())
# print(len(md5.hexdigest())) #helloyuan: d843cc930aa76f7799bba1780f578439
# d843cc930aa76f7799bba1780f578439 #############################################
md5=hashlib.md5() with open("ssh_client.py","rb") as f:
for line in f:
md5.update(line) print(md5.hexdigest()) # f.read() 16位字节
网络编程ssh,粘包的更多相关文章
- Python之路 - 网络编程之粘包
Python之路 - 网络编程之粘包 粘包
- UNIX网络编程——Socket粘包问题
一.两个简单概念长连接与短连接:1.长连接 Client方与Server方先建立通讯连接,连接建立后不断开, 然后再进行报文发送和接收. 2.短连接 Client方与Server每进行一次报文收发交易 ...
- Learning-Python【29】:网络编程之粘包
粘包问题 上一篇博客遗留了一个问题,在接收的最大字节数设置为 1024 时,当接收的结果大于1024,再执行下一条命令时还是会返回上一条命令未执行完成的结果.这就是粘包问题. 因为TCP协议又叫流式协 ...
- 8-2udp和tcp网络编程以及粘包和解决粘包的方法
一 tcp网络编程 server 端 import socket sk=socket.socket() #实例化一个对象 sk.setsockopt(socket.SOL_SOCKET,socket ...
- python socket网络编程之粘包问题详解
一,粘包问题详情 1,只有TCP有粘包现象,UDP永远不会粘包 你的程序实际上无权直接操作网卡的,你操作网卡都是通过操作系统给用户程序暴露出来的接口,那每次你的程序要给远程发数据时,其实是先把数据从用 ...
- Python网络编程,粘包、分包问题的解决
tcp编程中的粘包.分包问题的解决: 参考:https://blog.csdn.net/yannanxiu/article/details/52096465 服务端: #!/bin/env pytho ...
- day32 网络编程之粘包问题
1.最大半连接数 什么是最大半连接数 半连接:在进行TCP协议通信时,客户端与服务器端进行三次握手建立连接,但是有时客户端与服务器端进行了连接申请,服务器端也同意了申请(既已经完成三次握手的两次),此 ...
- Python全栈-网络编程-TCP粘包
一.什么是TCP粘包 C/S架构下,接收方不知道每个消息的发送间隙.也不知道每次应该提取多少个字节的数据,与此同时,TCP是面向连接的,面向流的,收发两端都要有,因此发送端为了将多个发往接收端的数据包 ...
- python网络编程-socket“粘包”(小数据发送问题)
一:什么是粘包 “粘包”, 即服务器端你调用时send 2次,但你send调用时,数据其实并没有立刻被发送给客户端,而是放到了系统的socket发送缓冲区里,等缓冲区满了.或者数据等待超时了,数据才会 ...
随机推荐
- unittest,requests,assertEqual实战演练
请求方式:POST请求url:https://api.apiopen.top/developerLogin请求参数:名称 类型 必须 描述 示例name string 是 账号 peakchaopas ...
- 【第1题】 Pythonn内存管理以及垃圾回收机制
内存管理 Python解释器由c语言开发完成,py中所有的操作最终都由底层的c语言来实现并完成,所以想要了解底层内存管理需要结合python源码来进行解释. 1. 两个重要的结构体 include/o ...
- Java中怎么合理的使用redis?
redis 支撑许多言语的客户端.在官方网站上有支撑的一切的 [redis 客户端列表]. 因为往常运用 java 作为开发言语,所以这儿描绘一下怎样通过 java 来联接和操作 redis 服务器. ...
- python中实现单例模式
单例模式的目的是一个类有且只有一个实例对象存在,比如在复用类的过程中,可能重复创建多个实例,导致严重浪费内存,此时就适合使用单例模式. 前段时间需要用到单例模式,就称着机会在网上找了找,有包含了__n ...
- 彻底解决Intellij IDEA中文乱码问题
关于JAVA IDE开发工具,Eclipse系列和Intelli IDEA是大部分公司的主要选择,从开发者的选择角度,Intellij IDEA似乎比Eclipse系列更受欢迎一些.当我们使用Inte ...
- python-7-数据结构与类型转换
前言 python除了前面所说的基础类型,我们这里也需要讲解下数据结构,数据结构里面存放的是基础类型,如数字等同时也可以嵌套. 不可变数据(3 个):Number(数字).String(字符串).Tu ...
- iOS性能优化-数组、字典便利时间复杂
上图是几种时间复杂度的关系,性能优化一定程度上是为了降低程序执行效率减低时间复杂度. 如下是几种时间复杂度的实例: O(1) return array[index] == value; 复制代码 O( ...
- Java代理类Proxy的用法
代理(proxy) 利用代理可以在运行时创建一个实现了一组给定接口的新类.这种功能只有在编译时无法确定需要实现哪个接口时才有必要使用. 何时使用代理 假设有一个表示接口的Class对象(有可能只包含一 ...
- Springboot2 Metrics之actuator集成influxdb, Grafana提供监控和报警
到目前为止,各种日志收集,统计监控开源组件数不胜数,即便如此还是会有很多人只是tail -f查看一下日志文件.随着容器化技术的成熟,日志和metrics度量统计已经不能仅仅靠tail -f来查看了,你 ...
- Python term 模块
Python term 模块 term 模块适用于文字编辑,样式切换,光标移动 等一系列操作适用于终端命令行文字光标处理等操作. 安装 pip install py-term 使用方式 方式一 imp ...