Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   flash-policy-file + WebSocket + Servlets + ServerEndpoint Socket (http://www.flasher.ru/forum/showthread.php?t=209719)

Azo 12.12.2014 11:17

flash-policy-file + WebSocket + Servlets + ServerEndpoint Socket
 
Привет!
? Кто-нибудь разворачивал WebSocket на Tomcat8 используя сервлеты?
! Я вот развернул, и вообще супер удобно делать чаты на таком сервере.
... Но рано радовался. Локально все было хорошо, но стоило залить в ВК - проблемы с crossdomain.
! Тогда я поднял демона на 843 порту.
... Казалось бы должно работать теперь
! Но теперь он хочет еще и crossdomain с того порта где развернут мой чат-сервер (8084)
... Странно, я думал что Socket-у достаточно демона на 843. И даже Security.loadPolicyFile не поможет.


приведу особенности моего кода и технологии которая выбрана мной в качестве сервера.



Вот код моего сервера. Там, как вы видите, @ServerEndpoint(value="/chat/{pid}/{uid}/{auth_key}")
Что означает что чат доступен по такому адресу ws://h.o.s.t : port/SocialGame/chat/1/143242342/sdfJljfkJAJldasdLKj
Вот как раз таки наверное в этом и проблема? возможно Security грузит policy из h.o.s.t : port а не h.o.s.t : port/SocialGame/chat/1/143242342/sdfJljfkJAJldasdLKj ?


JAVA:
Код AS3:

package servlets;
 
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.Session;
import javax.websocket.OnOpen;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
 
@ServerEndpoint(value="/chat/{pid}/{uid}/{auth_key}")
public class ChatServer {
 
    @OnOpen
    public void onOpen(Session userSession,@PathParam("pid") Byte pid, @PathParam("uid") Long uid, @PathParam("hash") String auth_key) throws UnsupportedEncodingException {
        // EndpointConfig config
        System.out.println("onOpen " +pid+" uid "+uid);
        if (Signature.isCorrent(pid,uid,hash,Constant.getString("api_vk_id"),Constant.getString("api_vk_secret"))==false) {
                    StatisticaError.add(pid,uid, "CHAT OPEN", "SOCIAL SIGNATURE ERR");                 
                    return;
        }
        System.out.println("New request received. pid: " +pid+" uid "+uid);       
        ChatSession cs=addSession(pid,uid,userSession);
 
        List<ChatProfile> onlines=new ArrayList<ChatProfile>();
                    onlines.add(cs.profile);                   
                    ChatMessage cm_for_others=new ChatMessage(uid,"[Пользователь вошел в игру]",TimeUtils.now_sec(),ChatMessage.TYPE_CONNECT,onlines,(long)0);
                    sendToAll(pid, uid, cm_for_others, userSession);
 
    }
 
    @OnClose
    public void onClose(Session userSession,@PathParam("pid") Byte pid, @PathParam("uid") Long uid) throws UnsupportedEncodingException {
        System.out.println("Connection closed. uid: " + uid);       
        removeSession(pid, uid);
        ChatMessage cm_for_others=new ChatMessage(uid,"[Пользователь вышел из игры]",TimeUtils.now_sec(),ChatMessage.TYPE_DISCONNECT,null,(long)0);
        sendToAll(pid, uid, cm_for_others, userSession);
    }
 
    @OnMessage
    public void OnMessage(String message) {       
        System.out.println("OnMessage " +message);         
    }
 
    @OnMessage
    public void onMessage(ByteBuffer byteBuffer,Session userSession, @PathParam("pid") Byte pid, @PathParam("uid") Long uid) throws UnsupportedEncodingException { 
 
    }
 
    @OnError
    public void onError(Session session, Throwable t) {
        System.out.println("onError " +t.getMessage());         
    }
 
 
 
 
 
}






Вот Демон для раздачи полиса на 843 порту. Он рабочий, вряд ли в нем дело
JAVA:
Код AS3:

package servlets;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
 
import javax.servlet.http.HttpServlet;
 
public class FlashPolicy extends HttpServlet {
        private static final long serialVersionUID = 1L;
        private static ServerSocket serverSock;
        private static boolean listening = true;
        private static Thread serverThread;       
        static {
        try {
        serverThread = new Thread(() -> {
            try {
                serverSock = new ServerSocket(843, 50);                               
                while ( listening ) {
                    final Socket sock = serverSock.accept();
                    Thread t = new Thread(() -> {                                     
                      try { sock.setSoTimeout(10000);                                           
                            InputStream in = sock.getInputStream();                                           
                            byte[] buffer = new byte[23];                                           
                            if (1==1) {
                                String str= "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"+"<cross-domain-policy>\n"+"  <site-control permitted-cross-domain-policies=\"all\"/>\n"+"  <allow-access-from domain=\"*\" to-ports=\"*\"/>\n"+"  <allow-http-request-headers-from domain=\"*\" headers=\"*\"/>\n"+"</cross-domain-policy>";
                                try (OutputStream out = sock.getOutputStream()) {
                                PrintStream ps=new PrintStream(out);
                                    ps.write(str.getBytes());
                                    ps.write(0x00);
                                    ps.flush();
                                }catch ( Exception ex ) {}
                            }                                         
                        }
                        catch ( Exception ex ) {}
                        finally {
                            try { sock.close(); } catch ( Exception ex2 ) {}
                        }
                    });
                    t.start();
                }
            }
            catch ( Exception ex ) {}
        });
        serverThread.start();                     
        }
        catch ( Exception ex ) {}
        }
 
        @Override
        public void destroy() {               
                if ( listening ) listening = false;
                if ( !serverSock.isClosed() ) {
                        try { serverSock.close(); } catch ( Exception ex ) {}
                }
        }
}


Код:

Предупреждение: Тайм-аут ожидания файла политики для сокетов в xmlsocket://localhost:8084 (через 3 секунды). Это не должно вызывать проблем. Пояснения см. на веб-странице http://www.adobe.com/go/strict_policy_files_ru.

*** Нарушение изолированной среды ***
Подключение к localhost:8084 разорвано - отсутствуют разрешения для http://cs624920.vk.me/u152812740/76888803c0630b.zip
Ошибка: Запрос ресурса по адресу xmlsocket://localhost:8084 инициатором запроса из http://cs624920.vk.me/u152812740/76888803c0630b.zip отклонен из-за отсутствия разрешений файла политики.

Error #2044: Unhandled securityError:. text=Error #2048: Security sandbox violation: http://cs624920.vk.me/u152812740/76888803c0630b.zip cannot load data from localhost:8084.
++++++++++++++++++++++++++++++++Disconnected


Rzer 12.12.2014 12:01

Код AS3:

Security.loadPolicyFile("xmlsocket://localhost:843");


Azo 12.12.2014 12:31

Цитата:

Сообщение от Rzer (Сообщение 1176222)
Код AS3:

Security.loadPolicyFile("xmlsocket://localhost:843");


И с этой строчкой и без - флеш же по умолчанию сам должен грузить оттуда
и я пробовал вставлять это. возможно и грузит, но молчит.. перескакивает грузить Полис из порта на котором чат развернут


ну вот еще раз попробовал - все ровно грузит из порта 8084

Код:

Предупреждение: Тайм-аут ожидания файла политики для сокетов в xmlsocket://localhost:8084 (через 3 секунды). Это не должно вызывать проблем. Пояснения см. на веб-странице http://www.adobe.com/go/strict_policy_files_ru.

*** Нарушение изолированной среды ***
Подключение к localhost:8084 разорвано - отсутствуют разрешения для http://cs618217.vk.me/u152812740/2ed4244b9e3479.zip
Ошибка: Запрос ресурса по адресу xmlsocket://localhost:8084 инициатором запроса из http://cs618217.vk.me/u152812740/2ed4244b9e3479.zip отклонен из-за отсутствия разрешений файла политики.

Error #2044: Unhandled securityError:. text=Error #2048: Security sandbox violation: http://cs618217.vk.me/u152812740/2ed4244b9e3479.zip cannot load data from localhost:8084.
++++++++++++++++++++++++++++++++Disconnected


djyamato 12.12.2014 23:54

Я сейчас CometD занимаюсь, и, признаться, где-то встречал для Bayeux протокола экстэншн флэшового полиси, но не припомню.
У меня вопрос к ТС:
а зачем вэбсокеты ? Я имею в виду в вашем контексте.
Флэш клиент, сокет соединение с любым сокет сервером, написанном на java. Вроде этого же достаточно.
Тот же самый Red5.
Если брать вэбсокеты, то это же гемор еще тот (отсутствие поддержки в старых браузерах, я имею ввиду не флэш клиента)
Если проще: зачем коннектиться флэш клиентом к вэб сокету, если есть RTMP

Azo 13.12.2014 01:14

Спасибо всем, я уже разобрался.
djyamato, ну red5 и rtmp сложно развернуть


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

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