人生苦短之我用Python篇(socket編程)


socket模塊

實現簡單的遠程連接:

客戶端:

import socket
client = socket.socket()#聲明socket類型,同時生成socke連接t對象
client.connect(('localhost',969))  #連接到localhost主機的6969端口上去
while True:
        msg = input(">>:").strip()
        if len(msg) == 0:continue
        client.send(msg.encode('utf-8'))#把編譯成utf-8的數據發送出去
        data = client.recv(512)#接收數據
        print("從服務器接收到的數據為:",data.decode())
client.close()

服務器端:

import socket
import os
server = socket.socket()#聲明socket類型,並且生成socket連接對象
server.bind(('localhost',969))#把服務器綁定到localhost的6969端口上
server.listen(5)#開始監聽
print("等待連接中……")
while True:
        conn,addr = server.accept()#接收連接
        print("***連接成功***")
        while True:
                data = conn.recv(512)#接收客戶發來的數據
                print("接收到的命令為:",data)
                if not data:
                        print("客戶斷開連接")
                        break
                com = os.popen(data.decode()).read()#read()讀取內存地址的內容
                print(data.decode())#輸出結果為字符串dir
                print(os.popen(data.decode()))#輸出結果為一個內存地址
                #py3 里socket發送的只有bytes,os.popen又只能接受str,所以要decode一下
                conn.sendall(com.encode('utf-8'))
server.close()

 

 


 稍微加強了下的遠程連接:

客戶端:

import socket
client = socket.socket()#聲明socket類型並生產連接對象
client.connect(('localhost',9999))#發起連接
#循環輸入指令
while True:
    cmd = input('>>:').strip()
    if len(cmd) == 0: continue#如果輸入為空則跳過本次循環,重新返回輸入指令
    client.send(cmd.encode("utf-8"))#把字符串編譯成比特流發送
    cmd_res_size = client.recv(1024)#接收服務器發來的指令內容比特流大小
    print("命令結果大小:",cmd_res_size)
    received_size = 0#接收到的大小為0
    received_data = b''#接收到的數據內容為空
    #根據接收到的數據大小,循環接受數據使其生成完整的內容再跳出循環
    while received_size < int(cmd_res_size.decode()):
        data = client.recv(1024)
        received_size += len(data)
        received_data += data
    #跳出循環后執行
    else:
        print("cmd res receive done……",received_size)
        print(received_data.decode())

client.close()

服務器端:

import socket ,os
server = socket.socket()#聲明socket類型並生產連接對象
server.bind(('localhost',9999))#綁定ip和port
server.listen()#監聽
print('等待連接……')
#循環接入
while True:
    conn,addr = server.accept()
    print('new conn:',addr)
    #循壞等待指令
    while True:
        print("等待新指令")
        data = conn.recv(1024)#接收比特流數據
        #沒有接收到比特流數據,則無數據在傳輸即斷開連接
        if not data:
            print("客戶已經斷開")
            break
        print("執行指令:",data)
        cmd_res = os.popen(data.decode()).read()#把比特流數據轉為str,再執行指令,最后讀取到內存賦值給變量cmd_res
        print("before send:",len(cmd_res))
        #判斷cmd_res是否為 0,popen函數執行失敗返回 0
        if len(cmd_res) == 0:
            cmd_res = "cmd has no output..."
        #cmd_res為字符串,.encode()后變為比特流,再用len計算出比特流的大小,再把這個整數轉為字符串,最后轉為比特流發送出去
        conn.send( str(len(cmd_res.encode())).encode("utf-8") )
        #把指令執行內容編譯成比特流發送出去
        conn.send(cmd_res.encode("utf-8"))
        print("send done")
server.close()

 

 

ftp客戶端:

import socket
import hashlib
client = socket.socket()
client.connect(('localhost',9999))
while True:
        cmd = input(">>: ").strip()
        if len(cmd) == 0:continue
        if cmd.startswith("get"):
                client.send(cmd.encode())
                server_response = client.recv(1024)
                print("server response: ",server_response)
                client.send(b"ready to recv file")
                file_total_size = int(server_response.decode())
                received_size = 0
                filename = cmd.split()[1]
                f = open(filename + ".new","wb")
                m = hashlib.md5()

                while received_size < file_total_size:
                        if file_total_size - received_size > 1024:
                                size = 1024
                        else:
                                size = file_total_size -received_size
                                print("last received:",size)

                        data = client.recv(size)
                        received_size += len(data)
                        m.update(data)
                        f.write(data)
                else:
                        new_file_md5 = m.hexdigest()
                        print("file recv done",received_size,file_total_size)
                        f.close()
                server_file_md5 = client.recv(1024)
                print("server file md5: ",server_file_md5)
                print("client file md5: ",new_file_md5)
client.close()

ftp服務器端:

import socket,os
import hashlib
server = socket.socket()
server.bind(('0.0.0.0',9999))
server.listen(5)
print("等待連接....")
while True:
        conn,addr = server.accept()
        print("連接成功....")
        while True:
                print("等待指令")
                data = conn.recv(1024)
                if not data:
                        print("客戶端已斷開")
                        break
                cmd,filename = data.decode().split()
                print(filename)
                if os.path.isfile(filename):
                        f = open(filename,"rb")
                        m = hashlib.md5()
                        file_size = os.stat(filename).st_size
                        conn.send( str(file_size).encode() )
                        conn.recv(1024)#wait for ack
                        for line in f:
                                m.update(line)
                                conn.send(line)
                        print("file md5",m.hexdigest())
                        f.close()
                        conn.send(m.hexdigest().encode())
                print("文件發送完畢....")
server.close()

 

 



 

 

socketserver模塊

實現簡單的連接:

客戶端:

import socket
client = socket.socket()
client.connect(('localhost',9999))
while True:
    cmd = input(">>:").strip()
    if len(cmd) == 0:continue
    client.send(cmd.encode('utf-8'))
    data = client.recv(10240)
    print("從服務器接受到的數據:",data.decode())

client.close()

服務器端:

import socketserver
class MyTCPHandler(socketserver.BaseRequestHandler):
    def handle(self):
        while True:
            try:
                self.data = self.request.recv(1024).strip()
                if not self.data:
                    print("客戶已斷開")
                    break
                print("{} wrote:".format(self.client_address[0]))
                print(self.data)
                self.request.send(self.data.upper())
            except ConnectionResetError as e:
                print("Error:",e)
                break

if __name__ == "__main__":
    HOST,PORT = "localhost",9999
    server = socketserver.TCPServer((HOST,PORT),MyTCPHandler)
    server.serve_forever()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM