簡體   English   中英

在兩個套接字之間中繼,中斷以插入自己的命令

[英]Relay between two sockets, interrupt to plug in own commands

我有一個程序A通過TCP套接字與機器B通訊 現在,我有自己的應用程序C ,它還需要不時與B進行通信 因此,我希望C雙向中繼AB之間所有通信。 一旦C必須與B對話,中繼就應該停止,到B的套接字應該刷新/顯示所有等待數據,並且C應該與B對話,接收它的需求,然后在AB之間進行中繼重新開始。

我是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM