Python-сервер, который тоже может выступать в роли клиента - PullRequest
0 голосов
/ 08 января 2019

Я работаю над менеджером ключей, и мне нужны программы A, B и KM, чтобы общаться друг с другом. Я хочу, чтобы программа A размещала соединения для B и KM, а B - для подключения к A и позволяла KM подключаться к B.

Я хочу, чтобы программа A принимала соединения для B и KM, а B - для подключения к A и позволяла KM подключаться к B. В настоящий момент я создаю 2 гнезда на 2 разных портах в программе A (один для B и один для KM), у меня есть сокет + порт в B, который позволяет KM подключаться к нему, и другой порт + сокет, который соединяет B с A, наконец, в KM я подключаюсь и к A, и к B, каждое соединение имеет сокет и порт , Я планирую сначала запустить A, а затем B, чтобы он мог подключиться к A и начать прослушивание KM, а затем подключить KM к ним обоим.

код для КМ:

TCP_IP = "127.0.0.1"
TCP_PORT_A = 50021
TCP_PORT_B = 50031

sockA = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sockA
sockA.connect((TCP_IP, TCP_PORT_A))
print("conn to A")

sockB = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sockB.connect((TCP_IP, TCP_PORT_B))
print("conn to B")

код для A:

    TCP_IP = "127.0.0.1"
    TCP_PORT_REC_B = 50001
    TCP_PORT_REC_KM = 50021

    sockB = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sockB.bind((TCP_IP, TCP_PORT_REC_B))
    sockB.listen(1)
    print('listening on ', (TCP_IP, TCP_PORT_REC_B))
    connB, addrB = sockB.accept()

    print("connection address B: ", addrB)

    sockKM = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sockKM.bind((TCP_IP, TCP_PORT_REC_KM))
    sockKM.listen(1)
    print('listening on ', (TCP_IP, TCP_PORT_REC_KM))
    connKM, addrKM = sockKM.accept()

    print("connection address K: ", addrKM)

код для B:

TCP_IP = "127.0.0.1"
TCP_PORT_A = 50001
TCP_PORT_KM = 50031

sockA = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sockA.connect((TCP_IP, TCP_PORT_A))
print("connected to A")
sockKM = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sockKM.bind((TCP_IP, TCP_PORT_KM))
print("listening")
sockKM.listen(1)
connKM, addrKM = sockKM.accept()

print("connection address k: ", addrKM)

Я запускаю A, затем B, B говорит, что он подключен к A и начинает слушать, A не подтверждает соединение, я запускаю KM и получаю:

sockA.connect((TCP_IP, TCP_PORT_A))
ConnectionRefusedError: [WinError 10061] No connection could be made                     
because the target machine actively refused it

1 Ответ

0 голосов
/ 08 января 2019

Ваша проблема прямо здесь:

sockA = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

Все ваши сокеты используют SOCK_STREAM, кроме этого. Это в «код для B». Также у вас есть строка, которая просто говорит sockA в «код для КМ».

РЕДАКТИРОВАТЬ: Должен работать так, как вы хотели, если вы решите эту проблему. Я только что проверил это сам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...