PDA

Просмотр полной версии : Ошибка сокета и нарушение изолированной среды


Кирпич
28.10.2014, 22:29
Добрый день! Хотел начать работать с сетью во flash. Решил начать с простого соединения: клиент - flash, сервер - java. Код для этого я слизал с одного из форумов, так что он не мой.
package server2;
import java.io.*;
import java.net.*;

class ServeOneJabber extends Thread {
private Socket socket;
private BufferedReader in;
private PrintWriter out;
private String localAddrId;

public ServeOneJabber(Socket s) throws IOException {
socket = s;
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket
.getOutputStream())), true);
InetSocketAddress remoteAddr = (InetSocketAddress)socket.getRemoteSocketAddress();
localAddrId = remoteAddr.getHostName() + ":" + remoteAddr.getPort();
start(); // вызываем run()
}

public void run() {
try {
while (true) {
String str = in.readLine();
if (str.contains("<policy-file-request/>")){
str = "<cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"5555-9999\" /></cross-domain-policy>\u0000";
System.out.println("["+localAddrId+"]Echoing: " + str);
out.print(str);
out.flush();
socket.close();
break;
}else{
if(str != null || str != ""){
System.out.println("["+localAddrId+"]Echoing back: " + str);
out.println(str);
out.flush();
}else{
System.out.println("["+localAddrId+"]Closing Socket");
break;
}
}
}
}
catch (IOException e) {
System.err.println("IO Exception");
}
catch (NullPointerException e){
System.err.println("["+localAddrId+"]Socket closing BY Incoming zerro string");
}
finally {
try {
socket.close();
System.err.println("["+localAddrId+"]Socket closed");
}
catch (IOException e) {
System.err.println("Socket not closed");
}
}
}
}

public class Server2 {
static final int PORT = 6666;

public static void main(String[] args) throws IOException {
ServerSocket s = new ServerSocket(PORT);
System.out.println("Server Started");
try {
while (true) {
// Блокируется до возникновения нового соединения:
Socket socket = s.accept();
try {
new ServeOneJabber(socket);
}
catch (IOException e) {
socket.close();
}
}
}
finally {
s.close();
}
}
}
Но во время выполнения клиентской программы мне выдавало ошибку "Error #2031: Ошибка сокета. URL: (ip моего сервера)", а через несколько секунд - ошибку "Error #2048: Нарушение изолированной среды: file:///(путь к swf-файлу)/Простое%20соединение.swf не может загрузить данные из (ip моего сервера) : (порт)."
Потом я пробовал подключаться к разным портам, но ничего не помогало. Обшарил разные форумы в поисках решения этой проблемы, и тут тоже искал, но ничего дельного я не нашел.

А потом я вообще отключил серверную программу и даже выключил компьютер, на котором она выполнялась, и запустил клиентскую программу, и она мне выдала абсолютно тоже самое, что при включенном сервере, как будто компа, к которому я подключался вообще не существует! Хотя в параметрах публикации в параметре "Безопасность при локальном воспроизведении" я поставил "Доступ только к сети"!!
Сейчас я вообще не знаю, как настроить эту "изолированную среду" для своего клиентского swf-файла, и буду признателен тому, кто поможет мне в этом.

И еще хочу добавить, что код по подключению к сокету я размещал не в отдельном классе, а в первом кадре временной шкалы swf-файла, и после функции подключения к сокету я добавил вывод параметра Security.sandboxType, и оно выводило значение localTrusted.
var socket:Socket;
var host:String = //ip моего сервера
Security.allowDomain(host);
Security.allowInsecureDomain(host);
Security.loadPolicyFile("xmlsocket://"+host+":6666");
function makeSocket(ip:String, port:int){
socket = new Socket();
socket.addEventListener(Event.CONNECT, socketConnectHandler);
socket.addEventListener(Event.CLOSE, socketCloseHandler);
socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
socket.addEventListener(ProgressEvent.SOCKET_DATA, dataHandler);
socket.connect(ip, port);
}

//Обработчики событий

makeSocket(host, 5600);
trace(Security.sandboxType);

Заранее спасибо!

PainKiller
28.10.2014, 23:18
Честно говоря ваш явовский код мне показался немного странноватым, в свое время я пробовал сокеты на яве вот по этому тьюториалу (http://www.giantflyingsaucer.com/blog/?p=205). И да, вот еще полезный вопрос по этой теме на стакоферфлоу (http://stackoverflow.com/questions/15081865/java-socket-server). В общем попробуйте этот вариант, если что не так пишите.

ShockWave512
29.10.2014, 01:37
- для работы по сокету, вам обязательно нужен полиси сокет на порту 843, если флешка работает с отдельного веб сервера, а не десктопа или эйр (без полиси файла на этом порту флешка не будет коннектиться к вашему основному серверу) для теста поставьте готовый сокет сервер SmartFox, там уже есть полиси сокет

- обязательно проверьте работу флешки наружу (например загрузить картинку с любого сервера) могут быть блокировки плеера или системы

Кирпич
31.10.2014, 19:05
Тут вот еще какая проблема: я недавно обнаружил, что в моей домашней сети на всех компьютерах одинаковый IP. А я хочу подключиться к одному из компов в моей сети. Поэтому, вводя параметр IP-адреса в функцию подключения сокета, я не знаю, к чему пытается подключиться мой сокет. :(

ShockWave512
31.10.2014, 20:01
Физически не может быть одинаковых айпи.

Кирпич
31.10.2014, 20:23
Знаю. Но на всех сайтах по проверке IP мне показывало один и тот же IP на всех компах. Не знаю почему так. Может это IP моего роутера что ли?

PainKiller
01.11.2014, 19:53
Знаю. Но на всех сайтах по проверке IP мне показывало один и тот же IP на всех компах. Не знаю почему так. Может это IP моего роутера что ли
Да, сайты просто показывают ваш внешний айпишник, это не обязательно айпи роутера, это может быть айпи шлюза вашего провайдера, или что то в этом роде. Внутри сети все ваши компы имеют свои уникальные айпишники.

ShockWave512
01.11.2014, 20:06
Знаю. Но на всех сайтах по проверке IP мне показывало один и тот же IP на всех компах. Не знаю почему так. Может это IP моего роутера что ли?

В свойствах сети поищите айпи системы, его и используйте чтобы достучаться до сервера.

caseyryan
01.11.2014, 20:45
В винде локальный айпи можно получить так:
Win + R -> cmd -> ipconfig
Он будет в строчке IPv4
вам обязательно нужен полиси сокет на порту 843
Полиси сокет то обязательно нужен, но совсем не обязательно на 843 порту. Можно и на другой повесить, главное запрашивая его во флешке, указать порт, на котором он висит

ShockWave512
01.11.2014, 20:51
Если из флешки нет принудительного запроса полиси файла - то обязательно на 843 порту.

Кирпич
07.11.2014, 22:16
Что-ж, заменил IP для подключения с внешнего на локальный IP моего сервера. Теперь у меня во флеше через несколько секунд появляется ошибка "Error #2048: Нарушение изолированной среды: file:///(путь к swf-файлу)/Простое%20соединение.swf не может загрузить данные из (локальный ip моего сервера) : (порт).", а ровно через одну секунду - ошибка "Error #2031: Ошибка сокета. URL: (локальный ip моего сервера)"
Выключив серверную программу, но не выключив сервер, я пронаблюдал такую же картину.

А вообще я пока не знаю, что такое полиси сокет. В первом посту в моем коде флеш пытается по протоколу xmlsocket загрузить полиси файл по порту 6666, а серверная прога на Java, получив запрос <policy-file-request/>, отправляет полиси строку.
Не является ли это полиси сокетом? Или это что-то совсем иное?