Можно ли использовать один и тот же сетевой сокет одновременно для прослушивания и подключения к одному и тому же порту? - PullRequest
0 голосов
/ 30 апреля 2020

Я хочу использовать сокет для реализации того, что клиент / сервер может отправлять и получать файлы друг от друга. Клиент может отправлять и получать файлы с сервера и наоборот для сервера. Также необходимо использовать модуль Tkinter для завершения работы сервера и клиента GUI.

Когда инициализируются 2 GUI, запускается поток для прослушивания соединения с противоположного конца. Это означает, что на сервере есть поток для прослушивания и принятия соединения от клиента во время получения файла от клиента, а на стороне клиента поток используется для прослушивания и принятия соединения от сервера.

Моя путаница заключается в том, что если мне нужны 2 порта, один используется для отправки файла с клиента на сервер, другой - для приема файлов из сервер? И нужно ли создавать 2 сокета для отправки и получения файлов?

Мое текущее решение использует 2 порта и 2 сокета на стороне клиента. при отправке файла клиентская сторона действует как клиент, а при получении файла - сервер. Правильно?

Короче говоря, возможно ли использовать один и тот же сетевой сокет одновременно для listen и connect to с одним и тем же портом? Или я должен иметь два отдельных сокета, и если это так, должны ли отдельные сокеты также быть привязаны к отдельным сетевым портам?

Вот упрощенный код, объясняющий мои вопросы. Любые советы / комментарии приветствуются. Спасибо.

class client():
    def __init__(self):
        self.clientTcpSock = None
        self.initUI()

    def initUI(self):

        #create UI here

    def createSocket(self):
        s.clientTcpSock = socket()
        s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
        s.bind((HOST, PORT_1)) #PORT_1 download file port
        s.listen(5)
        self.clientTcpSock = s

    def sendFile(self):
        # !!! Here creates a new TCP socket, or can i still use the same clientTcpSock??

        s = socket()
        s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
        s.connect((HOST, PORT_2))  # PORT_2 upload file port
        s.send(b'hello world') # just for example


    def receiveFile(self):

        while True:
            ### receivefile here

        self.clientTcpSock.close()


    # call this function when init UI
    def newTherad(self):
        thread = threading.Thread(target=self.receiveFile, args=())
        thread.setDaemon(True)
        thread.start()

...