Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   Проблема обмена данных (java+ actionscript) (http://www.flasher.ru/forum/showthread.php?t=177306)

XimiKDeniS 29.03.2012 11:58

Проблема обмена данных (java+ actionscript)
 
Код сервера:
Код:

package server;

import java.io.*;
import java.net.*;
public class GameServer {
        public static void main(String[] args) {

                try {

                ServerSocket serv = new ServerSocket(12000);

                while (true) {

                //ожидание клиента

                Socket sock = serv.accept();

                System.out.println("New user has entered.\n" + sock.getInetAddress().getHostName() + " connected");

                /*создание отдельного потока для обмена

                данными с соединившимся клиентом*/

                ServerThread server = new ServerThread(sock);

                server.start();//запуск потока

                }

                } catch (IOException error) {

                System.err.println(error);

                }

                }

                }
class ServerThread extends Thread {

private PrintStream os;//передача

private BufferedReader is;//чтение

private InetAddress addr;//адрес клиента

public ServerThread(Socket s) throws IOException {

os = new PrintStream(s.getOutputStream());

is = new BufferedReader(

new InputStreamReader(

s.getInputStream()));

addr = s.getInetAddress();

}

public void run() {

int i = 0;

String str;

try {

while ((str = is.readLine()) != null) {
if ("PING".equals(str))

os.println("PONG "+ ++i);

System.out.println("PING-PONG" + i

+ " with " + addr.getHostName());

}

} catch (IOException e) {

//если клиент не отвечает, соединение с ним разрывается

System.out.println("Disconnect");

} finally {

disconnect();//уничтожение потока

}

}

public void disconnect() {

try {

System.out.println(addr.getHostName()

+ " disconnected");

os.close();

is.close();

} catch (IOException e) {

e.printStackTrace();

} finally {

this.interrupt();

}

}

}

Код клиента на Actionscript 3.0:
Код AS3:

public function Main() {
                        // constructor code
                        socket.addEventListener (Event.CONNECT, onConnect)
                        socket.addEventListener (IOErrorEvent.IO_ERROR, onError)
                        socket.addEventListener (SecurityErrorEvent.SECURITY_ERROR, onError)
                        socket.connect (ip, port)
                        Aut.addEventListener (MouseEvent.CLICK, onAut)
                }
                private function onAut(event:MouseEvent):void
                {
                        if (socket.connected)
                        {
                                socket.writeUTFBytes ("PING")
                                //socket.writeUTFBytes ("aut login= me pass= please")
                                socket.flush ()
                                reading.appendText ("Sending authorize Data.\n")
                        }
                }

Вроде все правильно, сервер ждет сообщения PING при получении этого сообщения отправляет PONG, но сервер PING вроде не получает. Говорю вроде, потому что когда выключаю клиент до него доходит одно сообщение.
P S И заодно, почему-то когда клиент подключается к серверу реакция сервера на клиент заторможенная(сообщение о подключении у клиента идет сразу, а у сервера через несколько секунд)

Добавлено через 7 часов 51 минуту
Не знаю почему форум молчит, думал ответят за 5 минут) (не в укор вам конечно)
Нашел некоторую зацепку, попробовал однопоточный сервер.
Код:

import java.io.*;
import java.net.*;
 
class SimpleServer
{
    ServerSocket socket;
    Socket incoming;
    BufferedReader readerIn;
    PrintStream printOut;
 
    public static void main(String[] args)
    {
        int port = 12000;
 
        try
        {
            port = Integer.parseInt(args[0]);
        }
        catch (ArrayIndexOutOfBoundsException e)
        {
            // Catch exception and keep going.
        }
 
        new SimpleServer(port);
    }
 
    private SimpleServer(int port)
    {
        System.out.println(">> Starting SimpleServer");
        try
        {
            socket = new ServerSocket(port);
            incoming = socket.accept();
            System.out.println("New user connected");
            readerIn = new BufferedReader(new InputStreamReader(incoming.getInputStream()));
            printOut = new PrintStream(incoming.getOutputStream());
          // System.out.println("Enter EXIT to exit.\r");
            boolean done = false;
            while (!done)
            {
                String str = readerIn.readLine();
                if (str == null)
                {
                    done = true;
                }
                else
                {
                    out("Echo: " + str + "\r");
                    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);
    }
}
class ClientConnector {
        public void Connector ()
        {
               
        }
}

вывод:
>> Starting SimpleServer
New user connected
Echo: aut me pleasereg me please0reg me please0

сообщения были
1. aut me please
2. reg me please0
3. reg me please0
Подключается мгновенно, но сообщения приходят тоже после отключения клиента, похоже, что сервер не видит конец сообщения...
Возможно это поможет быстрее решить проблему...

Добавлено через 8 часов 6 минут
Проблема подвисаний была в addr.getHostName(). Еще надеюсь получить ответ на вопрос о приходе данных.

Добавлено через 9 часов 8 минут
Понял то, что сервер не видит окончания сообщения.

Добавлено через 25 часов 57 минут
Проблема была в readLine, спасибо.


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

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