SocketServer

banner1024

AIR-приложение для тестирования сокет-соединений.
Текущая версия 0.0.2, обновлено 05.08.2013.
Скачать для платформ MacOS и Windows (~530 Кб).

Скачать исходники

Как использовать

1

Запустив приложение, вы можете из списка выбрать Хост и ввести Порт для создания локального сокет-сервера. Если в качестве порта указать значение 0(по умолчанию), то сервер подключится к случайному свободному порту.
app-ss-1

2

Нажав кнопку connect, будет создан локальный сокет-сервер. Если вы указали в качестве порта значение 0, то после создания сокет-сервера, в поле ввода порта будет отображено текущее значение, которое используется в данный момент. Вся информация о работе сокет-сервера отображается в окне логирования в центральной части приложения.
app-ss-1

3

После подключения клиента, создается новый объект client, о чем можно узнать по записи в логе new client[0]:
app-ss-1
Число в квадратных скобках – это присвоенный идентификатор клиента, в дальнейшем имино этот идентификатор необходимо использовать клиентам, для того что бы отправлять друг другу персональные сообщения через сервер.

4

Сразу после подключения, сервер ожидает от клиента событие init, формат события можно посмотреть в разделен Протокол общения. После получения события init, если уже есть другие подключенные клиенты, то текущему клиенту сервер отправляет событие users со списком уже подключенных клиентов, а подключенным клиентам отправляет события addUser. Если кто то из клиентов отключился, то остальным клиентам отправляется событие removeUser.

5

После того как клиент отправил на сервер команду init, его имя и идентификатор(разделенные символом :) отображаются в списке подключенных клиентов. При получении команды от клиента, сервер отображает полученную информацию в окне логирования(recieved)
, нажав на кнопку Download bytes можно скачать файл с байтовым массивом(ByteArray) для анализа полученных данных:
app-ss-1

6

Если кликнуть на имя клиента в списке клиентов, в правой части приложения отобразится форма управления клиентом. Его можно принудительно отключить, нажав кнопку disconnect. Или отправить сообщение, набрав текст в соответствующем поле ввода и нажав кнопку send message. После отправки сообщения, информация о переданных данных также отображается в окне логирования(send). Здесь так же можно нажать на кнопку Download bytes что бы сохранить отправленный байтовый массив(ByteArray):
app-ss-1

Протокол общения

Сервер принимает данный в формате ByteArray. Каждый запрос(пакет) должен состоять из трех частей:

  • size – 4 байта, размер пакета
  • format – 3 байта, формата тела запроса, необязательно
  • body – тело запроса, собственно данные запроса

Размер пакета(size) – это сколько байт содержится в одном пакете(команде). Если задан необязательный параметр format, то размер пакета(size) должен содержать значение равное размеру самого пакета(body) + 3 байта отведенные для формата. После размера пакета можно передать три байта, которые могут содержать формат тела. Формат тела может принимать одно из значений:

  • amf – Данные передаются в формате amf-объекта
  • xml – Данные передаются в формате xml-строки
  • jsn – Данные передаются в формате json-строки
  • str – Данные передаются в виде обычной строки, в которой сразу после названия команды идут параметры разделенные символом :

Если формат содержит значение amf, то сразу после формата должен идти amf объект который содержит всю информацию запроса. Передавать формат не обязательно, в этом случае по умолчанию сервер будет принимать данные в формате str, и сразу после size должна начинаться строка с данными запроса. Если запрос содержит формат, то длина пакета должна быть равна 3+bodySize, где 3 – это размер строки содержащий формат, а bodySize – размер тела запроса.

Ниже описан список команд клиента и сервера. В случае если данные передаются в формате amf или jsn, то необходимо передать объект который содержит поля со значениями описанные в таблицах ниже. Если же данные передаются в формате xml, то xml строка должна иметь корневой тег <data>, внутри которого должны быть теги с именами определенными в таблицах ниже. В случае формата данных str, значения необходимо передавать в одной строке разделенные символом :, в том же порядке, в котором они определены в тех же таблицах ниже. Например если необходимо передать на сервер команду init, вот как необходимо формировать данные в разных форматах:

amf:

jsn:

xml:

str:

Команды от клиента к серверу

init – команда инициализации клиента, информация о новом клиенте передается другим клиентам, только после того как новый клиент отправил на сервер команду init

Свойство Значение
command init
name Имя клиента
dataType Формат всех последующих запросов. Если передать этот параметр, то сервер все последующий запросы будет принимать в этом формате, и ответные команды клиенту тоже будет отправлять в этом формате.

message – отправить серверу сообщение, можно передать сообщение как всем клиентам, так и конкретному(если задать значение to).

Свойство Значение
command message
text Текст сообщения
to Идентификатор клиента, кому предназначено сообщение, если параметр не передан, то сообщение рассылается всем подключенным клиентам.
Команды от сервера к клиенту

users – Команда отправляется сервером в ответ на команду клиента init, в том случае, если уже имеются другие подключенные клиенты.

Свойство Значение
command users
users Список подключенных клиентов, передается в виде строки: {id1}@{name1},{id2}@{name2},…

message – Отправить текстовое сообщение клиенту. Это сообщение можно сгенерировать как на сервере, так и на клиенте.

Свойство Значение
command message
text Текст сообщения
from Идентификатор клиента от кого пришло сообщение, если значение -1: значит отправку сообщения сгенерировал сервер а не другой клиент.
to Идентификатор клиента кому предназначено сообщение.

addUser – Сервер отправляет эту команду всем подключенным клиентам в момент, когда подключается новый клиент. Данное событие отправляется только тогда, когда подключившийся клиент отправил на сервер команду init.

Свойство Значение
command addUser
name Имя клиента
id Идентификатор подключившегося клиента.

removeUser – Сервер отправляет эту команду всем подключенным клиентам в момент, когда отключился один из клиентов.

Свойство Значение
command removeUser
id Идентификатор отключившегося клиента.

Эту статью прочитали 2250 раз



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




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




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


    1. Serious Sam Автор записи

      Может быть ваш клиент не видит этот сокет-сервер. На чем пишите клиента? Покажите код.

  1. Жека

    Здравствуйте, по началу сервак видит клиента, но потом обрывает связь и клиент тупо пытается дальше подключиться к серверу не выдавая ошибки (может это как то связано с запросом на policy файл?). Вот клиент http://as3laba.ucoz.ru/TelnetSocket.swf. Код был взят из справочника http://help.adobe.com/ru_RU/as3/dev/WSb2ba3b1aad8a27b0-181c51321220efd9d1c-8000.html#WS5b3ccc516d4fbf351e63e3d118a9b90204-7cf7

    1. Serious Sam Автор записи

      Почему сервер обрывает связь не могу сказать. Мажет из-за ошибки какой – вариантов может быть много. А вот почему клиент не показывает ошибку – у меня была такая ситуация, клиент ожидает подключения секунд 20, а потом уже кидает ошибку об обрыве связи. Здесь есть два варианта – любо ждать эти 20 секунд, либо самому смотреть если нет подключения в течении какого времени – то завершать действие самому и выполнить дальнейшие действия связаны с ошибкой подключения.

      1. Жека

        Дело в том, что ошибок подключений нет… Локально клиент с серваком работает отлично, а вот если с сайта клиент запрашивает сервак, то возникает та самая проблема (может что то по безопасности не дает конектиться)…

        Наверное покажусь, навязчивым (уж, извините за это). Меня ещё интересует как вы прочитали строчку с IPv4 и IPv6 эксплуатируемого железа до подключения сервака? И можно ли потом организовать сокет сервер с мобильных ОС? Заранее благодарю)