Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Клиент на основе XMLSocket (http://www.flasher.ru/forum/showthread.php?t=86475)

integer 16.10.2006 15:40

Клиент на основе XMLSocket
 
Пишу клиент-серверное приложение: в качестве клиента Flash со следующим кодом:
Код:

socket = new XMLSocket();
socket.onConnect = function(success) {
        if (success) txt.text="connect";
        else txt.text="error";
}
socket.onData = function(data) {
        txt.text("message recived");
}
socket.connect("127.000.000.001", 9587);

(на сцене экземпляр TextField c именем txt)

Сервер сделал сначала на С++Builder, сделав там объект ServerSocket, который просто при коннекте отправлял строку. В результате Во флешке высвечивалось "connect", но "message recived" не появлялось, а на сервере работает так как будто все (в том числе и передача) произошло успешно.
Я проботал всесь форум и все, что только можно было - ни-у-кого, вроде, подобных проблем не было, протестил на разных машинах - аналогично. Попробовал отправить сообщние от клиента серверу - передается без проблем.
Потом переписал сервер на Java таким образом:
Код:

import java.io.*;
import java.net.*;

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(9587);
        Socket socket = server.accept();
        PrintWriter out = new PrintWriter( new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())));
        out.println("Hello");
        server.close();
        socket.close();
    }
}

Результат аналогичен: Сервер отправляет - Флэшка коннектиться, но не получает :wacko:

Народ помогите кто-нибудь, пожалуйста!!! Обращаюсь сюда как в предпоследнюю инстанцию. (Последней станет встреча мой головы со стенкой)...

etc 16.10.2006 16:54

А почему адрес 127.000.000.001, а не 127.0.0.1?

integer 16.10.2006 17:56

Цитата:

Сообщение от __etc
А почему адрес 127.000.000.001, а не 127.0.0.1?

Это одно и то же. Я пробовал и так, и так - одно и тоже. И вообще коннект есть - значит проблема не в этом.

nbno 16.10.2006 18:38

Попробуй так:
Код:

out.println("Hello\0");

integer 16.10.2006 18:46

не помогает. :( Языки на основе Си сами вставляют нулевой байт в конец...

integer 16.10.2006 18:57

Вложений: 1
Вот кстати исходники этого дела (для серверной части нужен JavaBuilder2006):

nbno 16.10.2006 20:19

Замени в исходнике .fla
Код:

txt.text("hello")
на
Код:

txt.text="hello"
или
Код:

txt.text=data

wvxvw 16.10.2006 20:21

мож я чего не понимаю... а может onConnect случается после onData?..
Попробуй просто в 2 разных текстовых поля выводить...

integer 16.10.2006 20:36

Мдя, ошибка, конечно глупая, впрчем на onData у меня стояло так:
Код:

socket.onData = function(data) {
        trace("hello");
}

(отсюда скобки и остались). Сейчас попробовал создать еще поле txt2 и переписать так:
Код:

socket.onData = function(data) {
        txt2.text="recivied";
}

Все осталось как и прежде.

wvxvw 16.10.2006 22:43

А может его эти строчки не устраивают?
Код:

socket = new XMLSocket();
socket.onConnect = function(success) {
        if (success) txt.text="connect";
        else txt.text="error";
}

Код:

socket = new XMLSocket();
socket.onConnect = function(success) {
        if (success) {
txt.text="connect";
} else {
txt.text="error";
}
}

По идее так надо бы... но вряд ли это как-то связано...

Nirth 16.10.2006 23:33

Можешь послать сам сервер откомпиленый, у меня нету IDE Для явы.

integer 16.10.2006 23:50

Цитата:

Сообщение от wvxvw
но вряд ли это как-то связано...

М-да, это точно - работает так же. Блин, может у меня версия Флэшки кривая... или еще че-нить в таком роде... уж даже не знаю... Ведь все написано абсолютно ПРАВИЛЬНО!:mad::mad::mad:

integer 17.10.2006 00:08

Вложений: 1
Вот значит сама флэшка (в новой версии) и откомпиленый сервер на Яве. - файлик Server.class

wvxvw 17.10.2006 03:42

Цитата:

onData (XMLSocket.onData handler)
onData = function(src:String) {}

Invoked when a message has been downloaded from the server, terminated by a zero (0) byte. You can override XMLSocket.onData to intercept the data sent by the server without parsing it as XML. This is a useful if you're transmitting arbitrarily formatted data packets, and you'd prefer to manipulate the data directly when it arrives, rather than have Flash Player parse the data as XML.

By default, the XMLSocket.onData method invokes the XMLSocket.onXML method. If you override XMLSocket.onData with custom behavior, XMLSocket.onXML is not called unless you call it in your implementation of XMLSocket.onData.

Availability: ActionScript 1.0; Flash Player 5

Parameters
src:String - A string containing the data sent by the server.

Example
In this example, the src parameter is a string containing XML text downloaded from the server. The zero (0) byte terminator is not included in the string.

XMLSocket.prototype.onData = function (src) {
this.onXML(new XML(src));
т.е. попробуй так:
Код:

XMLSocket.prototype.onData = function (src) {
    this.onXML = tracer;
}
function tracer(){
trace("!!!");
}

И еще вариант...
Поскольку connect() возвращает true\false попробуй сделать что-то типа:
Код:

var _l1:Boolean = socket.connect();
_root.onEnterFrame =function(){
trace(_l1);
}

А вдруг конекшен сразу обрубается после того, как установился, и ничего после этого уже не передается?
Но вообще странно все это... жаль сейчас потестить не могу =(

FourSide 17.10.2006 11:32

Во флэше, вроде, всё написано правильно. Но у меня одно время не приходили сообщения (сервер на ПХП) пока я не добавил в скрипте сервера нулевой код в конце строк (\0).
Но если Java, говорите, сама добавляет....

integer 17.10.2006 12:45

Цитата:

Сообщение от wvxvw
т.е. попробуй так:
Код:

XMLSocket.prototype.onData = function (src) {
    this.onXML = tracer;
}
function tracer(){
trace("!!!");
}


У меня событие onData видимо не срабатывает - вот в чем проблемс-то. Поэтому такая фишка не получится (хотя, я на всякий случай попробовал). Событие onXML также не работает.
Цитата:

Сообщение от wvxvw
И еще вариант...
Поскольку connect() возвращает true\false попробуй сделать что-то типа:
Код:

var _l1:Boolean = socket.connect();
_root.onEnterFrame =function(){
trace(_l1);
}

А вдруг конекшен сразу обрубается после того, как установился, и ничего после этого уже не передается?

Ну, вообще-то даже если он сразу обрубается, то _l1 так и останется true, поскольку он задавался при самом коннекте (который оказался удачным). Хотя, у меня после вставки этого кода, он true даже если сервер при этом не запущен (то есть при txt.text=="error"). Впрочем, судя по мануалу, это нормально, т. к. свидетельствует только о начальной стадии соединения, которая проходит нормально в обоих случаях.
В общем, такой подход не годится явно... А булевского флажка типа XMLSocket.connected макромедицы почему-то не предусмотрели :(

integer 17.10.2006 12:48

Цитата:

Сообщение от FourSide
Во флэше, вроде, всё написано правильно. Но у меня одно время не приходили сообщения (сервер на ПХП) пока я не добавил в скрипте сервера нулевой код в конце строк (\0).
Но если Java, говорите, сама добавляет....

Ну, насчет последнего у меня уверенности нет.... поэтому я пока что поставил в передаваемый серваком текст нулевой байт вручную. И все тестировки делаю только с ним. Так что проблема, связанная с этим, исключена...

nbno 17.10.2006 12:57

С клиентом все впорядке. Проверял на двух серверах (java,php), работает как часы.

integer 17.10.2006 13:10

Цитата:

Сообщение от nbno
С клиентом все впорядке. Проверял на двух серверах (java,php), работает как часы.

А можешь, исходники этих серверов дать,а?:rolleyes:

wvxvw 18.10.2006 16:17

Код:

var socket:XMLSocket = new XMLSocket();
socket.connect(...);
socket.onClose = function () {
    trace("Connection to server lost.");
}

Вот, опять же, так можно проверить отключился ли сервер
ЗЫ. А может причина банально простая: файрвол\прокся просто не пускают в этот порт? %)
ЗЫЫ. Ну и не знаю... попробуй сниффером посмотреть, приходит ли вообще с сервера хоть что-нибудь...

Webas 19.10.2006 14:33

Может надо посылать XML файл с настройками безопасности?
Может что-нить в этом духе :
Код:

<cross-domain-policy>
<allow-access-from domain="*" to-ports="507" />
<allow-access-from domain="*.foo.com" to-ports="507,516" />
<allow-access-from domain="*.bar.com" to-ports="516-523" />
<allow-access-from domain="www.foo.com" to-ports="507,516-523" />
<allow-access-from domain="www.bar.com" to-ports="*" />
</cross-domain-policy>


FourSide 19.10.2006 15:06

Я не силён в Java, но мне кажется, что такой код
Код:

import java.io.*;
import java.net.*;

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(9587);
        Socket socket = server.accept();
        PrintWriter out = new PrintWriter( new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())));
        out.println("Hello");
        server.close();
        socket.close();
    }
}

не ждёт коннекта от клиента, а закрывается сразу после открытия. И не понятно, куда и кому отправляется этот "Hello". По крайней мере, логика сокета отличается от других языков. Я бы попробовал сделать сервер на каком-нибудь визуальном языке (Delphi, например), где установка сервера делается несколькими нажатиями и протестировать клиента.
На крайний случай, проверить живой ли сервер можно через Telnet.

integer 19.10.2006 17:34

Оказалось (впрочем, как я и ожидал), что ларчик просто открывался. Проблемс у меня с серверным кодом, а именно класс PrintWriter при конвертации из потока OutputStream в поток Writer, использует буфер и по умолчанию не отсылает данные, пока тот полностью не забьется. Надо было всего лишь добавить в его констуктор второй параметр - true и тогда он отсылает каждую строку сразу:
Код:

PrintWriter out = new PrintWriter( new BufferedWriter(new
OutputStreamWriter(socket.getOutputStream())), true);

Цитата:

Сообщение от FourSide
Я не силён в Java, но мне кажется, что такой код не ждёт коннекта от клиента, а закрывается сразу после открытия. И не понятно, куда и кому отправляется этот "Hello". По крайней мере, логика сокета отличается от других языков. Я бы попробовал сделать сервер на каком-нибудь визуальном языке (Delphi, например), где установка сервера делается несколькими нажатиями и протестировать клиента.
На крайний случай, проверить живой ли сервер можно через Telnet.

Твое предположение неверно, т.к. функуция ServerSocket.accept() как раз таки заставляет программу остановиться и ожидать пока не произойдет коннект. Но именно размышления над твоим постом, заставили меня понять суть ошибки, за что тебе огромнейшее спасибо.
Интересно, почему здесь, на форуме, все поголовно любят писать серверную часть на Delphi? (некоторые, правда, умудряются писать на ПХП :taunt: ) Я, например, на дух не переношу Паскаль и все, что с ним связано (согласись, вещь устаревшая).
Кстати, как можно видеть из моего первого поста, сначала я писал на С++Builder. Если я правильно понимаю, эта среда относится к "визуальным языкам". Самое интересное, что там работало также, как и на Яве (до сих пор не могу понять почему). Поэтому-то я долго не мог поверить, что проблемы действительно в сервере.

integer 19.10.2006 17:39

Цитата:

Сообщение от Webas
Может надо посылать XML файл с настройками безопасности?
Может что-нить в этом духе :
<cross-domain-policy>
<allow-access-from domain="*" to-ports="507" />
<allow-access-from domain="*.foo.com" to-ports="507,516" />
<allow-access-from domain="*.bar.com" to-ports="516-523" />
<allow-access-from domain="www.foo.com" to-ports="507,516-523" />
<allow-access-from domain="www.bar.com" to-ports="*" />
</cross-domain-policy>

Хотя, я и раобрался со своей проблемой, но вот связи с этим твоим постом, меня заинтересовали эти самые настройки безопасности. Не мог бы ты просвятить зачем они вообще нужны и как работают, или лучше ссылочку какую-нить дать, где это объясняется?

Nirth 19.10.2006 17:41

http://www.moock.org/asdg/technotes/...inPolicyFiles/

integer 19.10.2006 17:46

Цитата:

Сообщение от Nirth

Мдя, спасибо, конечно.....:confused: А нет ли чего-нить на родном языке, дабы потратить на прочтение не сутки, а минут 20....:)

Nirth 19.10.2006 17:48

Не интересовался, но я думаю ты можешь, выловить из той статьи ключевые слова, и забросить их в гугл с настроками "искать на русском" =)?

integer 19.10.2006 17:52

Цитата:

Сообщение от Nirth
Не интересовался, но я думаю ты можешь, выловить из той статьи ключевые слова, и забросить их в гугл с настроками "искать на русском" =)?

Мда, видимо, прийдется так и поступить....

FourSide 19.10.2006 18:08

На более русском языке :)
http://www.sharedfont.com/liveDocs/H.../00001097.html


Часовой пояс GMT +4, время: 07:24.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.