[英]Relay between two sockets, interrupt to plug in own commands
我有一個程序A通過TCP套接字與機器B通訊 。 現在,我有自己的應用程序C ,它還需要不時與B進行通信 。 因此,我希望C雙向中繼A和B之間的所有通信。 一旦C必須與B對話,中繼就應該停止,到B的套接字應該刷新/顯示所有等待數據,並且C應該與B對話,接收它的需求,然后在A和B之間進行中繼重新開始。
我是Python套接字的新手,所以我只知道一些基本命令,並且需要一些指向正確方向的信息,以了解閱讀內容和注意事項(或者是一個完整的示例,如果有人碰巧做了類似的事情,已經)。
由於中繼應該在C正在進行與B對話之外的其他工作時在后台運行,所以我也想知道我應該對此使用線程還是是否有更好的選擇(在下面引用的問題中,使用了異步)?
我還發現了這個問題, 需要幫助,請在兩個套接字之間創建一個TCP中繼 ,據我所知,中繼部分應該與我的問題類似,但是我無法真正分辨出中繼在哪里完成。
好的,我知道了。 這是我的解決方案,在類中實現以控制機器:
import struct
import socket
import time
import threading
try:
from configparser import ConfigParser
except ImportError:
from ConfigParser import ConfigParser # ver. < 3.0
class machineClass():
def __init__(self):
self.read_config() # gets IP's and Ports for machine and relay socket and stores them in self.machineIP, self.machinePort, self.relayIP and self.relayPort
self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.s.connect((self.machineIP, self.machinePort))
self.stopRelayEvent = threading.Event()
self.relayStoppedEvent = threading.Event()
relaySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
relaySocket.bind((self.relayIP,self.relayPort))
relayThread = threading.Thread(target=self.relay, args=(relaySocket,self.s,self.stopRelayEvent,self.relayStoppedEvent))
relayThread.start()
print(" Machine [connected]")
def relay(self,relaySocket,machineSocket,stopRelayEvent,relayStoppedEvent):
while 1:
if not relayStoppedEvent.isSet():
relayStoppedEvent.set()
relaySocket.listen(1) # waits for connection from software **B**, in loop because **B** reconnects every now and then. While waiting, connection is not blocked for **C** because relayStoppedEvent is set.
relayCon, relayAddr = relaySocket.accept()
relayStoppedEvent.clear()
print('Connected with Software **B** on ' + relayAddr[0] + ':' + str(relayAddr[1]))
while 1:
if not stopRelayEvent.isSet():
if relayStoppedEvent.isSet():
relayStoppedEvent.clear()
data = relayCon.recv(84)
if len(data) == 0:
break # in case connection is lost, break loop and go back to waiting for new connection.
machineSocket.send(data)
relayCon.send(machineSocket.recv(84))
else:
relayStoppedEvent.set()
data = relayCon.recv(84)
def sendDataToMachine(self,data): # Function for **C** to send data to machine **B**
self.stopRelayEvent.set()
self.relayStoppedEvent.wait()
self.s.send(data)
time.sleep(.1)
return_data = self.s.recv(84)
self.stopRelayEvent.clear()
return return_data
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.