Отправлять и получать сообщения на один и тот же порт? Приложение для пиринговых сообщений python - PullRequest
0 голосов
/ 08 марта 2020

Я пытаюсь создать одноранговое приложение для сообщений, я понимаю, что каждый экземпляр приложения должен быть и сервером, и клиентом, как я сделал для приведенного ниже кода, но мне интересно, как установить порты, могу ли я отправлять и получать сообщения на один и тот же порт?

Приведенный ниже код является одним экземпляром приложения, я могу общаться с другой версией, но мне нужно установить другую версию для отправки сообщений через порт 9000 и получать сообщения на 6190. В дальнейшем это не сработает. Как будет подключаться третий пользователь?

Текущая ситуация: пользователь 1: получает на 9000, отправляет на 6190 пользователь 2: получает на 6190, отправляет на 9000

import socket
import time
import threading

global incoming
def server_socket(): #call server_socket() in build method?
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.bind(('', 9000))
        s.listen(1)
        host_name = socket.gethostname()
        ip_address = socket.gethostbyname(host_name)
        print("IP address is: ", ip_address)
    except socket.error as e:
        print("Socket Error !!", "Unable To Setup Local Socket. Port In Use")

    while True:
        conn, addr = s.accept()

        incoming_ip = str(addr[0])
        data = conn.recv(4096)
        data = data.decode('utf-8')
        print("message recieved is: ", data)
        conn.close()

    s.close()


def client_send_message():

        message = "Hello World"
        message = message.encode('utf-8')
        c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        try:
            c.connect(("127.0.0.1", 6190))
        except Exception as e:
            print("Connection Refused", "The Address You Are Trying To Reach Is Currently Unavailable")

        try:
            c.send(message)
        except Exception as e:
            print(e)

        c.close()

t = threading.Thread(target=server_socket)
t.start()
for i in range(5):
    time.sleep(30)
    client_send_message()

1 Ответ

0 голосов
/ 08 марта 2020

В настоящее время вы используете TCP, и для этого проекта вам нужен отдельный сокет для каждого клиента. Вы можете обмениваться данными на этом сокете в обоих направлениях. Более распространенным для одноранговых сетей является UDP: здесь вы можете использовать один сокет для recvfrom данных от произвольных клиентов и sendto данных для произвольных клиентов.

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