• socket tcp/ip 之简单ssh协议


    看了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(b'No 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()

     成功实现:

  • 相关阅读:
    原生态ajax
    用js提交表单,没有submit按钮如何验证,使用button提交方法
    易买网吐血文档(图片拖不上来,要文档留下联系)
    时序图Sequence DiaGram
    starUML用例图
    泛型自动扩容的原理
    深入C#数据类型
    了解.NET框架
    自定义jstl标签实现页面级的权限控制
    SharePoint 2013 REST 服务使用简介
  • 原文地址:https://www.cnblogs.com/Zhu-Xueming/p/8445815.html
Copyright © 2020-2023  润新知