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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 28.11.2012, 19:02
client510 вне форума Посмотреть профиль Отправить личное сообщение для client510 Найти все сообщения от client510
  № 1  
Ответить с цитированием
client510

Регистрация: Nov 2012
Сообщений: 30
По умолчанию Обработка сокетов

Всем, здравствуйте.
Долго мучился, но все таки (не без вышей помощи) сделал авторизацию на своем чате.
Теперь новая проблема:
Нужно чтобы при входе в чат, логин передавался серверу путем сокета и использовался в качестве имени при общение.
Соединение установил и вроде все должно работать, но при компиляции в области вывода выходят эти ошибки:
Код:
Error #2044: Необработанный ioError:. text=Error #2031: Ошибка сокета.
	at avfc_1_0_fla::enter_user_118/frame1()
	at flash.display::MovieClip/gotoAndStop()
	at avfc_1_0_fla::MainTimeline/fl_MouseClickHandler_3()
Error #2044: Необработанный securityError:. text=Error #2048: Нарушение изолированной среды: file:///E|/WebServers2/home/videochat/www/avfc%5F1%5F0.swf не может загрузить данные из :8080.
	at avfc_1_0_fla::enter_user_118/frame1()
	at flash.display::MovieClip/gotoAndStop()
	at avfc_1_0_fla::MainTimeline/fl_MouseClickHandler_3()
Я первый раз имею дело с сокетами.
Подскажите пожалуйста, что это за ошибки и как исправить?
Заранее благодарен!

Старый 28.11.2012, 21:36
bav вне форума Посмотреть профиль Отправить личное сообщение для bav Найти все сообщения от bav
  № 2  
Ответить с цитированием
bav
 
Аватар для bav

Регистрация: Oct 2010
Сообщений: 1,049
Отправить сообщение для bav с помощью ICQ
1.
Цитата:
Соединение установил
Чем это подтверждается? Вам удалось передать с клиента на сервер и обратно какие-нибудь данные?
2. Работает ли секьюрити-сервер на 843 порту, раздающий политики безопасности?
3. Не закрыт ли сокет на клиенте при попытке обращения к нему?

Старый 28.11.2012, 23:40
client510 вне форума Посмотреть профиль Отправить личное сообщение для client510 Найти все сообщения от client510
  № 3  
Ответить с цитированием
client510

Регистрация: Nov 2012
Сообщений: 30
Вот полный результат вывода:
Код:
Успех!
NetConnection.Connect.Success
undefined
Не верный логин или пароль.
Error #2044: Необработанный ioError:. text=Error #2031: Ошибка сокета.
	at avfc_1_0_fla::enter_user_118/frame1()
	at flash.display::MovieClip/gotoAndStop()
	at avfc_1_0_fla::MainTimeline/fl_MouseClickHandler_3()
У нас уже: 5 пользователей
Error #2044: Необработанный securityError:. text=Error #2048: Нарушение изолированной среды: file:///E|/WebServers2/home/videochat/www/avfc%5F1%5F0.swf не может загрузить данные из :8080.
	at avfc_1_0_fla::enter_user_118/frame1()
	at flash.display::MovieClip/gotoAndStop()
	at avfc_1_0_fla::MainTimeline/fl_MouseClickHandler_3()
Вот код джава:
Код:
import java.io.*; 
import java.net.*; 
 
class SimpleServer 
{ 
    private static SimpleServer server; 
    ServerSocket socket; 
    Socket incoming; 
    BufferedReader readerIn; 
    PrintStream printOut; 
 
    public static void main(String[] args) 
    { 
        int port = 8080; 
 
        try 
        { 
            port = Integer.parseInt(args[0]); 
        } 
        catch (ArrayIndexOutOfBoundsException e) 
        { 
            // Catch exception and keep going. 
        } 
 
        server = new SimpleServer(port); 
    } 
 
    private SimpleServer(int port) 
    { 
        System.out.println(">> Starting SimpleServer"); 
        try 
        { 
            socket = new ServerSocket(port); 
            incoming = socket.accept(); 
            readerIn = new BufferedReader(new InputStreamReader(incoming.getInputStream())); 
            printOut = new PrintStream(incoming.getOutputStream()); 
            printOut.println("Enter EXIT to exit.\r"); 
            out("Enter EXIT to exit.\r"); 
            boolean done = false; 
            while (!done) 
            { 
                String str = readerIn.readLine(); 
                if (str == null) 
                { 
                    done = true; 
                } 
                else 
                { 
                    out("Echo: " + str + (char)0)); 
                    if(str.trim().equals("EXIT")) 
                    { 
                        done = true; 
                    } 
                } 
                incoming.close(); 
            } 
        } 
        catch (Exception e) 
        { 
            System.out.println(e); 
        } 
    } 
 
    private void out(String str) 
    { 
        printOut.println(str); 
        System.out.println(str); 
    } 
}
И вот кусок кода, который отвечает за сокеты:
Код AS3:
if(paswords == pasword[l])
				{
					socket.connect(null,8080);
					socket.send("test \n");
					socket.addEventListener(ProgressEvent.SOCKET_DATA, onConnectSend);
 
					if(true)
					{
						trace("Успех!");
						MovieClip(this.root).gotoAndStop(1, "Монтажный кадр 6");
					}
Заранее извините если код топорный, это первое мое приложение на флеш.

Старый 29.11.2012, 00:09
bav вне форума Посмотреть профиль Отправить личное сообщение для bav Найти все сообщения от bav
  № 4  
Ответить с цитированием
bav
 
Аватар для bav

Регистрация: Oct 2010
Сообщений: 1,049
Отправить сообщение для bav с помощью ICQ
Во-первых давайте разберемся, вы используете класс Socket или XMLSocket? Во-вторых, у вас сервер запущен локально (localhost)? В-третьих, сокеты - штука асинхронная. То есть нельзя после вызова функции socket.connect(...) тут же пытаться слать какие-нибудь данные (socket.send("test \n")). Сначала нужно дождаться события, извещающего вас о том, что подключение произошло (Event.CONNECT). Ответьте на первые два вопроса, а то из кода мало что понятно.

Старый 29.11.2012, 00:31
client510 вне форума Посмотреть профиль Отправить личное сообщение для client510 Найти все сообщения от client510
  № 5  
Ответить с цитированием
client510

Регистрация: Nov 2012
Сообщений: 30
Я использую XMLSocket. Сервер запущен в localhost. Пробовал
Цитата:
В-третьих, сокеты - штука асинхронная. То есть нельзя после вызова функции socket.connect(...) тут же пытаться слать какие-нибудь данные (socket.send("test \n")). Сначала нужно дождаться события, извещающего вас о том, что подключение произошло (Event.CONNECT).
.
Результат нолевой!
Изначально код был такой:
Код AS3:
if(paswords == pasword[l])
				{
					socket.connect(null,8080);
					socket.addEventListener(Event.CONNECT, onConnects);
 
					if(true)
					{
					socket.send("test \n");
					socket.addEventListener(ProgressEvent.SOCKET_DATA, onConnectSend);
						MovieClip(this.root).gotoAndStop(1, "Монтажный кадр 6");
					}
Добавлено через 4 минуты
Большое спасибо за ссылки, но я их уже почти выучил на изучь.

Добавлено через 10 минут
Ошибка может быть в том, что я не могу разобраться, где размещать файл политики.

Добавлено через 14 часов 6 минут
Так, одно проблема решена! Теперь я уже точно знаю, что сервер принимает сообщение, но не оправляет.
Причина тоже ясна, не добавляется нолевой бфйт. Попытка прописать добавление в коде, Компилятор меняет на свое или выдает ошибку, при ручном редактирование. Подскажите как быть?

Добавлено через 15 часов 41 минуту
Всем спасибо. Разобрался сам. тема закрыта.

Старый 29.11.2012, 19:03
bav вне форума Посмотреть профиль Отправить личное сообщение для bav Найти все сообщения от bav
  № 6  
Ответить с цитированием
bav
 
Аватар для bav

Регистрация: Oct 2010
Сообщений: 1,049
Отправить сообщение для bav с помощью ICQ
Напишите, если не лень и для будущих поколений, в чем была ошибка и как вы ее решили.

Старый 30.11.2012, 17:29
client510 вне форума Посмотреть профиль Отправить личное сообщение для client510 Найти все сообщения от client510
  № 7  
Ответить с цитированием
client510

Регистрация: Nov 2012
Сообщений: 30
Я прошу прощение у всех, но оказывается рано радовался!! После того, как я повесил обработчики событий и правильно прописал вывод, обнаружил, что не в чем я не разобрался! А ошибки как были так и остались. Вот эти две ошибки:
Код:
#1034: Ошибка типа Coercion: невозможно преобразовать flash.events::IOErrorEvent@2ea93469 в flash.errors.IOError.
и
Код:
[SecurityErrorEvent type="securityError" bubbles=false cancelable=false eventPhase=2 text="Error #2048: Нарушение изолированной среды: file:///E|/WebServers2/home/videochat/www/avfc%5F1%5F0.swf не может загрузить данные из :2525."]
. Со вчерашнего вечера ломаю голову как их исправить. Если сможет помочь, буду очень благодарен!

Старый 01.12.2012, 08:23
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 8  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
При первой передаче данных на сервер флеш плеер создает еще один сокет на 843 порту (по умолчанию) и отсылает по нему серверу строку "<policy-file-request/>". Строка эта всегда одной длины, так что на сервере можно читать одинаковое количество байтов. В ответ флеш плеер хочет получить файл политики безопасности — тоже строку — в котором будет описано, может ли клиент подключаться к серверу. И если нет или же в ответ ничего не приходит, то:
Цитата:
[SecurityErrorEvent type="securityError" bubbles=false cancelable=false eventPhase=2 text="Error #2048: Нарушение изолированной среды: file:///E|/WebServers2/home/videochat/www/avfc%5F1%5F0.swf не может загрузить данные из :2525."]
Отсылайте с сервера в ответ
Код AS3:
<cross-domain-policy><allow-access-from domain="*" to-ports="*" /></cross-domain-policy>
И обязательно завершите нулевым байтом.

Добавлено через 6 минут
Ну и по сокетам и байтам будет полезно.
__________________
тут я

Старый 04.12.2012, 16:59
client510 вне форума Посмотреть профиль Отправить личное сообщение для client510 Найти все сообщения от client510
  № 9  
Ответить с цитированием
client510

Регистрация: Nov 2012
Сообщений: 30
Уже десять дней топчусь во круг сщкетов. Не ни кто не может помочь? Я перепробовал все выше предлагаемые варианты, но эффекта - 0.
Вот все мои коды:
Сервер
Код:
import java.net.*;
import java.io.*;

class SimpleServer
{
    public static void main(String[] args)
    {
        try
        {
            System.out.println("-> Security server started...");
            ServerSocket server = new ServerSocket(2525);
            Socket client;
            DataOutputStream out;
            DataInputStream in;
            
            // Reading crossdomain.xml
            FileInputStream xmlFile = new FileInputStream("crossdomain.xml");
            int xmlBytesCount = xmlFile.available();
            
            byte[] xmlBytes = new byte[xmlBytesCount + 1];
            xmlFile.read(xmlBytes, 0, xmlBytesCount);
            xmlBytes[xmlBytesCount] = 0;
            xmlFile.close();
            
            byte[] policyRequest = new byte[23];
            
//            for (;;)
//          {
                client = server.accept();
                out = new DataOutputStream(client.getOutputStream());
                in = new DataInputStream(client.getInputStream());
                
                in.read(policyRequest, 0, 23);
                
                out.write(xmlBytes, 0, xmlBytesCount + 1);
                out.flush();
                System.out.println(":: FSS :: Policy sended to " + client.toString());
                client.close();
//        }
                
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        
        int port = 4444; // случайный порт (может быть любое число от 1025 до 65535)
        SimpleServer(port);
       
    }
    static ServerSocket socket; 
    static Socket incoming; 
    static BufferedReader readerIn; 
    static PrintStream printOut; 
 
    private static void SimpleServer(int port) 
    { 
        System.out.println(">> Starting SimpleServer"); 
        try 
        { 
            socket = new ServerSocket(port); 
            incoming = socket.accept(); 
            readerIn = new BufferedReader(new InputStreamReader(incoming.getInputStream())); 
            printOut = new PrintStream(incoming.getOutputStream()); 
            out("Enter EXIT to exit.\r"); 
            boolean done = false; 
            while (!done) 
            { 
                String str = readerIn.readLine(); 
                if (str == null) 
                { 
                    done = true; 
                } 
                else 
                { 
                    out("Echo: " + str + (char)0);
                    if(str.trim().equals("EXIT")) 
                    { 
                        done = true; 
                    } 
                } 
                 
            } 
            incoming.close();
        } 
        catch (Exception e) 
        { 
            System.out.println(e); 
        } 
    } 
 
    private static void out(String str) 
    { 
    	System.out.println(str);
        printOut.println(str); 
        printOut.flush();
         
    } 
}
Файл политики:
Код:
i<?xml version="1.0"?> 
<!-- http://www.foo.com/crossdomain.xml --> 
<cross-domain-policy>
      <allow-access-from domain="127.0.0.1" to-ports="4444" />
</cross-domain-policy>
И флеш:
Код AS3:
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.events.Event;
import flash.net.XMLSocket;
import flash.text.TextField;
 
stop();
 
var userloader:URLLoader = new URLLoader();
var userrequest:URLRequest = new URLRequest("user.xml");
    userloader.load(userrequest);
	userrequest.data;
	userloader.addEventListener(Event.COMPLETE, onUserLoad);
var xml:XML = new XML;
var userLogin:XMLList;
var userPaswurd:XMLList;
var username:Array = new Array();
var pasword:Array = new Array();
var i:int;
var j:int;
 
function onUserLoad(e:Event):void
{
	xml = XML(e.target.data);
	userLogin = xml..user_login.text();
	userPaswurd = xml..user_password.text();
	for(i = 0; i < userLogin.length(); i++)
	{
		username.push(userLogin[i]);
	}
	for(j = 0; j < userPaswurd.length(); j++)
	{
		pasword.push(userPaswurd[j]);
	}
}
 
var configloader:URLLoader = new URLLoader();
var configrequest:URLRequest = new URLRequest("configuration.xml");
    configloader.load(configrequest);
	configloader.addEventListener(Event.COMPLETE, onSocketConfig);
var socketconfig:XML;
var sockethost:XMLList;
var socketport:XMLList;
 
function onSocketConfig(e:Event):void
{
	socketconfig = XML (e.target.data);
	sockethost = socketconfig..socket_host.text();
	socketport = socketconfig..socket_port.text();
}
var ports:Number = 4444;
var xmlsocket:XMLSocket = new XMLSocket("127.0.0.1", ports);
var textFields:TextField = new TextField();
	xmlsocket.addEventListener(Event.CLOSE, closeSocket);
	xmlsocket.addEventListener(Event.CONNECT, connectSocket);
	xmlsocket.addEventListener(DataEvent.DATA, dataSocket);
	xmlsocket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorSocket);
	xmlsocket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorSocket);
 
enter_page.addEventListener(MouseEvent.CLICK, onEnter);
 
function onEnter(e:MouseEvent):void
{
	var logins:String = logins.text;
	var paswords:String = paswords.text;
	var categories:String = categories.text;
	var k:int;
	var l:int;
 
	if(logins == "" || paswords == "")
	{
		trace(enter_status.text = ("Ошибка! Не заполнены поля"));
		return;
	}
 
	for(k = 0; k < username.length; k++)
	{
		if(logins == username[k])
		{
			for(l = 0; l < pasword.length; l++)
	        {
				if(paswords == pasword[l])
				{
					xmlsocket.connect("127.0.0.1", 2525);
	                try
	                {
                		Security.loadPolicyFile("xmlsocket://127.0.0.1:2525");
	                }
                	catch(e:Error)
                	{
                		textFields.appendText("\n Нет файла политики! \n");
	                }
	                xmlsocket.connect("127.0.0.1",ports);
					if(true)
					{
					   MovieClip(this.root).gotoAndStop(1, "Монтажный кадр 6");
					}
				}
	        }
		}
	}
	if(logins != username[k] || paswords != pasword[l])
	{
		trace(enter_status.text = ("Не верный логин или пароль."));
		return;
	}
}
function closeSocket(event:Event):void 
{
	trace("\ncloseHandler: \n" + event);
}
function connectSocket(event:Event):void 
{
	trace("\nconnectHandler: \n" + event);
	xmlsocket.send("test\n");
	trace("data sending...\n");
}
function dataSocket(event:DataEvent):void 
{
    trace("\ndataHandler: \n" + event);
}
function ioErrorSocket(event:IOErrorEvent):void 
{
	trace("\nioErrorHandler: \n" + event);
}
function securityErrorSocket(event:SecurityErrorEvent):void 
{
	trace("\nsecurityErrorHandler: \n" + event);
}
 
reminder.addEventListener(MouseEvent.CLICK, onreminder);
 
function onreminder(e:MouseEvent):void
{
	gotoAndStop(2);
}
А это вывод:
Код:
ioErrorHandler: 
[IOErrorEvent type="ioError" bubbles=false cancelable=false eventPhase=2 text="Error #2031: Ошибка сокета. URL: 127.0.0.1"]

securityErrorHandler: 
[SecurityErrorEvent type="securityError" bubbles=false cancelable=false eventPhase=2 text="Error #2048: Нарушение изолированной среды: file:///E|/WebServers2/home/videochat/www/avfc%5F1%5F0.swf не может загрузить данные из 127.0.0.1:4444."]
Кто может помогите разобраться пожалуйста!

Старый 04.12.2012, 22:56
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 10  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
Вам уже советовали сделать сервер на порту 843, этого порта я в коде не нашел. Далее. Где-то в мейне (в кадре, что ли?) вы коннектитесь к порту 4444 (запрос полиси придет на 843). А ваш сервер слушает на 2525 первого запроса. Очевидно, на 4444 никто не ответит. Затем в onEnter вы коннектитесь на порт 2525 (при этом запрос на полиси опят придет на 843, если отказ не будет закэширован). И только после этого вы загружаете policy file. Вот эта попытка может быть даже проиходт успешно. Только не факт, что ваш полиси-файл разрешит соединяться с другим портом (в asdoc по Security и в разделе Security справки оно может быть по-разному трактовано). Ваш трейс, вероятно, из кадра еще выводится (номеров строк и названий методов нет).

Кроме того, я не уверен в корректности вашей java-части. Во-первых, вы можете не до конца читать ваш файл политики. Более того, вы вполне можете прочитать 0 байт. Это укладывается в контракт available! Читайте документацию на этот метод. Во-вторых, вы можеет вычитать запрос policy-file-request не полностью, но это в данном случае не важно (да и маловероятно). В третьих. Не out.flush(), socket.close(); Правильно socket.shutdown(); socket.close(). Иначе что-то отправленное может не дойти. Не поддерживают внутри себя сокеты flush, особенность у них такая.

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

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

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


 


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


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