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. c# WF 第9节 button控件

    本节内容: 1:实现实例 1:实现实例 每当点击一个确定就出现一个窗口,当点击最后的确定时,关闭所有的窗口. 实现: 步骤1:对Form 1 -Form3 依次进行如下设置: 步骤2 : 当每点击一个 ...

  2. js 三种存储方式的区别

    javaScript有三种数据存储方式,分别是: sessionStorage localStorage cookie 相同点:都保存在浏览器端,同源的 不同点: ①传递方式不同 cookie数据始终 ...

  3. MySQL 行溢出数据

    MySQL 行溢出数据 MySQL 对一条记录占用的最大储存空间是有限制的,除了 BLOB 和 TEXT 类型之外,其他所有列 (不包括隐藏列和记录头信息) 占用的字节长度不能超过 65535 个字节 ...

  4. Nor Flash的理论性能

    简介 为了评估Nor性能优化空间,我需要根据Spec计算出极限情况下,Nor Flash的性能理论值. 在全志的R**相关项目中分别支持ESMT.MXIC.Winbond.GD这4个厂家的Nor Fl ...

  5. Win10修改hosts文件并配置DNS

    1.打开C:\Windows\System32\drivers\etc目录 2.去掉hosts文件的只读属性 3.添加dns解析配置 127.0.0.1           www.example.c ...

  6. python运维开发常用模块(6)发送电子邮件模块smtplib

    1.模块常用方法 SMTP类定义:smtplib.SMTP([host[,port[,local_hostname[, timeout]]]]),作为SMTP的构造函数,功能是与smtp服务器建立连接 ...

  7. CMPT 300 – Operating Systems

    Assignment 4 – Create Simple YetFunctional File SystemCMPT 300 – Operating SystemsPlease submit a zi ...

  8. 怎样用 C# 快速比较 2 个文件是否是相同的文件?

    方案1: 直接贴代码了: using System; using System.Collections.Generic; using System.IO; using System.Linq; usi ...

  9. Gevent工作原理(转)

    作者:大U哥链接:https://www.zhihu.com/question/20703476/answer/15911452来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...

  10. 转 OpenCV Mat 数据读写

    转:https://blog.csdn.net/u011520181/article/details/83831866 1.创建 Mat 对象: // 创建一个 320x240 的 8 位无符号型 4 ...