|
|
|
|||||
Регистрация: 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() Подскажите пожалуйста, что это за ошибки и как исправить? Заранее благодарен! |
|
|||||
1.
Цитата:
2. Работает ли секьюрити-сервер на 843 порту, раздающий политики безопасности? 3. Не закрыт ли сокет на клиенте при попытке обращения к нему? |
|
|||||
Регистрация: 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); } } Заранее извините если код топорный, это первое мое приложение на флеш. |
|
|||||
Во-первых давайте разберемся, вы используете класс Socket или XMLSocket? Во-вторых, у вас сервер запущен локально (localhost)? В-третьих, сокеты - штука асинхронная. То есть нельзя после вызова функции socket.connect(...) тут же пытаться слать какие-нибудь данные (socket.send("test \n")). Сначала нужно дождаться события, извещающего вас о том, что подключение произошло (Event.CONNECT). Ответьте на первые два вопроса, а то из кода мало что понятно.
|
|
|||||
Регистрация: Nov 2012
Сообщений: 30
|
Я использую XMLSocket. Сервер запущен в localhost. Пробовал
Цитата:
Результат нолевой! Изначально код был такой: 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"); } Большое спасибо за ссылки, но я их уже почти выучил на изучь. Добавлено через 10 минут Ошибка может быть в том, что я не могу разобраться, где размещать файл политики. Добавлено через 14 часов 6 минут Так, одно проблема решена! Теперь я уже точно знаю, что сервер принимает сообщение, но не оправляет. Причина тоже ясна, не добавляется нолевой бфйт. Попытка прописать добавление в коде, Компилятор меняет на свое или выдает ошибку, при ручном редактирование. Подскажите как быть? Добавлено через 15 часов 41 минуту Всем спасибо. Разобрался сам. тема закрыта. |
|
|||||
Напишите, если не лень и для будущих поколений, в чем была ошибка и как вы ее решили.
|
|
|||||
Регистрация: Nov 2012
Сообщений: 30
|
Я прошу прощение у всех, но оказывается рано радовался!! После того, как я повесил обработчики событий и правильно прописал вывод, обнаружил, что не в чем я не разобрался! А ошибки как были так и остались. Вот эти две ошибки:
#1034: Ошибка типа Coercion: невозможно преобразовать flash.events::IOErrorEvent@2ea93469 в flash.errors.IOError. |
|
|||||
При первой передаче данных на сервер флеш плеер создает еще один сокет на 843 порту (по умолчанию) и отсылает по нему серверу строку "<policy-file-request/>". Строка эта всегда одной длины, так что на сервере можно читать одинаковое количество байтов. В ответ флеш плеер хочет получить файл политики безопасности — тоже строку — в котором будет описано, может ли клиент подключаться к серверу. И если нет или же в ответ ничего не приходит, то:
Цитата:
И обязательно завершите нулевым байтом. Добавлено через 6 минут Ну и по сокетам и байтам будет полезно.
__________________
тут я |
|
|||||
Регистрация: 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> 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."] |
|
|||||
Регистрация: 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, время: 23:19. |
|
« Предыдущая тема | Следующая тема » |
|
|