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

socket tcp/ip 之简单ssh协议

时间:2018-02-12 23:43:16      阅读:475      评论:0      收藏:0      [点我收藏+]

标签:客户   image   socket   需要   视频   connect   允许   数据   ase   

看了python核心编程和大牛的视频之后,自己动手也试了一试,写写笔记,加深一下印象

首先服务端要导入socket模块,然后绑定地址和端口,并监听,然后进入等待接收来自客户端请求的一个循环,如果有数据来连接,则接收数据,整理后把请求的数据发给客户端。

客户端则也是导入socket模块,连接地址和端口,然后是一个发送请求的循环,然后接收来自服务器的信息。

所有的数据的发送与接收都是采用字节类型,而不是字符串,所以要用encode编码。

实现计算机内部命令的接收与发送,如果输入的命令有误,则给出提示。

服务器端:

import socket, os #导入模块

tcp_ser = socket.socket()
tcp_ser.bind((localhost, 6666))#绑定端口和IP
tcp_ser.listen(5)#监听数目

while True:#大循环,客户端挂掉服务端一直监听状态
    conn, addr = tcp_ser.accept()#等待连接
    print(waitting connect..., addr)
    
    while True:#小循环,一个客户端的多个请求
        data = conn.recv(1024)#允许一次接收的数据为1K
        #if not data:#在客户端已经判断,可以不要
        #    conn.send(b‘please input command!‘)
        #    continue
      
        cmd_data = os.popen(data.decode(utf-8)).read()#调取读取计算机内部命令
        if not cmd_data:#做个判断,如果读取为空,即没有返回信息,则输入命令有误,则发送特定信息,并重新请求
            conn.send(bNo command!)
            continue
        conn.send(cmd_data.encode(utf-8))#如果命令正确则发送返回的数据
       
    #conn.close()
tcp_ser.close()

客户端:

import socket

tcp_client = socket.socket()
tcp_client.connect((localhost, 6666))#客户端应该与服务器端一致

while True:#客户端的循环
    data = input(>>)#判断输入是否为空,若为空则不允许发送
    if len(data) == 0:
        print(No input message...)
        continue
    tcp_client.send(data.encode(utf-8))#发送请求数据
    cmd_msg = tcp_client.recv(102400)#接收返回数据,一次性接收102k
    print(cmd_msg.decode(utf-8))#接收和发送都是以字节的形式,所以要编码encode,打印需要解码decode
    
tcp_client.close()

 成功实现:

技术分享图片

 

socket tcp/ip 之简单ssh协议

标签:客户   image   socket   需要   视频   connect   允许   数据   ase   

原文地址:https://www.cnblogs.com/Zhu-Xueming/p/8445815.html

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