python - 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
解决方案
我最近建立了一个套接字连接,以便与安卓设备进行通信。
我决定使用 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()
客户端代码非常相似,不同之处在于它不一定需要在线程中运行。希望我能帮上忙。
推荐阅读
- vb.net - 转换运算符的转换错误
- python - 如何使用 beautifulsoup 从 span 和 em 标签中提取数据
- ms-access - 具有 NULL 列的访问联合不起作用
- matlab - 优化张量乘法
- wpf - WPF HierarchicalDataTemplate & Treeview
- angular - 如何使用响应式表单验证禁用的控件(不触发验证)
- python - Python嵌套for循环嵌套迭代器重置
- angular - Ng-Select 不使用 Bootstrap 4 禁用元素
- android - Xamarin Android - 在“OpenStreetMap for Android (osmdroid)”中设置触摸标记
- jupyter-notebook - 嵌套编号列表不会在 Jupyter Notebook Markdown 中换行