Привет!
? Кто-нибудь разворачивал 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