Установка TCP-соединения Клиент-сервер

#python #python-3.x #sockets #tcp #network-programming

Вопрос:

Я пытаюсь установить настройку клиент-сервера с помощью программирования сокетов Python:

У меня есть 2 разные машины(обе виртуальные машины). Запускаются мои серверные и клиентские сценарии. Но все, что я отправляю от клиента, не принимается на сервере:

Код сервера:

 import socket

def Main():
 
    host = 'x.x.x.x' #Server ip
    port = 15099

    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.bind((host, port))

    print("Server Started")
    while True:
        data, addr = s.recvfrom(1024)
        data = data.decode('utf-8')
        print("Message from: "   str(addr))
        print("From connected user: "   data)
        data = data.upper()
        print("Sending: "   data)
        s.sendto(data.encode('utf-8'), addr)
    s.close()

if __name__=='__main__':
    Main()
 
 

Код клиента:

 import socket

def Main():

    host='Y.Y.Y.Y' #client ip
    port = 15100
    
    server = ('X.X.X.X', 15099)
    
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.bind((host,port))
    
    message = input("-> ")
    while message !='q':
        s.sendto(message.encode('utf-8'), server)
        data, addr = s.recvfrom(1024)
        data = data.decode('utf-8')
        print("Received from server: "   data)
        message = input("-> ")
    s.close()

if __name__=='__main__':
    Main()
 

Я что-то упускаю?

Также,

Когда я запускаю сервер и клиент на одной машине [с сервером в качестве локального хоста], это работает нормально. Когда они находятся на 2 разных машинах, то он не отправляет никаких сообщений.

Комментарии:

1. Опечатка в коде сервера c.close() . Вы имеете в виду s.close().

2. Отредактированный. Спасибо!

3. могут ли две виртуальные машины связываться друг с другом с помощью используемых IP-адресов?

4. Да, оба способны пинговать друг друга. Те же IP-адреса, что и в сценарии.

5. Как правило, сервер использует ('',port) или ('0.0.0.0',port) (то же значение) для прослушивания любого интерфейса, поддерживаемого сервером, но ваш код (с ненужной привязкой в клиенте и без нее) работает localhost как сервер.

Ответ №1:

Клиенту не нужно привязываться к сокету. Для клиента создайте сокет, а затем вызовите сокет.sendto() с хостом и портом сервера.

Попробуйте это для клиента:

 def Main():
    server = ('localhost', 15099) # replace with server IP_addr
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    while True:
        message = input("[enter q to quit] -> ")
        if message == 'q': break
        s.sendto(message.encode('utf-8'), server)
        data, _ = s.recvfrom(1024)
        data = data.decode('utf-8')
        print("Received from server: "   data)
    s.close()
 

Для сервера измените вызов bind() на этот:

 s.bind(('0.0.0.0', port))
 

Если сервер не получает никаких подключений после запуска клиента, попробуйте запустить клиент и сервер на одной машине.

Комментарии:

1. Все та же проблема. Какие бы данные я ни отправлял, они не отображаются на сервере. Я только что послал «Привет». Не работает.

2. @SoftwareFan — попробуйте привязать к 0.0.0.0 на сервере, чтобы прослушивать все доступные сетевые интерфейсы.

3. Когда я запускаю сервер и клиент на одной машине [с сервером в качестве локального хоста], это работает нормально. Когда они находятся на 2 разных машинах, то он не отправляет никаких сообщений.

4. @SoftwareFan — Похоже, что проблема не в python, а в настройке виртуальной машины для открытия порта для удаленных подключений. Зависит от типа виртуальной машины (Windows против Linux) и/или VMware против VirtualBox и т. Д.

5. Одна виртуальная машина-это Windows (клиент), а другая [сервер] — CentOS. Они могут пинговать друг друга, и брандмауэр также отключен на стороне Windows. Могу ли я что-то сделать, чтобы проверить, не отказано ли соединение на сервере?