#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. Могу ли я что-то сделать, чтобы проверить, не отказано ли соединение на сервере?