Связь между машинами в питоне без интернета

Я работаю над межпроцессным взаимодействием между машинами. В настоящее время у меня есть 3 ноутбука, подключенных через концентратор, без подключения к Интернету.

Можно ли как-нибудь адаптировать этот код для отправки и получения сообщений между машинами с таким кодом без Интернета?

import socket
import sys
try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error:
    print("Failed to create a socket")
print("Socket created")
host = ("www.google.com")
port = 80
try:
    remote_ip = socket.gethostbyname(host)
except socket.gaierror:
    print("Hostname could not be found, exiting finding socket")
    sys.exit()
print("Ip adress of",host,"is",remote_ip)
s.connect((remote_ip, port))
print("Socket connected to",host,"on ip", remote_ip)
message = "GET / HTTP/1.1\r\n\r\n"
try:
    s.send(message.encode("utf-8"))
except socket.error:
    print("Failed")
    sys.exit

print("Message send successful")
reply = s.recv(4096)
print(reply)
s.close()

person Wesley Wood    schedule 08.10.2013    source источник
comment
вы можете проверить serverfault для вопросов, связанных с конфигурацией. Да, вы можете создать локальную сеть, которая может обмениваться данными через tcp/ip.   -  person monkut    schedule 08.10.2013
comment
Скажем, например, я хотел отправить сообщение привет, мир. Могу ли я найти два других IP-адреса машины, чтобы удалить раздел поиска IP-адресов Google. Но тогда как я мог отправить сообщение, а другие машины его слушали? Могу ли я просто запустить аналогичный код, прослушивая ответ, и если да, то каким будет мой следующий этап.   -  person Wesley Wood    schedule 08.10.2013


Ответы (3)


Вам не нужен доступ в Интернет, вам просто нужно соединение между машинами (которое у вас, по-видимому, есть). Очевидно, что вы не сможете подключиться к Google без доступа в Интернет.

Для соединений между тремя машинами я бы предложил запустить серверную программу на одной и клиентов на всех из них (если только под концентратором вы не подразумеваете какой-то сервер, а не небольшую вещь с подключенными кабелями Ethernet, и в этом случае вы должны запустить серверную программу на этом).

Я бы посоветовал вам сначала изучить несколько руководств по сокетам, вот некоторые из них, которые я нашел полезными:

http://docs.python.org/3/howto/sockets.html

http://www.kellbot.com/2010/02/tutorial-writing-a-tcp-server-in-python/

И пример кода для простой программы чата:

http://extr3metech.wordpress.com/2012/04/28/writing-a-simple-tcp-server-client-application-in-python/

(Последние два из них предназначены для Python 2.x, который я предполагаю, что вы не используете print в качестве функции, но их должно быть достаточно легко адаптировать).

На каком-то этапе вы можете обнаружить, что у вас возникают проблемы с отправкой информации, отличной от строк. Я знаю, что застрял на этом целую вечность и пытался делать такие вещи, как свертывание моей собственной системы кодирования для объектов Python, я просто не мог понять, как вы можете отправить список целых чисел, но не целое число само по себе.

Я решил эту проблему, используя кодировку данных json. Это достаточно просто и для этого есть модуль в стандартной библиотеке.

Однако, несмотря на то, что вам может быть довольно легко общаться, просто используя библиотеку сокетов, для более крупных или масштабируемых проектов вы, вероятно, захотите использовать библиотеку-оболочку.

Единственный из них, о котором я что-либо знаю, это twisted, однако он еще не работает с Python 3.x. .

Кроме того, вам нужно убедиться, что вы можете подключиться к другим машинам, так как вы знаете их правильный IP-адрес. Таким образом, вам нужно либо находиться в той же локальной сети, либо сделать что-то вроде создания виртуальной сети (Hamachi — это одно из них) или дать серверу хотя бы статический IP-адрес (переадресация портов и т. д.). Как правило, вам нужно сделать то, что вам нужно, чтобы запустить сервер для такой игры, как Minecraft.

person rlms    schedule 08.10.2013
comment
Последняя ссылка очень пригодилась, спасибо. Под концентратором я имел в виду три компьютера, подключенных к концентратору с помощью трех кабелей Ethernet, пытающихся связаться друг с другом. Прошу прощения за простоту следующего вопроса, но если я запущу программу отправки сообщений на одной машине, а затем запущу программу получения сообщений на двух других, все должно работать правильно? - person Wesley Wood; 08.10.2013

Вы можете использовать тот же код, но пропустить DNS-поиск имени хоста и убедиться, что «сервер» прослушивает правильный порт.

Лично я бы сделал оболочку для netcat или, возможно, реализовал что-то подобное, как в этом ответе: Реализация Netcat в Python

Тот факт, что вы не подключены к Интернету, не является проблемой. Убедитесь, что обе машины подключены физически и настроены на использование одной и той же сети/сетевой маски и доступного IP-адреса. Вам придется установить это вручную, так как нет dhcp (я полагаю), который назначает это для вас.

person Mattias    schedule 08.10.2013

Если машины должны обмениваться данными через TCP/IP (что я предполагаю из AF_INET в вашем коде), вам понадобится TCP/IP между ними.

Насколько я знаю, вы не можете сделать это с помощью простого концентратора. Возможно, есть уловки черной магии, но обычно вам нужен хотя бы маршрутизатор, чтобы иметь возможность передавать данные на уровне IP.

После того, как вы настроили локальную сеть, чтобы иметь возможность использовать имена хостов, вы можете настроить свой DNS, но, поскольку это всего лишь 3 машины, может быть проще просто отредактировать файл /etc/hosts для каждой из них.

person Alois Mahdal    schedule 08.10.2013
comment
Я полагаю, что отрицательный результат связан с тем, что в вопросе конкретно говорится, что OP не хочет общаться через Интернет. - person rlms; 08.10.2013
comment
@user2387370 user2387370 О, я неправильно понял это, я думал, что они имели в виду только фазу разработки ... Спасибо! - person Alois Mahdal; 08.10.2013