Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > Серверные технологии и Flash

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 24.08.2008, 15:57
VovkaMorkovka вне форума Посмотреть профиль Отправить личное сообщение для VovkaMorkovka Найти все сообщения от VovkaMorkovka
  № 1  
Ответить с цитированием
VovkaMorkovka
[+3 13.02.08]

Регистрация: Apr 2006
Сообщений: 421
По умолчанию И вновь о сокетах и политике безопасности

Всем привет, пытаюсь достучаться до сокета из локально запущенной флешки, для этого использую вот такой код на java со стороны сервера и AS 3.0 со стороны клиента

java

Код:
package org.editor.sockets;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public final class SocketServer {
	private static final int PORT = 8080;
	private static ServerSocket SERVER_SOCKET = null;
	private static SocketServer INSTANCE = null;
	private static String CROSSDOMAIN_XML = "<cross-domain-policy>"
			+ "<allow-access-from domain=\"*\" to-ports=\"" + PORT + "\"/>" +

			"</cross-domain-policy>";
	Runnable _socketListenerProcessor;

	public static SocketServer getInstance() {
		if (INSTANCE == null) {
			INSTANCE = new SocketServer();

		}
		return INSTANCE;
	}

	/**
	 * Init server socket.
	 * 
	 * @author vovkamorkovka
	 */
	private boolean initServer() {
		try {
			SERVER_SOCKET = new ServerSocket(PORT);
			
			return true;
		} catch (IOException e) {

			e.printStackTrace();
			return false;
		}
	}

	private SocketServer() {
		initServer();

		_socketListenerProcessor = new Runnable() {

			@Override
			public void run() {
				try {

					// Блокирует до тех пор, пока не возникнет соединение:

					Socket clientSocket = SERVER_SOCKET.accept();
					// Вывод автоматически выталкивается из буфера
					// PrintWriter'ом
					System.out.println("accept socket");
					PrintWriter out =

					new PrintWriter(

					new BufferedWriter(

					new OutputStreamWriter(

					clientSocket.getOutputStream())), true);
					

					//System.out.println("accept socket:" + CROSSDOMAIN_XML);
					try {

						System.out.println(

						"Connection accepted: " + clientSocket);

						BufferedReader in =

						new BufferedReader(

						new InputStreamReader(

						clientSocket.getInputStream()));

						// Вывод автоматически выталкивается из буфера
						// PrintWriter'ом

						while (true) {

							String str = in.readLine();
							if (str.contains("policy-file-request")) {
								out.println(CROSSDOMAIN_XML+"\r\n");
								out.flush();
								System.out.println("try to load policy");
								
							} else {
								if (str.equals("END"))
									break;

								System.out.println("Echoing: " + str);

								out.println(str);
							}

						}

						// Всегда закрываем два сокета...

					} finally {

						System.out.println("closing...");

						clientSocket.close();

					}

				} catch (IOException e1) {

				} finally {

					try {
						SERVER_SOCKET.close();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}

				}

			}

		};

		_socketListenerProcessor.run();

	}

	public static void main(String args[]) {
		SocketServer.getInstance();

		while (true) {

		}
	}

}
И AS 3.0

Код:
     package org.editor.sockets.example {
	import flash.display.SimpleButton;
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.net.XMLSocket;
	import flash.system.Security;
	import flash.text.TextField;		

	/**
	 * @author vovkamorkovka
	 */
	public class SocketsExample extends Sprite {
		private var _sendMessageBtn : SimpleButton = null;
		private var _connectBtn : SimpleButton = null;
		private var _socket : XMLSocket = null;
		private var _inputText : TextField;

		public function SocketsExample() {
			
			Security.loadPolicyFile("localhost:8080");
			_sendMessageBtn = this["sendMessageBtn"] as SimpleButton;
			
			_connectBtn = this["connectBtn"] as SimpleButton;
			_inputText = this["logText"] as TextField;
					
			_sendMessageBtn.addEventListener(MouseEvent.CLICK, sendMessage);
			_connectBtn.addEventListener(MouseEvent.CLICK, connect);
		}

		private function connect(event : MouseEvent) : void {
			_socket = new XMLSocket();
			
			try {
				_socket.connect("localhost", 8080);
			}catch(e : Error) {
				_inputText.appendText("connect:" + e.toString() + "\n");
			}
		}

		private function sendMessage(event : MouseEvent) : void {
			
			
			if (_socket == null) {
				_inputText.appendText("send message, socket have not bin created\n");
				return;
			}
			try {
				_socket.send("salo salo\n");
			}catch(e : Error) {
				_inputText.appendText("send message," + e.toString() + "\n");
			}
		}
	}
}
Проблема в следующем: флеш не присылает сокету запрос crossdomain.xml
Причем не присылает ни в тестовом режиме, ни в режиме локально запущенного
Вопроса как всегда два: кто виноват и что делать

p.s. Искал на форуме, много схожих тем, но конкретно этот вопрос не освещается

Старый 24.08.2008, 16:45
DarkLight вне форума Посмотреть профиль Отправить личное сообщение для DarkLight Посетить домашнюю страницу DarkLight Найти все сообщения от DarkLight
  № 2  
Ответить с цитированием
DarkLight
ветеран форума
 
Аватар для DarkLight

Регистрация: May 2006
Адрес: Москва
Сообщений: 2,978
Отправить сообщение для DarkLight с помощью ICQ Отправить сообщение для DarkLight с помощью Skype™
1) Security.loadPolicyFile("xmlsocket://localhost:8080");
2) при отправке полиси файла надо писать не \r\n а нулевой байт (\0)
3) при тестировании локально нужно разрешить использование сокетов в Settings Manager на сайте адоба, т к 9ый плеер не выдает ошибки "local files are not permitted to use sockets", в отличие от 10го, а просто тупо не шлет
__________________
4am is time to rock

Старый 24.08.2008, 16:51
VovkaMorkovka вне форума Посмотреть профиль Отправить личное сообщение для VovkaMorkovka Найти все сообщения от VovkaMorkovka
  № 3  
Ответить с цитированием
VovkaMorkovka
[+3 13.02.08]

Регистрация: Apr 2006
Сообщений: 421
Ну у меня десятый плеер стоит, поэтому ошибку такую выдает, это первое. Собственно под дебаг - режимом я и понимаю разрешение через сайт адоби.
Так как ты предложил тоже пробовал и всеравно выдает вышеуказанную ошибку.
По поводу нулевого байта в конце, ты прав конечно, но дело в том, что java - сокету НЕ ПРИХОДИТ запрос на crossdomain.xml.
Т.е. чтоб его куда - нибудь посылать сначала запрос должен быть, а его - то и нетути.

Есть какой - нибудь способ настроить программно флешку так, чтоб ей разрешалось использовать сокеты локально? Мне сокеты и нужны собственно для того, чтобы передавать даные java - части программы, т.е. флешка мне нужна именно запущенная локально


Последний раз редактировалось VovkaMorkovka; 24.08.2008 в 16:53.
Старый 24.08.2008, 17:10
DarkLight вне форума Посмотреть профиль Отправить личное сообщение для DarkLight Посетить домашнюю страницу DarkLight Найти все сообщения от DarkLight
  № 4  
Ответить с цитированием
DarkLight
ветеран форума
 
Аватар для DarkLight

Регистрация: May 2006
Адрес: Москва
Сообщений: 2,978
Отправить сообщение для DarkLight с помощью ICQ Отправить сообщение для DarkLight с помощью Skype™
Хм, т е флешка вообще ничего не спрашивает у сервера? А что клиент говорит? какой тип ошибки?
Плюс в приведенном коде нет проверки на то соединен ли сокет при отсылке. А по java есть вопрос - PrintWriter out разве не рискует быть собранным GC?
__________________
4am is time to rock


Последний раз редактировалось DarkLight; 24.08.2008 в 17:18.
Старый 24.08.2008, 17:17
VovkaMorkovka вне форума Посмотреть профиль Отправить личное сообщение для VovkaMorkovka Найти все сообщения от VovkaMorkovka
  № 5  
Ответить с цитированием
VovkaMorkovka
[+3 13.02.08]

Регистрация: Apr 2006
Сообщений: 421
Клиент молчит, на попытку законнектиться говорит ту ошибку, что ты описал выше

Старый 24.08.2008, 17:26
DarkLight вне форума Посмотреть профиль Отправить личное сообщение для DarkLight Посетить домашнюю страницу DarkLight Найти все сообщения от DarkLight
  № 6  
Ответить с цитированием
DarkLight
ветеран форума
 
Аватар для DarkLight

Регистрация: May 2006
Адрес: Москва
Сообщений: 2,978
Отправить сообщение для DarkLight с помощью ICQ Отправить сообщение для DarkLight с помощью Skype™
Ну так значит что-то неправильно в Settings Manager прописано, и потому отказывается соединяться
__________________
4am is time to rock

Создать новую тему Ответ Часовой пояс GMT +4, время: 13:47.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 13:47.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.