Кирпич
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);
Заранее спасибо!
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);
Заранее спасибо!