Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   Сокет соединение Java + AS3 (http://www.flasher.ru/forum/showthread.php?t=166047)

Try_in_flash 29.08.2011 14:31

Сокет соединение Java + AS3
 
Никак не могу решить проблему соединения сервера на Java и ActionScript 3.0

Вот код сервера на java (взят с хэлпа Adobe, и немного видоизменен, но незначительно), компилируется в Eclipse

Код:

import java.io.*;
import java.net.*;
 
class SimpleServer
{
    private static SimpleServer server;
    ServerSocket socket;
    Socket incoming;
    BufferedReader readerIn;
    PrintStream printOut;
 
    public static void main(String[] args)
    {
        int port = 8080;
      server = new SimpleServer(port);
    }
 
    private SimpleServer(int port)
    {
        System.out.println(">> Starting SimpleServer");
        try
        {
            socket = new ServerSocket(port);
            incoming = socket.accept();
            readerIn = new BufferedReader(new InputStreamReader(incoming.getInputStream()));
            printOut = new PrintStream(incoming.getOutputStream());
            out("Enter EXIT to exit.\r");
            boolean done = false;
            while (!done)
            {
                String str = readerIn.readLine();
                if (str == null)
                {
                    done = true;
                }
                else
                {
                    out("Echo: " + str + "\r");
                    if(str.trim().equals("EXIT"))
                    {
                        done = true;
                    }
                }
               
            }
            incoming.close();
        }
        catch (Exception e)
        {
            System.out.println(e);
        }
    }
 
    private void out(String str)
    {
            System.out.println(str);
        printOut.println(str);
        printOut.flush();
       
    }
}

Код на as3:

Код AS3:

package MultiPlayer
{
        import flash.display.Sprite;
        import flash.events.DataEvent;
        import flash.events.Event;
        import flash.events.ProgressEvent;
        import flash.net.*;
        import flash.text.TextField;
 
        public class MultiPlayer extends Sprite
        {
                private var port:Number = 8080;
                private var socket:XMLSocket = new XMLSocket("127.0.0.1",port);
                private var textField:TextField = new TextField();
                public function MultiPlayer()
                {
                        textField.height = 300;
                        textField.width = 600;
                        textField.x = 100;
                        textField.y = 100;
                        textField.backgroundColor = 0x00ff00;
                        textField.background = true;
                        this.addChild(textField);
 
 
                        socket.addEventListener(Event.CONNECT, onConnect );
                        socket.addEventListener(Event.CLOSE,onClose);
                        socket.addEventListener(DataEvent.DATA, onSocketData);
                        socket.connect("127.0.0.1",port);
                }
 
                private function onConnect( event:Event ):void
                {
                        textField.appendText("Соединение для передачи установлено...\n");
                }
 
                private function onClose( event:Event ):void
                {
                        textField.appendText("Соединение для передачи прервано...\n");
                }
 
                private function onSocketData( event:DataEvent ):void
                {
                        textField.appendText("poly4eno [" + event.type + "] " + event.data);
 
                        try
                        {
                                socket.send("test\n");
                                textField.appendText("data sending...\n");
                        }
                        catch(e:Error)
                        {
                                textField.appendText("fail...\n");
                        }
                }
        }
}

Они соединяются, но потом ни к одному не приходит никакая информация, ни к другому.

Возможно проблема с файлом политики XMLсокет соединения. Потому что его просто нет. Я никак не могу понять куда его надо поместить, что бы его автоматически загрузило.
Либо, где этот файл должен находиться, что бы можно было написать:
Код:

Security.loadPolicyFile("xmlsocket://127.0.0.1:8080");
я сделал файл crossdomain.xml
с текстом:

Код:

<?xml version="1.0"?>
<cross-domain-policy> 
    <allow-access-from domain="*" to-ports="*" /> 
</cross-domain-policy>

и разместил его в папке bin/ - проекта, рядом с файлом сервера, но ...

и ещё: если закоментить ту часть, де идет цикл, то функция out срабатывает, но данные не передаются в AS3.
Если кто-то сталкивался с этими проблемами, можете выложить работающие исходники?

Zebestov 29.08.2011 14:40

Перенесено в раздел "Серверные технологии и Flash".

bav 29.08.2011 15:47

Почитайте про подключение к сокетам.
Цитата:

По умолчанию Flash Player ищет файл политики сокетов у порта 843 и у того же порта, который используется для основного подключения к сокету.
У меня, например, было так:
Код:

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

class FlashSecurityServer
{
    public static void main(String[] args)
    {
        try
        {
            System.out.println("-> Security server started...");
            ServerSocket server = new ServerSocket(843, 128, InetAddress.getByName("192.168.34.36"));
            Socket client;
            DataOutputStream out;
            DataInputStream in;
           
            // Reading crossdomain.xml
            FileInputStream xmlFile = new FileInputStream("files/crossdomain.xml");
            int xmlBytesCount = xmlFile.available();
           
            byte[] xmlBytes = new byte[xmlBytesCount + 1];
            xmlFile.read(xmlBytes, 0, xmlBytesCount);
            xmlBytes[xmlBytesCount] = 0;
            xmlFile.close();
           
            byte[] policyRequest = new byte[23];
           
            for (;;)
            {
                client = server.accept();
                out = new DataOutputStream(client.getOutputStream());
                in = new DataInputStream(client.getInputStream());
               
                in.read(policyRequest, 0, 23);
               
                out.write(xmlBytes, 0, xmlBytesCount + 1);
                out.flush();
                System.out.println(":: FSS :: Policy sended to " + client.toString());
                client.close();
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

А crossdomain.xml был такой:
Код:

<?xml version="1.0"?>
<cross-domain-policy>
    <allow-access-from domain="*" to-ports="*" meta-policy="master-only"/>
</cross-domain-policy>


Try_in_flash 29.08.2011 19:05

Я попробовал так сделать, и кое-что получилось. На 843 порт, создать сервер-политики не удалось, пришлось создать на 2525, и модифицировать для него as3.
Получилось отправлять данные на сервер, а вот получить что-либо не выходит ((
Вот модифицированный код:
Джава:
Код:

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

class FlashSecurityServer
{
    public static void main(String[] args)
    {
        try
        {
            System.out.println("-> Security server started...");
            ServerSocket server = new ServerSocket(2525);
            Socket client;
            DataOutputStream out;
            DataInputStream in;
           
            // Reading crossdomain.xml
            FileInputStream xmlFile = new FileInputStream("crossdomain.xml");
            int xmlBytesCount = xmlFile.available();
           
            byte[] xmlBytes = new byte[xmlBytesCount + 1];
            xmlFile.read(xmlBytes, 0, xmlBytesCount);
            xmlBytes[xmlBytesCount] = 0;
            xmlFile.close();
           
            byte[] policyRequest = new byte[23];
           
//            for (;;)
//          {
                client = server.accept();
                out = new DataOutputStream(client.getOutputStream());
                in = new DataInputStream(client.getInputStream());
               
                in.read(policyRequest, 0, 23);
               
                out.write(xmlBytes, 0, xmlBytesCount + 1);
                out.flush();
                System.out.println(":: FSS :: Policy sended to " + client.toString());
                client.close();
//        }
               
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
       
        int port = 8080; // случайный порт (может быть любое число от 1025 до 65535)
        SimpleServer(port);
     
    }
    static ServerSocket socket;
    static Socket incoming;
    static BufferedReader readerIn;
    static PrintStream printOut;
 
    private static void SimpleServer(int port)
    {
        System.out.println(">> Starting SimpleServer");
        try
        {
            socket = new ServerSocket(port);
            incoming = socket.accept();
            readerIn = new BufferedReader(new InputStreamReader(incoming.getInputStream()));
            printOut = new PrintStream(incoming.getOutputStream());
            out("Enter EXIT to exit.\r");
            boolean done = false;
            while (!done)
            {
                String str = readerIn.readLine();
                if (str == null)
                {
                    done = true;
                }
                else
                {
                    out("Echo: " + str + "\r");
                    if(str.trim().equals("EXIT"))
                    {
                        done = true;
                    }
                }
               
            }
            incoming.close();
        }
        catch (Exception e)
        {
            System.out.println(e);
        }
    }
 
    private static void out(String str)
    {
            System.out.println(str);
        printOut.println(str);
        printOut.flush();
       
    }
}

ас3:
Код AS3:

package MultiPlayer
{
        import flash.display.Sprite;
        import flash.events.*;
        import flash.net.*;
        import flash.system.Security;
        import flash.text.TextField;
 
        public class MultiPlayer extends Sprite
        {
                private var port:Number = 8080;
                private var socket:XMLSocket = new XMLSocket("127.0.0.1",port);
                private var textField:TextField = new TextField();
                public function MultiPlayer()
                {
                        textField.height = 300;
                        textField.width = 600;
                        textField.x = 100;
                        textField.y = 100;
                        textField.backgroundColor = 0x00ff00;
                        textField.background = true;
                        this.addChild(textField);
                        socket.connect("127.0.0.1",2525);
                        try
                        {
                        Security.loadPolicyFile("xmlsocket://127.0.0.1:2525");
                        }
                        catch(e:Error)
                        {
                                textField.appendText("\n no policy find \n");
                        }
                        configureListeners(socket);
                        socket.connect("127.0.0.1",port);
 
                }
 
                private function configureListeners(dispatcher:IEventDispatcher):void
                {
                        dispatcher.addEventListener(Event.CLOSE, closeHandler);
                        dispatcher.addEventListener(Event.CONNECT, connectHandler);
                        dispatcher.addEventListener(DataEvent.DATA, dataHandler);
                        dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
                        dispatcher.addEventListener(ProgressEvent.PROGRESS, progressHandler);
                        dispatcher.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
                }
 
                private function closeHandler(event:Event):void {
                        textField.appendText("\ncloseHandler: \n" + event);
                }
 
                private function connectHandler(event:Event):void {
                        textField.appendText("\nconnectHandler: \n" + event);
                        socket.send("test\n");
                        textField.appendText("data sending...\n");
                }
 
                private function dataHandler(event:DataEvent):void {
                        textField.appendText("\ndataHandler: \n" + event);
                }
 
                private function ioErrorHandler(event:IOErrorEvent):void {
                        textField.appendText("\nioErrorHandler: \n" + event);
                }
 
                private function progressHandler(event:ProgressEvent):void {
                        textField.appendText("\nprogressHandler loaded:" + event.bytesLoaded + " total: \n" + event.bytesTotal);
                }
 
                private function securityErrorHandler(event:SecurityErrorEvent):void {
                        textField.appendText("\nsecurityErrorHandler: \n" + event);
                }
 
        }
}

как видно по коду, мы в ас3, должны получать сообщения:
Enter EXIT to exit.\r и "Echo: test\r"
Они оба отображаются в консоли джавы, но не передаются в ас3.

Добавлено через 15 часов 35 минут
Спасибо, bav, код очень сильно помог в преодолении данной проблемы. А не отсылалось обратно сообщения, из-за того, что java не добавляет вконец строки нулевой байт. Если сделать это вручную, все работает =)
Код:

out("Echo: " + str + (char)0);


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

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