Я хочу использовать сокет для реализации того, что клиент / сервер может отправлять и получать файлы друг от друга. Клиент может отправлять и получать файлы с сервера и наоборот для сервера. Также необходимо использовать модуль 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()