码迷,mamicode.com
首页 > 其他好文 > 详细

网络编程实现简单的ssh

时间:2018-05-15 15:58:50      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:ddr   col   断开连接   接受   rip   port   字节   env   list   

 

客户端:客户端实例  --->  建立连接 ----> 发送内容 ---> 接受内容。

 

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()

 

 

服务端:客户端实例 --> 绑定ip + 端口 ---> 监听客户端连接 —> 接受客户端数据 --->发送数据至客户端。

#!usr/bin/env phthon3
# -*- coding:utf-8 -*-
# _Author_:"zhang Yaoqing"


import socket,os

server = socket.socket()
server.bind((localhost,1234))
server.listen()
while True:
    conn,addr = server.accept()
    print(add..,addr)
    while True:
        data = conn.recv(500)
        if not data:
            print(客户端断开连接)
            break
        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))
server.close()

 

但是这里面有一个问题就是大数据怎么上传下载呢。里面有一个缓冲区的问题,上面recv(500)这里我们最多是接受500

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

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

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

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

  1. 缓冲区满了肯定会发
  2. 缓冲区超时:就是手动send,肯定会给客户端发,这边也已经强制超时了,默认会等着缓冲区慢,手动send是为了不让对方等了,强制发送

 

网络编程实现简单的ssh

标签:ddr   col   断开连接   接受   rip   port   字节   env   list   

原文地址:https://www.cnblogs.com/littlesky1124/p/9041043.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!