2013-03-07 5 views
1

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

Я сделал простой флэш-приложение, которое должно взаимодействовать с сокетом, При том, что я использовал сокет, который поддерживает AS3 и работает на «Красном Тамарин»,

Ну я добраться до точки:

В настоящее время у меня есть цикл, который всегда запускает socket.receive() Он отвечает и даже отображает текст, который я отправляю из своего приложения-флеш-приложения.

Моя цель состоит в том, чтобы получить простой онлайн флеш игры, Возможно использовать SQL/SQLite, чтобы сохранить информацию и экспортировать ее в игроков,

То, что я не понимаю, как я могу взять его там ..

То, что я думал, что вам нужно сделать что-то вроде этого:

на стороне сервера:

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

Клиента:

  • Отправить информацию на сервер в соответствии с действием, например, когда игрок движется, отправить новую позицию на сервере таким же образом к этому: «MovePlayer [имя] [х] [у]»

Действительно ли мой план, как это должно быть? И о фактической отправке информации, мне любопытно, будет ли эффективно постоянно отправлять строковые данные сервера? (это то, с чем я привык работать, а не какие-то странные байты и прочее)

Заранее спасибо!

+0

Если игра не по своей сути мультиплеер, вы, вероятно, не хотим, чтобы каждый клиент говорит серверу все, что он делает ..., который совсем не масштабируется. – cHao

+0

Если вы делаете что-либо в сокетах на C++, это будет хорошая идея, чтобы узнать об этих «странных байтах и ​​вещах». – ryanbwork

+0

Как еще вы обновляете эти вещи, не сообщая об этом тогда? – Radicate

ответ

2

Вы на правильном пути. Но я рекомендую вам сначала определить протокол связи. Вы можете начать с определения того, как выглядит команда. Например:

COMMAND <space> PARAM1 <space> PARAM2 <line-break> 

Несколько соображений по определению протокола:

  1. Что делать, если PARAM1 является строкой и содержит пробелы? Как вы можете указать начало и конец каждого параметра?
  2. Ваши параметры могут также содержать разрыв строки.
  3. Если ваше клиентское приложение установлено вашими клиентами, они должны будут обновить его раз в то время. Чтобы еще больше усложнить работу, они могут запускать более старую версию и ожидать, что она будет работать, даже если вы изменили свой протокол. Это накладывает потребность на протоколировании версий. Имейте это в виду, если вам требуется взаимодействие с пользователем для обновления клиентской части вашего приложения.

Это самые фундаментальные соображения, которые я могу придумать для вашего сценария.Могут быть и другие важные соображения, но большинство из них зависит от того, как работает ваша игра. Не стесняйтесь вносить изменения в свой список, если вы думаете, что я забыл что-то, о чем должен подумать OP.

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

Теперь вернемся к вашим вопросам:

Является ли мой план действительно, как должно быть?

Да. Вот как это должно быть.

И о фактической отправке информации, мне любопытно, будет ли эффективно постоянно отправлять строковые данные сервера? (Это то, что я привык работать с, а не какими-то загадочными байтами и прочим)

Это зависит от целого ряда факторов:

  1. Какого протокола вы используете (TCP, UDP, и т.д.);
  2. Число одновременных клиентов;
  3. Среднее время обработки команды;
  4. Вы проводите обновление с другими игроками?
  5. Как вы реализовали свое серверное приложение;
  6. Физические недостатки:
    1. Оборудование: CPU, память и т. Д .;
    2. Сеть: пропускная способность, латентность и т. Д .;

TCP vs UDP http://www.it20.info/misc/pictures/TCP-clouds-UDP-clouds-design-for-fail-and-AWS1.jpg

+0

Привет, во-первых, большое спасибо за отличный ответ!Теперь я начну планировать все, хорошо знать, что я на правильном пути :) - о реальном протоколе, правда, правильно ли конвертировать текст в двоичный файл, отправлять его на сервер и преобразовывать его в текст на стороне сервера? или было бы лучше, по вашему мнению, просто отправить его как есть? – Radicate

+0

Добро пожаловать. Вы можете передавать все как обычный текст, но протокол, разработанный с учетом производительности, всегда использует двоичные данные для чисел/флагов. Строки остаются в виде строк, если не требуется кодирование/декодирование. Если вы собираетесь использовать криптографию через TCP, SSL/TLS должно быть достаточно. Так или иначе, всегда полезно понять, как ваши данные хранятся и передаются на двоичном уровне. См. [Дизайн протокола приложений] (http://www.catb.org/esr/writings/taoup/html/ch05s03.html) и [Endianness in networking] (http://en.wikipedia.org/wiki/Endianness# Endianness_in_networking). – jweyrich

+0

Хорошо, еще раз спасибо, последний вопрос на данный момент был бы следующим: я устанавливаю новый сокет, привязываю его, а затем выполняю функцию listen(), когда обнаружено соединение, я использую accept() и добавляю новый сокет в массив активных связи, моя проблема на данный момент заключается в том, что я не понимаю, как именно мне нужно принимать команды, следует ли слушать команды отдельно на каждом сокете, который у меня есть? или он должен быть только на главном, а затем каким-то образом определить, кто его отправил? то, что я думал, должно было продолжать работать receive() в каждом соединении и видеть, получаю ли я что-нибудь, но я не уверен, что это правильный способ сделать это. – Radicate

0

взгляд на эту https://code.google.com/p/spitfire-and-firedrop/

там вы увидите основные из создания сервера сокета с redtamarin

см, в частности https://code.google.com/p/spitfire-and-firedrop/source/browse/trunk/spitfire/src/spitfire/Server.as

деталь как следует, redtamarin в основном использует блокирующие сокеты с выбором() с максимальным жестко закодированным FD_SETSIZE 4096 см: https://code.google.com/p/redtamarin/wiki/Socket#maxConcurrentConnection

так вот, что произойдет в цикле сервера

вы в основном имеешь массив сокетов объект

вам цикл каждые х миллисекунд, и для каждого сокета вы спрашиваете, если вы можете прочитать его

, если вы можете прочитать на сокете, вы затем сравнить, если этот сокет O Ь является сервером , если это сервер, который означает, что у вас есть новое соединение , если это не означает, что клиент пытается отправить вам данные и поэтому вы читаете эти данные , а затем передать его в «переводчик»

позже в том же цикле проверить, если сокет OBJ остается в силе , и если вы можете написать к нему , если вы можете писать и объект сокет не сервер , то вы можете отправить данные клиенту

здесь эквивалент код в C для справки http://martinbroadhurst.com/source/select-server.c.html http://www.lowtek.com/sockets/select.html

на очень простом примере посмотреть на socketpolicyd

https://code.google.com/p/spitfire-and-firedrop/wiki/socketpolicyd https://code.google.com/p/spitfire-and-firedrop/source/browse/trunk/socketpolicyd/src/spitfire/SocketPolicyServer.as

и сравнить реализацию с Perl и PHP http://www.adobe.com/devnet/flashplayer/articles/socket_policy_files.html

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