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

  1. Python之路 - 网络编程之粘包

    Python之路 - 网络编程之粘包 粘包

  2. UNIX网络编程——Socket粘包问题

    一.两个简单概念长连接与短连接:1.长连接 Client方与Server方先建立通讯连接,连接建立后不断开, 然后再进行报文发送和接收. 2.短连接 Client方与Server每进行一次报文收发交易 ...

  3. Learning-Python【29】:网络编程之粘包

    粘包问题 上一篇博客遗留了一个问题,在接收的最大字节数设置为 1024 时,当接收的结果大于1024,再执行下一条命令时还是会返回上一条命令未执行完成的结果.这就是粘包问题. 因为TCP协议又叫流式协 ...

  4. 8-2udp和tcp网络编程以及粘包和解决粘包的方法

    一  tcp网络编程 server 端 import socket sk=socket.socket() #实例化一个对象 sk.setsockopt(socket.SOL_SOCKET,socket ...

  5. python socket网络编程之粘包问题详解

    一,粘包问题详情 1,只有TCP有粘包现象,UDP永远不会粘包 你的程序实际上无权直接操作网卡的,你操作网卡都是通过操作系统给用户程序暴露出来的接口,那每次你的程序要给远程发数据时,其实是先把数据从用 ...

  6. Python网络编程,粘包、分包问题的解决

    tcp编程中的粘包.分包问题的解决: 参考:https://blog.csdn.net/yannanxiu/article/details/52096465 服务端: #!/bin/env pytho ...

  7. day32 网络编程之粘包问题

    1.最大半连接数 什么是最大半连接数 半连接:在进行TCP协议通信时,客户端与服务器端进行三次握手建立连接,但是有时客户端与服务器端进行了连接申请,服务器端也同意了申请(既已经完成三次握手的两次),此 ...

  8. Python全栈-网络编程-TCP粘包

    一.什么是TCP粘包 C/S架构下,接收方不知道每个消息的发送间隙.也不知道每次应该提取多少个字节的数据,与此同时,TCP是面向连接的,面向流的,收发两端都要有,因此发送端为了将多个发往接收端的数据包 ...

  9. python网络编程-socket“粘包”(小数据发送问题)

    一:什么是粘包 “粘包”, 即服务器端你调用时send 2次,但你send调用时,数据其实并没有立刻被发送给客户端,而是放到了系统的socket发送缓冲区里,等缓冲区满了.或者数据等待超时了,数据才会 ...

随机推荐

  1. pymongo 笔记(转)

    1. 安装MongoDB并启动服务,安装PyMongo2. 连接MongoDB,并指定连接数据库.集合 import pymongo client = pymongo.MongoClient(host ...

  2. Mybatis动态SQL(五)

    if choose (when, otherwise) trim (where, set) foreach 一.if 动态SQL通常要做的事情是有条件地包含 where 子句的一部分.比如: < ...

  3. 为了Runtime Broke 关了一堆东西

    可是,好像还是不行啊?CPU还是用了 10-20% 还得写这个随笔,怕自己关东西关多了,以后还得回复. https://www.drivereasy.com/knowledge/runtime-bro ...

  4. stm32串口烧写程序到开发板

    前言:我们如果要断电后重启板子还能使用程序的话就需要通过串口把程序烧写到开发板中. 1.设置Keil编译完之后,生成Hex文件.在工程选项[output]的标签,勾选“Create HEX File” ...

  5. Paper | Deep Residual Learning for Image Recognition

    目录 1. 故事 2. 残差学习网络 2.1 残差块 2.2 ResNet 2.3 细节 3. 实验 3.1 短连接网络与plain网络 3.2 Projection解决短连接维度不匹配问题 3.3 ...

  6. leetcode 410. 分割数组的最大值(二分法)

    1. 题目描述 给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组.设计一个算法使得这 m 个子数组各自和的最大值最小. 注意: 数组长度 n 满足以下条件: 1 ≤ n ...

  7. 理解CMS GC日志

    本文翻译自:https://blogs.oracle.com/poonam/entry/understanding_cms_gc_logs 准备工作 JVM的GC日志的主要参数包括如下几个:-XX:+ ...

  8. VMware exsi虚拟机磁盘扩容

    创建Linux时分配磁盘空间随着使用的增加,使用率逐渐升高,需要对/root进行扩容,此时需要在添加或者扩展一下磁盘. 查看Linux版本信息 [root@localhost ~]# cat /etc ...

  9. 生成 RSA 公钥和私钥的方法

    在使用 RSA 加密算法时,需要使用到一对 公钥 和 私钥,生成 公钥 和 私钥 需要借助 openssl 这款工具,下载这款工具的地址如下: http://slproweb.com/products ...

  10. python Lock、RLock

    Lock: 只能acquire一次,下一次acquire必须release后才能,不然会造成死锁 from threading import Lock total = 0 lock = Lock() ...