PDA

Просмотр полной версии : XML Socket etc


Ruffus
28.06.2008, 00:56
Я организовал скромный TCPServer на Delphi средствами библиотеки Indy, чтобы слать данные в мувик. После старта сервера и мувика вижу (через trace и прочее), что соединение устанавливается. Однако данные не ходят ни туда, ни сюда. ПОдскажите, плиз, какие могут быть причины.

wvxvw
28.06.2008, 03:01
самая популярная - настройки безопасности (думаю, что если по форуму поискать по "crossdomain", "socket" или "global security settings" - много чего найдеться).
менее популярные - разные прокси с фаирволами.
Ну и дальше надо код смотреть, вариантов много =)

Ruffus
28.06.2008, 11:30
А если у меня подключение идёт на localhost и firewall отключен?)

wvxvw
28.06.2008, 13:08
ну опять же, если запускать SWF из среды разработки проблем безопасности не возникнет, а из стандалон плеера/из браузера - да.

Ruffus
28.06.2008, 16:22
Мдамс, я как раз из среды запускаю...

Ruffus
30.06.2008, 12:08
Попробовал клиент сделать на той же Indy. Стравливаю его с сервером - всё Ок. Вижу, как сообщения ходят туда сюда. А с флэшем кроме коннекта самого ничего не происходит.

_conn = false;
_xmlSocket = new XMLSocket();
_xmlSocket.onConnect = Delegate.create(this, xmlOnConnect);

private function xmlOnConnect(success:Boolean)
{
_conn = success;
trace('connected' + " " + success);
_xmlSocket.send(new XML('<text>BYAGJOPR</text>'));
_xmlSocket.send('<text>BYAGJOPR</text>');
}

Alex_beginner
30.06.2008, 12:16
Ruffus! Пожалуйста выложите Дельфийский код TCPSever'a и код Флеша. Там посмотрим. А то абстрактно гадать, что у Вас неверно довольно сложное занятие.

Ruffus
30.06.2008, 15:57
Код флеша показан выше.
Вот скромный сервер.

procedure TfmMain.btnOffClick(Sender: TObject);
var i: integer;
begin
for i := 0 to hvIdTCPServer.Contexts.LockList.Count - 1 do
TIdContext(hvIdTCPServer.Contexts.LockList[i]).Connection.Disconnect;
end;

procedure TfmMain.btnOnClick(Sender: TObject);
begin
hvIdTCPServer.DefaultPort := 1234;
hvIdTCPServer.Active := True;
end;

procedure TfmMain.FormDestroy(Sender: TObject);
var i: integer;
begin
for i := 0 to hvIdTCPServer.Contexts.LockList.Count - 1 do
TIdContext(hvIdTCPServer.Contexts.LockList[i]).Connection.Disconnect;
end;

procedure TfmMain.hvIdTCPServerConnect(AContext: TIdContext);
begin
mmOut.Lines.Add('Connected');
lbInfo.Caption := 'ON';
end;

procedure TfmMain.hvIdTCPServerDisconnect(AContext: TIdContext);
begin
mmOut.Lines.Add('Disconnected');
end;

procedure TfmMain.hvIdTCPServerExecute(AContext: TIdContext);
var
lCmd: string;
begin
mmOut.Lines.Add('Executed');
lCmd := Trim(AContext.Connection.IOHandler.ReadLn);
mmOut.Lines.Add(lCmd);
if AnsiSameText(lCmd, '<test>BYAGJOPR</test>' ) then
AContext.Connection.IOHandler.WriteLn('<appeal><function name="followLink" param="1" type="set"></function></appeal>');

if AnsiSameText(lCmd, 'HELP') then
begin
AContext.Connection.IOHandler.WriteLn('HELP');
AContext.Connection.IOHandler.WriteLn('QUIT');
AContext.Connection.IOHandler.WriteLn('GETTIMESTAMP');
AContext.Connection.IOHandler.WriteLn('');
end

else if AnsiSameText(lCmd, 'QUIT') then
begin
AContext.Connection.IOHandler.WriteLn('Goodbye...');
AContext.Connection.IOHandler.WriteLn('');
AContext.Connection.Disconnect;
end

else if AnsiSameText(lCmd, 'GETTIMESTAMP') then
begin
AContext.Connection.IOHandler.WriteLn(
FormatDateTime('yyyy-mm-ddThh:nn:ss.zzz', Now));
AContext.Connection.IOHandler.WriteLn('');
end;

end;

wvxvw
30.06.2008, 16:24
попробуйте потрейсить, XMLSocket.onData во флеше. К сожелению Delphi я не знаю =( поэтому не могу сказать все ли нормально с серверной частью.

Ruffus
30.06.2008, 19:30
Серверную часть я тестил с помощью клиенской части. Работало на ура всё.
Ну а в odData я первым оператором вывожу полученные данные. И ничего. Потому и говорю, что не ходит ничего.

wvxvw
30.06.2008, 19:59
хм... мне тяжело судить... а onClosed() не вызывается случайно?
т.е. еще раз, onConnect вызывается, а оnData - нет?

Alex_beginner
30.06.2008, 20:25
В сервере вроде бы все нормально.

Тут возможно дело в политике безопасности. Надо попробовать allowDomain.

Потом, что то я невижу в флешевском коде вот это:

XMLSocket.connect(server, port);

Может у Вас соединение как то подругому инициализируется.

Проверьте порты и адреса, мож в этом дело.

Ruffus
30.06.2008, 22:44
onClose вызывается когда надо, например когда сервер отключается.
Хотелось бы знать, нет ли способа застраховаться от проблем с безопасностью. Что там allowDomain? У меня на локалхост подключение идёт. Этот код я не включил, потому что соединение проходит. Я вижу что проходят по трассировке из обработчика onConnect и по сообщениям сервера. Незадача в том, что _данные_ не ходят туда-сюда.

wvxvw
30.06.2008, 23:41
Хм... есть такой еще вариант... по идее все ХМЛи должны быть в кодировке utf-8, если этого нет, то сокет может отказаться их читать... или возможно, он ждет BOM сигнатуру перед началом сообщения, а если вы ее не посылаете, то сообщение "не замечает". Т.е. попробуйте явно отправить сигнатуру и удостоверится, что следующие за ней байты будут прочитаны в нужной кодировке так, что сформируют валидный ХМЛ.

У меня еще, например, была такая проблема, но, правда, с Си-шным сокетом. он отказывался принимать за 1 раз сообщение больше 4Кб... причин так и не удалось установить =) т.е. он так до сих пор и работает по 4Кб за раз =)
Так что причина может быть еще и в длине сообщения.

Ruffus
01.07.2008, 14:51
Скажите, как может кодировка той или иной стороны (передающей или перенимающей) повлиять на пересылку байтиков и битиков?
Я пишу так:

_xmlSocket.send(new XML('<test>BYAGJOPR</test>'));

Даже если самому тексту не хватает сигнатур каких-то, неужели констуктор ХМЛ не может его обвернуть нужным образов?

crazyone
01.07.2008, 15:58
Лично мне кажется, что проблема именно в сервере. Протокол не такой, или еще что-то.
По поводу utf-8 — у вас нелатинских символов все-равно нет. По поводу безопасности — если подключение есть, то и сообщения будут ходить.

wvxvw
01.07.2008, 18:30
>> Скажите, как может кодировка той или иной стороны (передающей или перенимающей) повлиять на пересылку байтиков и битиков?
Я пишу так:

Ну как, это же не бинарный сокет, он ждет от вас определенного формата данных, а не любой, какой прийдется =)
или может он 00 или 0A / 0D посылает перед сообщением нинаю...

Alex_beginner
01.07.2008, 18:35
Ruffus! Прислушайтесь к рекомендациям wvxvw! В них есть резон.

Ruffus
01.07.2008, 19:04
Я уже не знаю, что думать. В голову лезут мысли о том, что значение имеет факт того, что xmlSocket находится не в кадре, а в экземпляре, создаваемом в этом кадре. Нипанятна...

wvxvw
01.07.2008, 19:09
Не... если трейс конекта был, то значит сокет создан, все норм. Просто, что я думаю... (честно, я не делал сокет на АS2, но на АS3 ХМЛ сокет стал бы ругаться, если бы пришли какие-нибудь "неожиданные" данные. Т.е. я думаю, что все-таки нужно прислать сначала BOM, потом точно в кодировке utf-8 данные, потом, на всякий случай 00 (фз, может 0А тоже покатит =).

А, вот еще подумал, а на какой порт конект? А то флеш не любит порты ниже 1024.

Ruffus
02.07.2008, 12:41
Порт - 1234. Расскажите, что такое этот BOM.
Ещё интересно, что данные не принимает не только флэш (который может быть чувствителен к кодировке),
но и сам сервер. Хотя этот сервер был тестирован соответствующим клиентом.
Если хмл-сокет ждёт определённого формата данных, расскажите, что это за формат. Только всё равно
кодировка, воспринимаемая флэшем, едва ли к формату относится.

Ruffus
09.07.2008, 18:12
Нашёл на форуме тред с похожей проблемой.
Поставил на стороне флеша +'\n\ к передаваемой строке, сервер стал получать.
Теперь вопрос в том, как пофиксить сервер. Ставлю +#10, +'\n', делал AnsiToUTF8.
Флеш почему-то продолжает игнорить данные.
Напомню, что у меня Indy TCP Server.

Ruffus
09.07.2008, 23:03
Поставив перед передаваемой строкой на сервере #0, добился того, что начало срабатывать событие onData. В конце ставил и #10, и #13#10, и #10#13. Строчку загонял в метод AnsiToUTF8. В итоге обработчик события говорит, что пришедшая строка пустая.
Горю. Помогите.

wvxvw
10.07.2008, 01:19
А зачем перед сообщением возврат каретки? в конце нужно - 0х00 или, мб 0х0А
BOM == 0xEF 0xBB 0xBF (сигнатура UTF-8).

Ruffus
10.07.2008, 02:07
Перед сообщением #0, возврат это ж #13 вроде. Я ставлю в конце #10, то есть 0x0A аналогично \n со стороны флэш.
А BOM в начало я так полагаю?

wvxvw
10.07.2008, 03:57
в такой нотации я не знаю, что #0 и #13 значит...
0х00 - это первый символ в этой таблице: http://www.asciitable.com/
БОМ - в начало. 0x00 - в конец.
\n == 0x0A
\r == 0x0D

Greenish
11.07.2008, 11:56
сервер должен отправлять в конце сообщения нулевой байт.
из хелпа: Each XML message is a complete XML document, terminated by a zero (0) byte