首页 > 解决方案 > Python 套接字和命令

问题描述

我正在尝试使用 Python 套接字将控制台命令从一台机器发送到另一台机器。我希望服务器将命令的结果发送回客户端。如果客户端键入“ls”,我希望服务器发回运行该命令的结果。服务器只是说“操作已完成:ls”,而不是预期的结果。我该如何解决这个问题,以便服务器运行期望命令并返回结果?

服务器:

import socket
from subprocess import call


def main():
     host = '127.0.0.1'
    port = 5000

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((host, port))

    s.listen(1)
    c, addr = s.accept()
    print('Connection established: ' + str(addr))

    while True:
        try:
            data = c.recv(1024).decode('utf-8')
            print('sending data: ' + data)
            c.send(data.encode('utf-8'))
            if data == 'q':
                break
        except NameError:
            error = 'Command does not exist'
            c.send(error.encode('utf-8'))
            continue
        except SyntaxError:
            error = 'Command does not exist'
            c.send(error.encode('utf-8'))
            continue
    c.close()

客户:

import socket
from subprocess import call


def main():
    host = '127.0.0.1'
    port = 5000

    s = socket.socket()
    s.connect((host, port))
    message = str(input('> '))
    while message != 'q':
        try:
            s.send(message.encode('utf-8'))
            data = s.recv(1024).decode('utf-8')
            print('Action completed: %s' % data)
            message = str(input('> '))
        except NameError:
            print("Command not recognized.")
            continue
        except SyntaxError:
            print("Command not recognized")
            continue

标签: pythonsocketscommand

解决方案


我最近建立了一个套接字连接,以便与安卓设备进行通信。

我决定使用 UDP 而不是 TCP(这就是你所做的)。对于 UDP 和 TCP,您需要在通信双方都有一个发送者和一个接收者。

在“addr”变量中接收到的端口号随每次连接而变化,因此您不能使用它。

我所做的,我分配了两个不同的端口,一个用于从 A 发送到 B,另一个端口用于从 B 发送到 A。

这是我的服务器代码:

import socket                    # socket connection
import threading                 # Multithreading
import time                      # Timeing

# ----------------------------------------------
#              Variables
# ----------------------------------------------
UDPListen2Port = 12345
UDPSend2Port = 123456
Listen2IP = ''  # input your local IP here

# ----------------------------------------------
#              Threading class
# ----------------------------------------------

class signalProcessingThread(threading.Thread):
    def __init__(self, iP, cmdIn):
        threading.Thread.__init__(self)
        self.iP = iP
        self.cmdIn = cmdIn
        
    def run(self):
        print("Recv--", self.iP ,"--", self.cmdIn)  # Display Thread Info
        cmdOut = self.EvalMessage()                 # Actual signal processing
        byteOut = bytes(cmdOut.encode("utf-8"))     # Convert Server reply to bytes
        sock.sendto(byteOut,(self.iP,UDPSend2Port)) # Send Server Reply to Socket

# ----------------------------------------------
#              Initialize Socket
# ----------------------------------------------

sock = socket(AF_INET, SOCK_DGRAM)              # -- UDP -- connection
sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)    # in case the port was not properly closed before
sock.bind((Listen2IP,UDPListen2Port))           # bind to the port


# ----------------------------------------------
#              Listen to Socket
# ----------------------------------------------

while True:
    try: # wait for a connection
        data,addr = sock.recvfrom(66507) # number of bytes in the message
        msg = data.decode('utf-8')
        newThread = signalProcessingThread(addr[0],msg)
        newThread.start()
        
    except KeyboardInterrupt:
        print('Connection failed')
        sock.close()
        
sock.close()

客户端代码非常相似,不同之处在于它不一定需要在线程中运行。希望我能帮上忙。


推荐阅读