1. 程式人生 > >socket tcp/ip 之簡單ssh協議

socket tcp/ip 之簡單ssh協議

圖片 ssa 都是 服務端 bubuko tro cmd wait 分享

看了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協議