|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
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: 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: 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 |
|
|||||
__________________
if (love is true) break my.heart; |
|
|||||
И с этой строчкой и без - флеш же по умолчанию сам должен грузить оттуда
и я пробовал вставлять это. возможно и грузит, но молчит.. перескакивает грузить Полис из порта на котором чат развернут ну вот еще раз попробовал - все ровно грузит из порта 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
__________________
------------------------------- FLASH FLASH FLASH FLASH FLASH |
|
|||||
Я сейчас CometD занимаюсь, и, признаться, где-то встречал для Bayeux протокола экстэншн флэшового полиси, но не припомню.
У меня вопрос к ТС: а зачем вэбсокеты ? Я имею в виду в вашем контексте. Флэш клиент, сокет соединение с любым сокет сервером, написанном на java. Вроде этого же достаточно. Тот же самый Red5. Если брать вэбсокеты, то это же гемор еще тот (отсутствие поддержки в старых браузерах, я имею ввиду не флэш клиента) Если проще: зачем коннектиться флэш клиентом к вэб сокету, если есть RTMP |
|
|||||
Спасибо всем, я уже разобрался.
djyamato, ну red5 и rtmp сложно развернуть
__________________
------------------------------- FLASH FLASH FLASH FLASH FLASH |
Часовой пояс GMT +4, время: 20:44. |
|
« Предыдущая тема | Следующая тема » |
Теги |
crossdomain , java , ServerEndpoint , Tomcat8 , webSocket |
|
|