Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   AS3 клиент + Java сервер считывает при дисконекте сокета (http://www.flasher.ru/forum/showthread.php?t=167014)

dsdbonus 07.09.2011 13:08

AS3 клиент + Java сервер считывает при дисконекте сокета
 
Здравствуйте! Уже и так и так пытался, все равно не понимаю почему не работает. С клиента отправляем данные на сервер, через сокет, сервер молчит и считывает поток, только после того, как закрыть клиент, что бы произошел разрыв соединения. В чем туплю или как делать?

Клиент
Код AS3:

package main {
    import flash.display.Sprite;
    import flash.events.*;
    import flash.net.XMLSocket;
        import flash.system.Security;
 
    public class General extends Sprite {
        private var hostName:String = "127.0.0.1";
        private var port:uint = 12700;
                private var portPolicy:uint = 15781;
        private var socket:XMLSocket;
 
        public function General() {
                        Security.loadPolicyFile("xmlsocket://"+hostName+":"+portPolicy);
            socket = new XMLSocket();
            configureListeners(socket);
            if (hostName && port) {
                socket.connect(hostName, port);
            }
                        this.but.addEventListener(MouseEvent.CLICK, onBut);
        }
 
        public function send(data:Object):void {
            socket.send(data);
        }
                private function onBut(event:Event):void {
                        send(new XML(this.txt.text));
                }
        private function configureListeners(dispatcher:IEventDispatcher):void {
            dispatcher.addEventListener(Event.CLOSE, closeHandler);
            dispatcher.addEventListener(Event.CONNECT, connectHandler);
            dispatcher.addEventListener(DataEvent.DATA, dataHandler);
            dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
            dispatcher.addEventListener(ProgressEvent.PROGRESS, progressHandler);
            dispatcher.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
        }
 
        private function closeHandler(event:Event):void {
            trace("closeHandler: " + event);
        }
 
        private function connectHandler(event:Event):void {
            trace("connectHandler: " + event);
        }
 
        private function dataHandler(event:DataEvent):void {
            trace("dataHandler: " + event);
                        trace( event.data );
                        var response:XML = new XML( event.data );
                        trace( response.test.@success );
        }
 
        private function ioErrorHandler(event:IOErrorEvent):void {
            trace("ioErrorHandler: " + event);
        }
 
        private function progressHandler(event:ProgressEvent):void {
            trace("progressHandler loaded:" + event.bytesLoaded + " total: " + event.bytesTotal);
        }
 
        private function securityErrorHandler(event:SecurityErrorEvent):void {
            trace("securityErrorHandler: " + event);
        }
    }
}

Сервер на Java
Код AS3:

package ru.gp.general;
import java.io.*;
import java.net.*;
 
public class GPServer {
 
        private static final int PORT_SERVER = 12700;
        private int mNumCon = 0;
 
        public static void main(String[] args) {
                try {
                        ServerSocket server = new ServerSocket(PORT_SERVER, 0, InetAddress.getByName("localhost"));
 
                        System.out.print("Server is start...\r");
 
                        while(true) {
                                new Player(server.accept());
                        }
                } catch(Exception e) {System.out.print("Init error "+e);}
        }
 
}
 
 
package ru.gp.general;
import java.io.*;
import java.net.*;
 
public class Player extends Thread {
        public Socket s;
        private BufferedReader is;
        private PrintStream os;
 
        public Player(Socket p1) {
                s = p1;
 
                setDaemon(true);
                setPriority(NORM_PRIORITY);
                start();
        }
        public void run() {
                try {
                        is = new BufferedReader(new InputStreamReader(s.getInputStream()));
                        os = new PrintStream(s.getOutputStream());
 
                        boolean done = false;
            while (!done)
            {
                String str = is.readLine();
                if (str == null)
                {
                    done = true;
                }
                else
                {
                    System.out.print("Echo: " + str + "\r");
                    if(str.trim().equals("EXIT"))
                    {
                        done = true;
                    }
                }
                s.close();
            }
                } catch(Exception e) {System.out.print("Init error "+e);}
        }
}


maxkar 07.09.2011 13:31

А в this.txt.text хоть один перевод строки есть? BufferedReader считает строкой только то, что кончается на \r, \n или \r\n. Символ 0 концом строки не является. Так что до тех пор, пока перевод строки не будет отправлен (или поток не закончится, что происходит при закрытии сокета), BufferedReader вам ничего не прочитате. Пишите свой правильный ридер, который сообщения по символу 0 разделяет. И кодировку ридерам и принтерам укажите, иначе весело будет.

t4arty 07.09.2011 14:19

и добавте кодировку UTF-8 в BufferedReader. Удачи.

Пс: Можете дополнять перевод строки через спец символы, которые тоже будут отправляться. А вообще readLine() не лушный вариант ;( (сугобо мое мнение)

dsdbonus 07.09.2011 15:02

Спасибо большое ребята))

Заменил на:
Код AS3:

is = new BufferedReader(new InputStreamReader(s.getInputStream(), "UTF-8")); 
os = new PrintStream(s.getOutputStream(), true, "UTF-8");

И возникло нечто не понятное, добавил после вывода на консоль еще ответ по сокету флешке
Код AS3:

os.println(str+" = ееееввв kkkk");

Но почему-то на пример присылаю строку "1111", не чего не происходит, затем шлю "2222" в ответ приходит "1111 = ееееввв kkkk", затем шлю "3333" и приходит "2222 = ееееввв kkkk". Почему такая задержка? Как сделать без неё?


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

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