Модераторы: 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   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса

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

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


 




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


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

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