python socket客戶端等待服務端多次連接


之前用socket都是服務端等待客戶端連接;

最近有個需求,同一個局域網內,客戶端等待服務端多次連接,多次接收服務端的命令在客戶端執行,拿到執行結果並返回給服務端,且如果一方斷掉,另一方要繼續保持,等待對方的下一次連接

不廢話,直接上代碼;

無論是先運行server或者是先運行client,都可以進行多次連接

server

#-*-coding:utf8-*-
import socket
from threading import  Thread
import time
class Windows(object):
    def __init__(self):
        self.socket=socket.socket()
        self.socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
        self.socket.settimeout(300)
        self.addr=("0.0.0.0",9999)
        self.socket.bind(self.addr)
        self.socket.listen(5)
        self.socket.setblocking(True)
        print("wait for sut connecting......")
        self.conn, self.addr = self.socket.accept()

    def enter_to_windows(self):
        if self.conn:
            print("connect sut ip>>>{}:{}".format(self.conn.getpeername()[0],self.conn.getpeername()[1]))
            return True
        else:
            return False

    def execute(self,cmd):
        while True:
            if 0<len(cmd)<1024:
                n=self.conn.send(str(cmd).encode())
                print("send cmd'{}' to sut {} total bytes".format(cmd, n))
                cmd=""
            if not cmd:
                break
        val=""
        while True:
            ret_val=self.conn.recv(1024).decode()
            if not ret_val:
                break
            # print ("receive cmd '{}''s response from sut >>>".format(cmd),ret_val)
            val+=ret_val
        print("from sut receive data: {}".format(val))
        self.conn.close()
        self.socket.close()
        return val
w=Windows()
print(w.enter_to_windows())
w.execute("ipconfig")
w=Windows()
w.execute("systeminfo")
w=Windows()
w.execute("dir")

client

import socket
import sys
import subprocess
import os
import time


while True:
    s = socket.socket()
    # addr=("127.0.0.1",9999)
    addr = ("pengfe5x-MOBL", 9999)
    print("{}:wait for server connect...".format(time.ctime()))
    while True:
        time.sleep(5)
        try:
            res=s.connect(addr)
            print(res)
            if not res:
                print("connect server",addr)
                break
        except:
            pass
    while True:
        try:
            data=s.recv(1024).decode()
            if not data:
                break
            print data

            print("receive from server data:",data.decode())

            res=subprocess.Popen([data],shell=True,stdout=subprocess.PIPE)
            if not res:
                print ">>>>>>>>>>>>>>>>execute command {} success!!!{}".format(data,res)
            n=s.send(res.stdout.read())
            print "send {}".format(n)
        except Exception as e:
            print("{}".format(e))
            break
        print ("close client socket")
        s.close()


免責聲明!

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



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