python socket例項

weixin_34127717發表於2018-07-25

socket_server_ssl.py檔案:

import socket
import os

server = socket.socket()
server.bind(('localhost',9999))
server.listen()
while True:
    conn,addr = server.accept()
    print(conn,addr)
    while True:
        print('wait the next command coming')
        data = conn.recv(1024)#每次只接受100個位元組,若客戶端傳送過來的檔案超過1024,那麼會在下次輸入指令的時候再顯示出來。如客戶端輸入ipconfig一次性接受不完,客戶端再輸入dir那麼顯示的仍是上次未顯示完的ipconfig命令內容
        if not data:
            print('客戶端已斷開')
            break
        print('執行指令:',data)
        cmd_res = os.popen(data.decode()).read() #os.popen接收字串,執行結果也是字串
        print('befor send')
        if len(cmd_res) == 0:
            cmd_res = 'cmd_res has no output'
        conn.send(str(len(cmd_res.encode())).encode('utf-8'))#為解決不能一次將所有內容給客戶端,先將內容大小告知客戶端.先將cmd_res編碼再計算len,否則漢字在編碼前後的長度不一樣
        client_ack = conn.recv(1024)#等客戶端確認。第一個send後客戶端還沒收到結果第二個send就開始了,可能會造成兩個send的資料在同一個包裡(緩衝區滿了才會發給客戶端)造成粘包,所以等第一個send後客戶端確認後再下一個send
        conn.send(cmd_res.encode('utf-8'))
        print('after send')

socket_client_ssl.py檔案:

import socket
'''
客戶端執行send命令後伺服器會將內容存在緩衝區,預設等緩衝區滿後如1024個位元組就返回給客戶端,若緩衝區未單已滿等待超時也會返回給客戶端
'''
client = socket.socket()
client.connect(('localhost',9999))
while True:
    cmd = input('>>:')#若字串前面加上b則只是把字母轉化為ASCII碼,對中文無用
    if len(cmd) == 0:
        continue
    client.send(cmd.encode('utf_8'))#內容以bytes的格式傳送
    cmd_res_size = client.recv(1024)#先接收檔案總大小
    print('size-->',cmd_res_size)
    client.send('準備好接收了'.encode('utf-8'))
    received_size = 0
    received_data = b''
    while received_size < int(cmd_res_size.decode()):#只要接收到的總size小於檔案總size就繼續收
        cmd_res = client.recv(1024)
        received_size += len(cmd_res) #每次收到的內容長度可能不等於1024位元組,所以必須用len判斷
        print(cmd_res.decode())

    else:
        print('done')
client.close()

相關文章