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

 成功实现:

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