套接字的信仰

  一切皆文件

昨日作业:

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")
user,pwd=data.strip().split("|") #strip 是为了去掉接受到文件中的空格
#split是以|为分割线,分隔输入进来的字符串分割后形成列表 # 文件操作
flag=False
with open("account","r") as f: for line in f:
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

客户端

一、模拟ssh

  调用执行命令的程序:

import subprocess

res=subprocess.Popen("dir",
shell=True,
stderr=subprocess.PIPE,
stdout=subprocess.PIPE) print(res.stdout.read().decode("gbk"))

subprocess

同时执行多条命令之后,得到的结果很可能只有一部分,在执行其他命令的时候又接收到之前执行的另外一部分结果,这种显现就是黏包。

二、黏包

import struct

res=struct.pack("i","52526") #i 是一个整形模式

print(res) #b'Q\xe4\x06\x00' 是一个看不懂四个字节

print(len(res))

obj=struct.unpack("i",res)

print(obj) #(52526,)
print(obj[0]) #取元组的第一项

#功能,把一组数据转化为一个4位数字是东西
# 构造报头数据
hashlib 的经典用法:做数据移植性校验,就是本地上用一次,对面用一次,利用不可逆性,发生修改的话队形的hashlib将会不一样
import hashlib md5=hashlib.md5()
md5.update(b"hello")
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) #此方法和md5.update(f.read())的结果是一样的 和上面的效果是一样 print(md5.hexdigest()) # f.read()

课上练习题:

 # by luffycity.com

 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,
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()
 import socket
import struct
sk = socket.socket() 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).decode("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()

最新文章

  1. 蜻蜓FM笔试题目,求两个点的最近父节点
  2. tinyPng Photoshop Plugin 安装的坑
  3. OWASP WEB会话管理备忘单 阅读笔记
  4. linux下定时任务的使用
  5. 关于WinForm引用WPF窗体---在Winform窗体中使用WPF控件
  6. php大力力 [012节]PHP连接mySQL数据库
  7. 《深入Java虚拟机学习笔记》- 第12章 整数运算
  8. ansible 学习与实践
  9. add BOM to fix UTF-8 in Excel
  10. ERROR 1062 (23000): Duplicate entry &#39;1-1&#39; for key &#39;PRIMARY&#39;
  11. mysql 多重游标嵌套
  12. POJ1182 食物链 【并查集变种】
  13. JavaBean,List,Map转成json格式
  14. windows7 安装TensorFlow
  15. 将电脑文件复制到vm虚拟机中,然后安装步骤
  16. UNIX网络编程——UDP回射服务器程序(初级版本)以及漏洞分析
  17. 自定义view入门
  18. Bandwagon的配置记录(二) —— ftp文件传输
  19. spring boot websocket stomp 实现广播通信和一对一通信聊天
  20. Kafka原理总结

热门文章

  1. 设计模式(十九)State模式
  2. SpringBoot与MybatisPlus3.X整合之通用枚举(十二)
  3. Spring为IOC容器注入Bean的五种方式
  4. ArangoDB简单实例介绍
  5. ArangoDB 界面介绍
  6. 第九篇 Flask的before_request和after_request
  7. Oracle 相关操作SQL
  8. Unity中用Mesh画一个圆环
  9. shell的运用 : jenkins 编译 打包前端发布 生产(tomcat)
  10. 6.2.2 辅助类GenericOptionsParser,Tool和ToolRunner深入解析