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. 浅谈AMD与CMD

    AMD 是 RequireJS 在推广过程中对模块定义的规范化产出. CMD 是 SeaJS 在推广过程中对模块定义的规范化产出. 这些规范的目的都是为了 JavaScript 的模块化开发,特别是在 ...

  2. Token认证,如何快速方便获取用户信息

    背景 我们有一个Web项目,这个项目提供了很多的Rest API.也做了权限控制,访问API的请求必须要带上事先认证后获取的Token才可以. 认证的话就在Filter中进行的,会获取请求的Token ...

  3. 在 React 组件中监听 android 手机物理返回/回退/back键事件

    当前端页面嵌入到 webview 中运行时,有时会需要监听手机的物理返回按键事件来做一些自定义的操作. 比如我最近遇到的,在一个页面里面有批量选择的功能,当点击手机的返回键时,清除页面上的选中状态.我 ...

  4. Azure CosmosDB (14) 使用Postman访问CosmosDB REST API

    <Windows Azure Platform 系列文章目录> 今天研究了一下如何使用Postman访问Azure CosmosDB. CosmosDB API接口,可以参考:https: ...

  5. ndt算法学习

    NDT算法原理: NDT算法的基本思想是先根据参考数据(reference scan)来构建多维变量的正态分布, 如果变换参数能使得两幅激光数据匹配的很好,那么变换点在参考系中的概率密度将会很大. 因 ...

  6. List集合分组实现教程

    封装一个方法,用一个Map来实现,这里是根据bean类的seq字段进行拆分的,分成好几个list private LinkedHashMap<String,List<HandleInfo& ...

  7. CSS的基础学习

    CSS学习 --------学习资源 http://www.csszengarden.com/ CSS语法检查http://jigsaw.w3.org/css-validator/ 配置CSS的方法: ...

  8. C# 爬虫相关的、可供参考的开源项目

    1. Abots https://github.com/sjdirect/abot/ 2. DotnetSpider https://github.com/dotnetcore/DotnetSpide ...

  9. 【转】C#各版本新增加功能

    本系列文章主要整理并介绍 C# 各版本的新增功能. C# 8.0 C#8.0 于 2019年4月 随 .NET Framework 4.8 与 Visual Studio 2019 一同发布,但是当前 ...

  10. Kubernetes Pod 镜像拉取策略

    Kubernetes Pod 镜像拉取策略 官方文档:https://kubernetes.io/docs/concepts/containers/images/ • IfNotPresent:默认值 ...