Модераторы: javastic, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DataInputStream, trouble 
V
    Опции темы
VKoresh
Дата 3.7.2007, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 14.6.2007
Где: Запорожье

Репутация: 1
Всего: 1



 Сделал вот так:
Код


public SocketConnection sc;                        
public SocketConnection listener;    

public void run()
    {
        int c = 0;
        String S;

        try
        {
            sc = (SocketConnection)Connector.open("socket://" + (TFIP.getString()) + ":" + (TFPort.getString()));
            listener = (SocketConnection)Connector.open("socket://:5555");
            DataInputStream listener = sc.openDataInputStream();        
            DataOutputStream os = sc.openDataOutputStream();                
            StringBuffer sb = new StringBuffer();
        
            while (((c = is.read()) != '\n') && (c != -1))
            {            
                sb.append((char)c);
            }                                            
                            
            // дальше отсылает строку...                
            
        }
        catch (IOException x)                                        
        {
            x.printStackTrace();
        }        
     }




Дело в том, что мне надо чтобы приложение не только отсылало строки но и принимало их. Отсылает на ура,а вот слушать порт и принимать не хочет. smile 
 На строке

listener = (SocketConnection)Connector.open("socket://:5555");

выдает java.io.IOException: ServerSocket Open 
Помогите, пожалйста! 
PM MAIL ICQ   Вверх
W0LF
Дата 3.7.2007, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



а ты посмотри в сторону 
Код

javax.microedition.io
Interface ServerSocketConnection


Добавлено через 3 минуты и 51 секунду
Посмотри в WTK там пример есть очень простой.
Цитата

\WTK22\apps\NetworkDemo\



--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
VKoresh
Дата 3.7.2007, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 14.6.2007
Где: Запорожье

Репутация: 1
Всего: 1



Смотрел, не помогло, Горнакова и Пирумяна тоже читал, и тоже не помогло. smile  smile  smile 
Обидно, что даже компилится без ошибок... smile  
PM MAIL ICQ   Вверх
VKoresh
Дата 3.7.2007, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 14.6.2007
Где: Запорожье

Репутация: 1
Всего: 1



 smile Где бубны продают?
PM MAIL ICQ   Вверх
AntonSaburov
Дата 3.7.2007, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: нет
Всего: 118



А ты уверен, что этот порт свободен ? В смысле - 5555. Мож кто на нем висит постоянно ?
PM MAIL WWW ICQ   Вверх
Dancer
Дата 3.7.2007, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

Репутация: 33
Всего: 37



дык он сам же на нём и висит скорее всего smile

вот этот кусок кода очень не понятен!!!! (почему одно и то же название переменно фигурирует, перекрытие имён происходит)

listener = (SocketConnection)Connector.open("socket://:5555");
            DataInputStream listener = sc.openDataInputStream();

Добавлено через 8 минут и 29 секунд
наверное должно быть так smile
Код

            sc = (SocketConnection)Connector.open("socket://" + (TFIP.getString()) + ":" + (TFPort.getString()));
            listener = (SocketConnection)Connector.open("socket://:5555");
            DataInputStream is = sc.openDataInputStream();        
            DataOutputStream os = listener.openDataOutputStream();                
            StringBuffer sb = new StringBuffer();



--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
VKoresh
Дата 3.7.2007, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 14.6.2007
Где: Запорожье

Репутация: 1
Всего: 1



Добавлено @ 17:09
AntonSaburov
Цитата

А ты уверен, что этот порт свободен ? В смысле - 5555. Мож кто на нем висит постоянно ? 
, свободен как птица в полете smile

Добавлено @ 17:19
Dancer, сделал 
Код

public void run()
    {
        int c = 0;
        String S;

        try
        {
            sc = (SocketConnection)Connector.open("socket://" + (TFIP.getString()) + ":" + (TFPort.getString()));
            os = sc.openDataOutputStream();            
            listener = (SocketConnection)Connector.open("socket://:5555");
            DataInputStream is = sc.openDataInputStream();
            DataOutputStream os = listener.openDataOutputStream();
            StringBuffer sb = new StringBuffer();

            while ((c = is.read()) != -1)
            {
                sb.append((char)c);
            }
            System.out.println(sb.toString());
    
            //не важно...
            
        }
        catch (IOException x)                                        
        {
            x.printStackTrace();
        }        
     }

все как ты и говорил... Все та же проблемма -  На строке

listener = (SocketConnection)Connector.open("socket://:5555");

выдает java.io.IOException: ServerSocket Open 



Это сообщение отредактировал(а) VKoresh - 4.7.2007, 09:38
PM MAIL ICQ   Вверх
Dancer
Дата 4.7.2007, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

Репутация: 33
Всего: 37



Ну давай всё с самого начала. (кстати на другом форуме это то же ты? Malkav кажется - или мне и туда и сюда отвечать нужно если вы два разных человека?)

1. Расскажи что ты хочешь сделать?
2. "Кто" такой сервер с которого ты что-то читаешь?
3. Есть ли возможность что-то посылать в определённый порт этого сервера и видеть, что он это принял и увидеть его реакцию?

=====================================
Я не понимаю, для чего тебе на девайсе спецом заводить порт для прослушки, возможно ты просто немного не в ту сторону рубишься smile
Если ты заводишь на "своём" телефоне порт, для того чтобы тебе кто-то на него что-то присылал (с друго телефона, с тырнета и т.д.) тебе нужно пользовать другой интерфейс для его создания. 

ServerSocketConnection ssc = (ServerSocketConnection)Connector.open("socket://:9677");
Это будет означать, что ты на своём телефоне слушаешь порт 9677, и всё что на него поступит, ты можешь обработать.
Но для того чтобы в этот порт что-то пришло, нужно чтобы кто-то отправил тебе какие-либо данные. Это либо другой аппарат, либо с сайта (скриптом). Тебе нужно получить IP адрес твоего аппарата, и по этому адресу он будет доступен "клиентам"
чтобы узнать IP адрес, который выдаётся динамически оператором, после регистрации сервака ssc коннекшена можно вызвать метод getLocalAddress() на объекте ssc.
Для работы с ssc (чтение/запись) нам понадобится SocketConnection oбъект, мы его получаем через специальный метод:
SocketConnection server = (SocketConnection) ssc.acceptAndOpen();
ну и далее уже по известной схеме, получаем стримы для чтения/записи
InputStream serverIS = server.openInputStream();
OutputStream serverOS = server.openOutputStream();



Если же ты работаешь с каким-то серваком и тебе в него нужно что-то писать (делать какие-то посылки данных на сервер, не только чтение) то делаем это следующим образом, через интерфейс SocketConnection

SocketConnection sc = (SocketConnection) Connector.open("socket://"+IP+":"+PORT); 
IP это обязательное поле!!!!
InputStream is = sc.openInputStream(); // для чтения данных с сервера из коннекшена sc
OutputStream os = sc.openOutputStream();// для отправки данных серверу из коннекшена sc
--------------------

Маленькое отступление. Где ты это пытаешься "смотреть" (тестить). Могу предложить простенький вариант.
Подними у себя на локальной машине простенький самописный сервер (можешь посмотреть как это делается в J2SE и работать с серваком на Java), ну или какой нить Apache или что-то в этом роде. Если не Java сервак, то тогда сделай скрипт perl/jsp/asp (или что-то другое, что лучше знаешь) и сиди и слушай этим скриптом порт, и делай какой-нить ответ "PONG", если тебе в этот порт сваливается "PING" и выводи это в лог или на браузерную страницу или ещё как.
То есть, ты этим просто сможешь проверить, что у тебя твой Java клиент на мобиле робит. А клиента запускаешь через WTK регистрируя SocketConnection как Connector.open("socke://127.0.0.1:"+PORT); PORT = это твой зарегенный порт на серваке (Java, Apache и т.д.)


--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
VKoresh
Дата 4.7.2007, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 14.6.2007
Где: Запорожье

Репутация: 1
Всего: 1



Dancer, Malkav - это, можно сказать, мое второе Я smile

1) Мой мидлет должен представлять собой клиент, котрый коннектится к серверу и может отсылать ему комманды и ,соответственно им, принимать изображения, звуки, музыку, текст и т.д.
2) Сервер представляет собой прогу на Delphi, которая спит и видит принять откуда-нибудь комманду. Т.е. перманентно ожидает коннекта. По коннекту отсылает соответствующее уведомление, из серии "молодец, я тебя вижу, теперь пришли мне еще комманду че тебе еще переслать".
3) Сервер ведет лог и там отображется что, мол 11:05:59 законнектился Вася Пупкин и т.д. Ответы шлет автоматически. В работе сервака я уверен больше, чем в том что солнце встает на востоке. smile (Может быть потому, что писал его не я smile)
 
Сейчас у меня такой трабл - коннектится просто зашибись, а ответ принять нормально не может...

Код

public void run()
    {
        int c = 0;
        String S;

        try
        {
            // открывет соединение с сервером
            sc = (SocketConnection)Connector.open("socket://" + (TFIP.getString()) + ":" + (TFPort.getString()));
            // открывает исходящий поток 
            os = sc.openDataOutputStream();

                       // os.write и т.д. в общем шлет 

            is = sc.openDataInputStream();        

/*                        
                        listener = (ServerSocketConnection)Connector.open("socket://:5555"); // прослушиватель на 5555 порту
                        // strcon - public StreamConnection
                        strcon = listener.acceptAndOpen();
                        is = strcon.openDataInputStream(); // открывает входящий поток

 // С таким раскладом выдает java.io.IOException: ServerSocket Open
 // на строке listener = (ServerSocketConnection)Connector.open("socket://:5555");

*/
            StringBuffer sb = new StringBuffer();
      
            while (((c = is.read()) != '\n') && (c != -1))
            {          
                sb.append((char)c);
            }
      
            if (c == -1)
            {             
                stop();    // break тут почему-то не становится...
            }
     
            System.out.println("Message received - " + sb.toString());                        
            
        }
        catch (IOException x)                                        
        {
            x.printStackTrace();
        }        
     } 


С таким раскладом принимает один раз...последний smile 
Но, сам понимаешь, такое решение никуда не годится... Вот и начал придумывать себе прослушиватель... smile описанный выше и на другом форуме.
ЗЫ давай уж тут отписываться, а не на другом форуме. Пора прекратить на фиг эту путаницу. smile


 

Это сообщение отредактировал(а) VKoresh - 4.7.2007, 11:43
PM MAIL ICQ   Вверх
VKoresh
Дата 4.7.2007, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 14.6.2007
Где: Запорожье

Репутация: 1
Всего: 1




Как обрабатывать поступившие данные мне пока не важно. Мне надо чтоб он мог их принимать постоянно...

PM MAIL ICQ   Вверх
W0LF
Дата 4.7.2007, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



Цитата

1) Мой мидлет должен представлять собой клиент, котрый коннектится к серверу и может отсылать ему комманды и ,соответственно им, принимать изображения, звуки, музыку, текст и т.д.

Тебе для этого не нужно открывать второе соединение на телефоне.. Когда ты подрубился к серваку - он тебе уже сам может посылать все, что надо. Это ж тебе не хттп - отослал-принял, а соединение всегда открыто.
Цитата

С таким раскладом принимает один раз...последний smile

Ага.. понятно.. все намного проще.. и не надо серверов никаких на телефоне smile
Я ж просил посмотреть на пример из WTK   smile 
Код

public void run() {
        try {
            sc = (SocketConnection) Connector.open("socket://localhost:5000");//тут у тя так же
            si.setText("Connected to server");
            is = sc.openInputStream(); // это тож в принципе как у тебя
            os = sc.openOutputStream(); // и это тож

            // Start the thread for sending messages - see Sender's main
            // comment for explanation
            sender = new Sender(os);

            // Loop forever, receiving data
            //А теперь мы заметили обрамляющий цикл! Сейчас чуть освобожусь и напишу как все работает
            while (true) {
                StringBuffer sb = new StringBuffer();
                int c = 0;

                while (((c = is.read()) != '\n') && (c != -1)) {
                    sb.append((char) c);
                }

                if (c == -1) {
                    break;
                }

                // Display message to user
                si.setText("Message received - " + sb.toString());
            }
            stop();
            si.setText("Connection closed");
            f.removeCommand(sendCommand);
        } catch (ConnectionNotFoundException cnfe) {
            Alert a = new Alert("Client", "Please run Server MIDlet first",
                    null, AlertType.ERROR);
            a.setTimeout(Alert.FOREVER);
            a.setCommandListener(this);
            display.setCurrent(a);
        } catch (IOException ioe) {
            if (!stop) {
                ioe.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 




--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
VKoresh
Дата 4.7.2007, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 14.6.2007
Где: Запорожье

Репутация: 1
Всего: 1



Освобождайся, я подождуsmile 

А что касается примера, то впрвх - Бесконечный Цикл?
Код

 while (true)

А ввтрх - У меня большая часть кода как раз оттуда, но с некоторыми доработками..
и втртх -  smile 
PM MAIL ICQ   Вверх
W0LF
Дата 4.7.2007, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



Хм, чуть освободилсо smile
Код

public void run() {
        try {
            sc = (SocketConnection) Connector.open("socket://localhost:5000");//тут у тя так же
            si.setText("Connected to server");
            is = sc.openInputStream(); // это тож в принципе как у тебя
            os = sc.openOutputStream(); // и это тож
            // Start the thread for sending messages - see Sender's main
            // comment for explanation

тут все ясно
Код

sender = new Sender(os); 

Тут тож ясно, класс Sender разберем ниже.
Код

// Loop forever, receiving data
            //делаем бесконечный цикл для того, чтоб ловить входящие пакеты
            while (true) {
                StringBuffer sb = new StringBuffer();
                int c = 0;

                //читаем один пакет, если приходит -1, то это разрыв соединения, выходим из цикла
                //в этом примере завершающим символом пакета считается '\n', то есть если прийдет
                // '\n' то тож выходим из цикла
                //Если же сервер ниче не присылает, то на методе is.read() этот поток остановился и
                //А что касается примера, то впрвх - Бесконечный Цикл?
                //бесконечный цикл будет тупо ждать входящего пакета
                while (((c = is.read()) != '\n') && (c != -1)) {
                    sb.append((char) c);
                }
                //если нам все-таки пришел -1, то это разрыв соединения и мы выходим из бесконечного
                //цикла вообще и более не ждем пакетов от энтого сервера
                if (c == -1) {
                    break;
                }

                // Display message to user
                si.setText("Message received - " + sb.toString());
            } 

Sender надо расписывать?

Это сообщение отредактировал(а) W0LF - 4.7.2007, 13:00


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
VKoresh
Дата 4.7.2007, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 14.6.2007
Где: Запорожье

Репутация: 1
Всего: 1



Цитата

Sender надо расписывать?

Если не затруднит... smile хотя шлет у меня вроде нормально. Но принцип работы в целом интересен мне.

Но получается Бесконечный Цикл выполнится один раз?
К примеру ситуация - отслал-принял-отослал-принял? каждый раз вызывать run? Я правильно понял?

Это сообщение отредактировал(а) VKoresh - 4.7.2007, 15:42
PM MAIL ICQ   Вверх
W0LF
Дата 4.7.2007, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



Цитата

К примеру ситуация - отслал-принял-отослал-принял? каждый раз вызывать run? Я правильно понял?

нет, не правильно.. run() - это метод потока. он завершился - поток умер(очень грубо говоря).
Бесконечный цикл ждет пакеты, внутренний цикл - считывает один пакет
Тебе нужно просто запустить поток и все.. далее он будет работать
Sender чуть позже распишу.. реально времени нет :(
Код

client = new Client(this);
client.start(); 

Еще раз говорю :
смотри в пример WTK. просто смотри что и как они делают. smile


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
VKoresh
Дата 4.7.2007, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 14.6.2007
Где: Запорожье

Репутация: 1
Всего: 1



Тогда надо как-то отсылать параллельно с бесконечным циклом?

ЗЫ Пойду еще покурю мануалы  smile 

Это сообщение отредактировал(а) VKoresh - 4.7.2007, 16:48
PM MAIL ICQ   Вверх
W0LF
Дата 4.7.2007, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



Цитата

Тогда надо как-то отсылать параллельно с бесконечным циклом?

Да, класс Sender юзает отдельный поток и он же - потокобезопасен(синхронизирован)


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
VKoresh
Дата 4.7.2007, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 14.6.2007
Где: Запорожье

Репутация: 1
Всего: 1



Что-то меня вообще не в ту степь понесло... Получается, что вообще необязательно создавать отдельный класс и поток. Ведь есть InputStream. Проще дописать в CommandAction еще комманду которая будет пересылать что-нибудь. Сейчас сяду пробовать.

Это сообщение отредактировал(а) VKoresh - 4.7.2007, 18:19
PM MAIL ICQ   Вверх
W0LF
Дата 5.7.2007, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



тебе нужно почитать про многопоточность


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
VKoresh
Дата 5.7.2007, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 14.6.2007
Где: Запорожье

Репутация: 1
Всего: 1



Сейчас докатился до вот такого:
Код


public void run()
    {
        
        int c = 0;
        String S;
        int av = 0;

        try
        {
            sc = (SocketConnection)Connector.open("socket://" + (TFIP.getString()) + ":" + (TFPort.getString()));
            os = sc.openDataOutputStream();
            is = sc.openDataInputStream();
            

            //os.write и т.д.

            while (true)
            {
                av = is.available();
                if (av > 0)
                {
                    if (sb.length() > 0)
                    {
                        sb.delete(0, sb.length() - 1);
                    }

                    while (av > 0)
                    {
                        c = is.read();
                        av = is.available();
                        System.out.println("av " + av);
                        sb.append((char)c);
                        System.out.println("receiving" + sb.toString());
                    }                

                    System.out.println("Message received - " + sb.toString());
                    // дальше должна быть обработка полученной строки
                }
            }
        }
        catch (IOException x)                                        
        {
            x.printStackTrace();
        }        
     }




Принимает, однако параллельно с этим ничего не может сделать, т.е. не реагирует до тех пор пока все не получит.
Также такой прикол - available возвращает число не больше 25! И еще вопрос можно сделать чтоб он не побайтно считывал а все сразу?
Пробовал read(byte[] b), то ли не понял, то ли.. smile 

ЗЫ W0LF, не кинешь ссылку на какую-то инфу про многопоточность? Великий и Ужасный Гугл меня не понял... :(


Это сообщение отредактировал(а) VKoresh - 5.7.2007, 13:20
PM MAIL ICQ   Вверх
W0LF
Дата 5.7.2007, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



Создание многопоточных приложений в Java

Добавлено через 1 минуту и 8 секунд
А вообще : один топик - один вопрос.


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
VKoresh
Дата 11.7.2007, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 14.6.2007
Где: Запорожье

Репутация: 1
Всего: 1



W0LF, спасибо! с помощью wait и notify реализовал! Такой довольный, хоть джигу пляши smile  
PM MAIL ICQ   Вверх
W0LF
Дата 11.7.2007, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



На здоровье smile


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
Yelodia
Дата 3.2.2010, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 14.12.2009

Репутация: нет
Всего: нет



Здравствуйте! Решила не создавать новую тему, а задать вопрос в этой, так как десь обсуждается networkDemo. Сервер написан на дельфи, а клиента запускаю на эмуляторе, программу networkDemo. Код java не правила. Дело в том, что сервер от клиента принимает сообщения нормально, а вот клиент от сервера не принимает. Вернее, может и принимает, но в статусе не выводит, что сообщение получено. Можно было предположить, что с сервером что-то не так, но когда он посылает сообщения, то в окне эмулятора горит индикатор связи, значит, связь все таки есть. А сообщение так и не выводит (или не получает). В чем тут проблема?
PM MAIL ICQ   Вверх
W0LF
Дата 4.2.2010, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



Проблема где-то в коде скорее всего
В смысле его надо показать

Это сообщение отредактировал(а) W0LF - 4.2.2010, 13:57


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
Yelodia
Дата 9.2.2010, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 14.12.2009

Репутация: нет
Всего: нет



Получение сообщения происходит здесь:
Код

        // Loop forever, receiving data
        while (true) {
        StringBuffer sb = new StringBuffer();
        int c = 0;
        while (((c = is.read()) != '\n') && (c != -1)) {
            sb.append((char) c);
        }
        if (c == -1) {
            break;
        }
        // Display message to user
        si.setText("Message received - " + sb.toString());
        }


Но в текстовом поле si полученное сообщение не отображается, а только строка, которая устанавливается при соединении с сервером:
Код

        si.setText("Connected to server on port "+portString);

Вернее, если сервер запускать также через WTK, то все работает нормально. Но нужно, чтобы j2me клиент работал с сервером, написанным на Delphi, с которым имеет место эта проблема.
Код отправки сообщения сервером:
Код

procedure TForm1.BitBtn3Click(Sender: TObject);
     var i: Integer;
    begin
      for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do begin
       ServerSocket1.Socket.Connections[i].SendText(Edit1.Text);
       Application.ProcessMessages;
      end;
      Memo1.Lines.Insert(0,'< '+Edit1.Text);
    end;

Но проблема не в сервере, так как клиент на Delphi сообщения сервера принимает нормально

Это сообщение отредактировал(а) Yelodia - 9.2.2010, 12:59
PM MAIL ICQ   Вверх
Dancer
Дата 9.2.2010, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

Репутация: 33
Всего: 37



На форме есть элементы, и если нужно обновить (перерисовать) форму (элементы на форме), после изменения значения этих элементов, то:
  - либо создаём собственную форму и имплементим ItemStateListener
  - либо какой-либо класс имплементит ItemStateListener, а форма должна будет зарегить листенер:
     class MyClass implements ItemStateListener {
......
         Form myForm = new Form();
         myForm.setItemStateListener(this);
         StringItem si = new StringItem("MSG:","unknown...");
         myForm.append(si);
......
         si.setText("Bla-bla-bla");
.......
         public void itemStateChanged(Item item) {
             if(item == si) {
                 Display.setCurrent(myForm); // Display.getDisplay(MIDlet).setCurren(Item);
            }
     }



--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
Yelodia
Дата 9.2.2010, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 14.12.2009

Репутация: нет
Всего: нет



Попробовала, не работает. Дело не в изменении объекта Item, так как изначально (то есть с сервером на j2me) работало и без этого обработчика. Изменила код так, что при получении сообщения выводилось уведомление Alert:
Код

        while (true) {
        StringBuffer sb = new StringBuffer();
        int c = 0;
        while (((c = is.read()) != '\n') && (c != -1)) {
            sb.append((char) c);
        }
        if (c == -1) {
            break;
        }

        // Display message to user
           Alert a = new Alert("Client",
            "Message received " + port,
            null, AlertType.INFO);
        a.setTimeout(Alert.FOREVER);
        a.setCommandListener(this);
        display.setCurrent(a);
        }

Нет никакой реакции, получается, что клиент от сервера вообще не принимает сообщения...
PM MAIL ICQ   Вверх
Dancer
Дата 9.2.2010, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

Репутация: 33
Всего: 37



Код

ну, хорошо, а вы можете сервак на делфи снабдить трейсами и посмотреть логи?
Чтобы быть реально уверенным, что данные с него действительно были отправленны.
Так как is.read() - это блокирующая операция, и разблокируется она лишь в том случае, как что-то от сервака действительно в этом потоке появиться, ну или будет уничтожен коннекшен со стороны сервера.
Так же есть NetworkMonitor когда запускаете приложение в WTK его можно использовать для дебага и смотреть, как пакеты ходят через сетку.



--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
Yelodia
Дата 9.2.2010, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 14.12.2009

Репутация: нет
Всего: нет



Запустила NetworkMonitor, там отправленная сервером строка отображается нормально, думаю, остальное нет смысла делать. 
user posted image
А вот клиент по прежнему не реагирует на событие...


Это сообщение отредактировал(а) Yelodia - 9.2.2010, 20:54
PM MAIL ICQ   Вверх
W0LF
Дата 10.2.2010, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



а где после qwerty "\n" ?
Код

(c = is.read()) != '\n') && (c != -1)

это значит, что он будет ждать либо переход на новую строку в конце, чтоб хоть как-то понимать как бить пакеты или же разрыв соединения. Вы ему ни того ни другого не даете.

Это сообщение отредактировал(а) W0LF - 10.2.2010, 00:11


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
Yelodia
Дата 10.2.2010, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 14.12.2009

Репутация: нет
Всего: нет



Ой... И правда. Как всегда, глупая ошибка. 
W0LF, спасибо!
PM MAIL ICQ   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.1889 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.