Показать сообщение отдельно
Старый 12.12.2014, 11:17
Azo вне форума Посмотреть профиль Отправить личное сообщение для Azo Найти все сообщения от Azo
  № 1  
Ответить с цитированием
Azo
 
Аватар для Azo

Регистрация: Nov 2004
Адрес: Архангельская область
Сообщений: 492
Отправить сообщение для Azo с помощью ICQ Отправить сообщение для Azo с помощью AIM Отправить сообщение для Azo с помощью Yahoo
По умолчанию 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
__________________
-------------------------------
FLASH FLASH FLASH FLASH FLASH