|
|
|||||
Регистрация: Apr 2009
Сообщений: 409
|
WebSocket vs Socket
Всегда использовал стандартный сокет для обмена данными с сервером, и так же всегда интересовал вопрос куда стабильно пропадают 3-5 процентов подключений. Проверялось так: одновременно с подключением к сокету отправлялся http запрос. В итоге около 5 процентов соединений в час числилось пропавшими без вести. Первое что приходит в голову что подключения блокирует фаервол, поэтому решил попробовать подключаться на 80 порт, через webSocket(worlize), в итоге потерянных соединений стало на пару процентов больше. Отсюда вопросы:
Какие дает преимущества использование websocket? почему если он работает через http, его так же не пропускают фаерволы? или через http только рукопожатие, а потом передача обычным сокетом. Какие еще могут быть причины что http(не 80-й порт) проходит, а сокет нет? Стоит ли пробовать socket.io? сомневаюсь что он тут чем то поможет Стоит ли при неудаче подключения на сокет, открывать лонгполинг http? Или вообще 5 процентов - это нормально и переживать не стоит? |
|
|||||
Цитата:
Цитата:
Фаерволл либо блокирует все подключения от программы, либо никаких. Зачем ему блокировать 5% отдельных пакетов? Это же не антивирус, который все пакеты проверяет и опасные блокирует. Цитата:
|
|
|||||
Регистрация: Apr 2009
Сообщений: 409
|
Цитата:
сервер: function socketHandler(socket){ socket.setEncoding('utf8'); socket.setTimeout(300000); socket.setNoDelay(true); socketMsgHandler(socket); // socket.write(getCrossDomainFile() + '\0'); } function socketMsgHandler(socket){ carrier.carry(socket, function(msg){ if (msg=='<policy-file-request/>'){ socket.write(getCrossDomainFile()+'\0'); socket.destroy(); } },'utf8', '\0'); } newSocket = new XMLSocket(); newSocket.connect(host, port); Security.loadPolicyFile("xmlsocket://"+host+":"+port); newSocket.addEventListener(Event.CONNECT, newConnect); newSocket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, secError); на 8113 порту сокеты при загрузке отсылаю на http tryConnect, так же, для проверки соединения, спустя 5 сек отсылаю checkConnection. + на http логирую результат сокет соединения security, ioError, success. в итоге на 1000 подключений tryConnect=1000, checkConnection=999, success: 955, security:10. Не понятно откуда взялись эти 10, и куда пропали 34 соединения. при этом до http сервера все достукиваются без проблем. |
|
|||||
Сперва необходимо подписаться на все нужные события и уже потом вызывать .connect(). Мало ли?
Когда клиент запрашивает политики, он всегда шлёт определённую строку по сокету, что-то вроде <police file request/>. Следует дождаться полного её получения, перед тем как слать файл политик. После этого, на сервере соединение будет разорвано, вами или клиентом. И только потом, флеш клиент устанавливает рабочее соединение. Важно тут то, что для клиента это всё выглядит как одна попытка подключения, в то время как по факту происходит два подключения, первое для политик, второе рабочее.
__________________
Дети не должны знать о своих родителях |
|
|||||
Регистрация: Apr 2009
Сообщений: 409
|
в коде выше все эти моменты отражены. получает полностью <police file request/> (до нулевого байта), потом отвечает политикой и закрывает соединение. вот сам файл политик
function getCrossDomainFile() { var xml = '<?xml version="1.0"?>\n<!DOCTYPE cross-domain-policy SYSTEM' xml += ' "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">'; xml += '\n<cross-domain-policy>\n'; xml += '<allow-access-from domain="*" to-ports="*"/>\n'; xml += '</cross-domain-policy>\n'; return xml; } Цитата:
|
Часовой пояс GMT +4, время: 02:56. |
|
« Предыдущая тема | Следующая тема » |
|
|