2016-12-04 2 views
0

Я пытаюсь создать программу локальной сети, используя python (который позже может быть в c) и TCP-сокетах.Объединение сервера и клиентского сокета python

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

Возможно ли иметь сервер и клиент в одном приложении, предпочтительно без использования потоков? Я знаю, что сервер приостанавливается при прослушивании соединения, поэтому gui не может ответить.

Если я не могу иметь оба приложения в одном приложении, я думал о наличии двух приложений, которые обмениваются данными друг с другом, однако потоки кажутся более подходящими, поскольку я буду использовать 2 процесса в любом случае. Если бы у меня были отдельные приложения, как я мог отправлять строки клиенту с сервера, чтобы обновить gui?

Могу ли я сделать какое-то событие (на стороне клиента), которое возникает, когда сервер хочет отправить сообщение клиенту?

Кроме того, как я могу проверить, активен ли сервер (доступен и привязан к его компьютерному адресу, ожидая сообщения)?

Является ли модель отношений между сервером и клиентом разумной? Какие-либо предложения?

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

Этот вопрос кажется очень похожим: Python socket server: listening to multiple clients, однако у них, похоже, нет клиента «server» & для каждого.

Примечание: я новичок в сокетах & сетей.

ответ

0
  1. Прежде всего, вам нужно прочитать какую-нибудь хорошую книгу или некоторые статьи (google it - их много) о программировании сокетов. Stackoverflow недостаточно. Вы просто потратите свое время, пытаясь научиться чему-то из случайных вопросов-ответов.
  2. «Сервер» не означает, что «режим приема только» и «клиент» не означает «отправка только режима». Полнодуплексное соединение между клиентом и сервером. Разница в «сервере» откроет порт и будет дождаться входящего соединения, и «имя клиента», знающего адрес сервера, запустит это соединение. После установления соединения - «клиент» и «сервер» будут иметь возможность связывать полный дуплекс.
  3. Да, возможно, сервер и клиент в одном приложении », но это редкое поведение. Оно понадобится вам на стороне сервера, если вашему серверу потребуется, например, отправлять запросы на некоторые другие серверы (например, на google.com). Вам просто нужно будет обрабатывать оба типа гнезд: активный и пассивный.
  4. «как я могу проверить, сервер активен? ». Если сервер «ВКЛ», вы сможете подключиться к нему. Если нет - ваша попытка вернет ошибку (исключение в Python). Вот и все.
  5. Существует два способа использования сокетов: режим блокировки и неблокирующий режим. В последнем случае вашей программе не нужно ждать окончания операции. Он может делать свой бизнес одновременно с получением или отправкой данных через сокет.
  6. Я не рекомендую использовать сырые сокеты. Это не рационально.Необработанные сокеты нужны только в том случае, если вы пытаетесь создать новую структуру сокетов с некоторыми уникальными функциями (но для этого вы должны стать экспертом в разработке сокетов). Просто потому, что уже есть десятки уже существующих фреймворков только в Python (а некоторые для C/C++. libevent - один из лучших из них). Одна из библиотек сокетов async для Python: asyncio - часть стандартной библиотеки Python (для современных версий Python).

Удачи вам!

+0

У меня есть также googled сокеты, однако я не знаю, как обращаться с ними как открытыми для соединений, так и с помощью операций gui (для отправки). Я намерен использовать сервер и клиентскую сторону для приложения, потому что, если у меня есть один сервер, компьютер, запускающий его, может спать, уходить и т. Д., Поэтому некоторым клиентам придется взять на себя ответственность. Можете ли вы разработать или предоставить ссылку на неблокирующий режим? (это используется .select()?) – Ben

+0

Я загляну в асинчио, спасибо за информацию. – Ben

+0

"это использование .select()?". Да: select(), poll(), epoll() и т. Д. – KromviellBlack

Смежные вопросы