• 网络编程基础【day09】:实现简单地ssh(四)


    本节内容

    1. 概述

    2. 简单ssh

    3. socket接收大数据的困惑

    一、概述

      我们用过linux的就知道什么是ssh,它是一种客户端和服务端交互返回的一个解决,输入一个命令,给我返回什么,接下来我们说一说,如何用socket去简单的时间一个ssh

    二、简单的ssh

    2.1、客户端

    说明:客户端实例->建立连接->发送数据->接收数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import socket
     
    client = socket.socket()
    client.connect(("localhost",9999))
     
    while True:
        cmd = input(">>>:").strip()
        if len(cmd) == 0:continue
        client.send(cmd.encode("utf-8"))
        cmd_res = client.recv(500)
        print(cmd_res.decode("utf-8",'ignore'))
     
    client.close()

    2.2、服务端

    说明:服务端实例->绑定ip+端口->监听客户端连接->生成连接实例->接收客户端数据->发送数据至客户端

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    import socket,os
     
    server = socket.socket()
    server.bind(("localhost",9999))
    server.listen()
    while True:
        conn,addr = server.accept()
        print("new addr:",addr)
        while True:
            data = conn.recv(1024)
            if not data:
                print("客户端已断开")
                break
            print("执行指令:",data)
            cmd_res = os.popen(data.decode()).read()
            print("before send:",len(cmd_res))
            if len(cmd_res) == 0:
                cmd_res = "cmd has no output...."
            conn.send(cmd_res.encode("utf-8"))
            print("send done")
    server.close()

    2.3、实现效果

    说明:先执行服务端->再执行客户端->客户端输入指令->服务端返回

    ①客户端

    ②服务端

    三、socket接收大数据困惑

    3.1、接收大数据

    说明:通过上面的客户端的代码我们知道,客户端只能接收500个字节,那如果服务端发送给客户端的字节数大于客户端设置的数据,会有说明后果?

    eg:输入ipconfig之后效果图,在pycharm执行的效果图如下:

    在cmd命令中执行的效果图如下:

    首先我敢保证的是在cmd里面执行的是对的,那为啥不一样呢?我们在pycharm中继续执行其他命令,看看有什么效果:

    ①执行dir

    ②执行cd

    从上面图可以看出,全乱了,那我不就不能实现了ssh这个功能了嘛。

    3.2、为什么会乱?

    疑问:我接收的是500字节,但是服务端传过来的确是比这个大的多,客户端只接收了500字节,那服务端剩下的字节跑哪里去了?

    答:①服务端第一次全部发送给客户端,客户端只接收自己部分的字节数,剩下的字节数被存储在 IO缓冲区 中,下一次你再用send的时候,你以为接收的是新的数据,其实不是,它会先把缓冲区里的数据发出去,然后你的新数据再放到缓冲区中,直到缓冲区满了再发出去

      ②客户端虽然写的接收的是500,但它不一定能收到500,就是服务器这次send的时候,没有send到500,你依然说你收500,代表着你最多一次只能收500,但是你给我send10个字节,我也得收,所以说它不是等着500全收满了,你发过来多少,我就收多少。

    有两种情况缓冲区会给你发数据:

    1. 缓冲区满了肯定会发
    2. 缓冲区超时:就是手动send,肯定会给客户端发,这边也已经强制超时了,默认会等着缓冲区慢,手动send是为了不让对方等了,强制发送
  • 相关阅读:
    nginx防止盗链
    Nginx防盗链详细设置
    [bzoj2127]happiness
    [bzoj2400]Optimal Marks
    [bzoj1738]发抖的牛
    [bzoj1741]穿越小行星群
    [bzoj3123]森林
    [bzoj2588]Count on a tree
    [bzoj3144]切糕
    [bzoj1787]紧急集合
  • 原文地址:https://www.cnblogs.com/luoahong/p/7211465.html
Copyright © 2020-2023  润新知