Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java ME (J2ME) > DataInputStream |
Автор: VKoresh 3.7.2007, 14:59 | ||
Сделал вот так:
Дело в том, что мне надо чтобы приложение не только отсылало строки но и принимало их. Отсылает на ура,а вот слушать порт и принимать не хочет. ![]() На строке listener = (SocketConnection)Connector.open("socket://:5555"); выдает java.io.IOException: ServerSocket Open Помогите, пожалйста! |
Автор: W0LF 3.7.2007, 15:19 | ||||
а ты посмотри в сторону
Добавлено через 3 минуты и 51 секунду Посмотри в WTK там пример есть очень простой.
|
Автор: VKoresh 3.7.2007, 16:21 |
Смотрел, не помогло, Горнакова и Пирумяна тоже читал, и тоже не помогло. ![]() ![]() ![]() Обидно, что даже компилится без ошибок... ![]() |
Автор: VKoresh 3.7.2007, 16:38 |
![]() |
Автор: AntonSaburov 3.7.2007, 16:41 |
А ты уверен, что этот порт свободен ? В смысле - 5555. Мож кто на нем висит постоянно ? |
Автор: Dancer 3.7.2007, 16:54 | ||
дык он сам же на нём и висит скорее всего ![]() вот этот кусок кода очень не понятен!!!! (почему одно и то же название переменно фигурирует, перекрытие имён происходит) listener = (SocketConnection)Connector.open("socket://:5555"); DataInputStream listener = sc.openDataInputStream(); Добавлено через 8 минут и 29 секунд наверное должно быть так ![]()
|
Автор: VKoresh 3.7.2007, 17:07 | ||||
Добавлено @ 17:09 AntonSaburov,
![]() Добавлено @ 17:19 Dancer, сделал
все как ты и говорил... Все та же проблемма - На строке listener = (SocketConnection)Connector.open("socket://:5555"); выдает java.io.IOException: ServerSocket Open |
Автор: Dancer 4.7.2007, 09:39 |
Ну давай всё с самого начала. (кстати на другом форуме это то же ты? Malkav кажется - или мне и туда и сюда отвечать нужно если вы два разных человека?) 1. Расскажи что ты хочешь сделать? 2. "Кто" такой сервер с которого ты что-то читаешь? 3. Есть ли возможность что-то посылать в определённый порт этого сервера и видеть, что он это принял и увидеть его реакцию? ===================================== Я не понимаю, для чего тебе на девайсе спецом заводить порт для прослушки, возможно ты просто немного не в ту сторону рубишься ![]() Если ты заводишь на "своём" телефоне порт, для того чтобы тебе кто-то на него что-то присылал (с друго телефона, с тырнета и т.д.) тебе нужно пользовать другой интерфейс для его создания. 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 и т.д.) |
Автор: VKoresh 4.7.2007, 10:53 | ||
Dancer, Malkav - это, можно сказать, мое второе Я ![]() 1) Мой мидлет должен представлять собой клиент, котрый коннектится к серверу и может отсылать ему комманды и ,соответственно им, принимать изображения, звуки, музыку, текст и т.д. 2) Сервер представляет собой прогу на Delphi, которая спит и видит принять откуда-нибудь комманду. Т.е. перманентно ожидает коннекта. По коннекту отсылает соответствующее уведомление, из серии "молодец, я тебя вижу, теперь пришли мне еще комманду че тебе еще переслать". 3) Сервер ведет лог и там отображется что, мол 11:05:59 законнектился Вася Пупкин и т.д. Ответы шлет автоматически. В работе сервака я уверен больше, чем в том что солнце встает на востоке. ![]() ![]() Сейчас у меня такой трабл - коннектится просто зашибись, а ответ принять нормально не может...
С таким раскладом принимает один раз...последний ![]() Но, сам понимаешь, такое решение никуда не годится... Вот и начал придумывать себе прослушиватель... ![]() ЗЫ давай уж тут отписываться, а не на другом форуме. Пора прекратить на фиг эту путаницу. ![]() |
Автор: VKoresh 4.7.2007, 11:44 |
Как обрабатывать поступившие данные мне пока не важно. Мне надо чтоб он мог их принимать постоянно... |
Автор: W0LF 4.7.2007, 12:30 | ||||||
Тебе для этого не нужно открывать второе соединение на телефоне.. Когда ты подрубился к серваку - он тебе уже сам может посылать все, что надо. Это ж тебе не хттп - отослал-принял, а соединение всегда открыто.
Ага.. понятно.. все намного проще.. и не надо серверов никаких на телефоне ![]() Я ж просил посмотреть на пример из WTK ![]()
|
Автор: VKoresh 4.7.2007, 12:42 | ||
Освобождайся, я подожду![]() А что касается примера, то впрвх - Бесконечный Цикл?
А ввтрх - У меня большая часть кода как раз оттуда, но с некоторыми доработками.. и втртх - ![]() |
Автор: W0LF 4.7.2007, 12:58 | ||||||
Хм, чуть освободилсо ![]()
тут все ясно
Тут тож ясно, класс Sender разберем ниже.
Sender надо расписывать? |
Автор: VKoresh 4.7.2007, 13:04 | ||
Если не затруднит... ![]() Но получается Бесконечный Цикл выполнится один раз? К примеру ситуация - отслал-принял-отослал-принял? каждый раз вызывать run? Я правильно понял? |
Автор: W0LF 4.7.2007, 16:08 | ||||
нет, не правильно.. run() - это метод потока. он завершился - поток умер(очень грубо говоря). Бесконечный цикл ждет пакеты, внутренний цикл - считывает один пакет Тебе нужно просто запустить поток и все.. далее он будет работать Sender чуть позже распишу.. реально времени нет :(
Еще раз говорю : смотри в пример WTK. просто смотри что и как они делают. ![]() |
Автор: VKoresh 4.7.2007, 16:38 |
Тогда надо как-то отсылать параллельно с бесконечным циклом? ЗЫ Пойду еще покурю мануалы ![]() |
Автор: W0LF 4.7.2007, 16:46 | ||
Да, класс Sender юзает отдельный поток и он же - потокобезопасен(синхронизирован) |
Автор: VKoresh 4.7.2007, 16:53 |
Что-то меня вообще не в ту степь понесло... Получается, что вообще необязательно создавать отдельный класс и поток. Ведь есть InputStream. Проще дописать в CommandAction еще комманду которая будет пересылать что-нибудь. Сейчас сяду пробовать. |
Автор: W0LF 5.7.2007, 12:09 |
тебе нужно почитать про многопоточность |
Автор: VKoresh 5.7.2007, 13:17 | ||
Сейчас докатился до вот такого:
Принимает, однако параллельно с этим ничего не может сделать, т.е. не реагирует до тех пор пока все не получит. Также такой прикол - available возвращает число не больше 25! И еще вопрос можно сделать чтоб он не побайтно считывал а все сразу? Пробовал read(byte[] b), то ли не понял, то ли.. ![]() ЗЫ W0LF, не кинешь ссылку на какую-то инфу про многопоточность? Великий и Ужасный Гугл меня не понял... :( |
Автор: W0LF 5.7.2007, 15:27 |
http://lib.juga.ru/article/view/166/1/68/ Добавлено через 1 минуту и 8 секунд А вообще : один топик - один вопрос. |
Автор: VKoresh 11.7.2007, 13:29 |
W0LF, спасибо! с помощью wait и notify реализовал! Такой довольный, хоть джигу пляши ![]() |
Автор: W0LF 11.7.2007, 13:54 |
На здоровье ![]() |
Автор: Yelodia 3.2.2010, 21:19 |
Здравствуйте! Решила не создавать новую тему, а задать вопрос в этой, так как десь обсуждается networkDemo. Сервер написан на дельфи, а клиента запускаю на эмуляторе, программу networkDemo. Код java не правила. Дело в том, что сервер от клиента принимает сообщения нормально, а вот клиент от сервера не принимает. Вернее, может и принимает, но в статусе не выводит, что сообщение получено. Можно было предположить, что с сервером что-то не так, но когда он посылает сообщения, то в окне эмулятора горит индикатор связи, значит, связь все таки есть. А сообщение так и не выводит (или не получает). В чем тут проблема? |
Автор: W0LF 4.2.2010, 13:50 |
Проблема где-то в коде скорее всего В смысле его надо показать |
Автор: Yelodia 9.2.2010, 12:55 | ||||||
Получение сообщения происходит здесь:
Но в текстовом поле si полученное сообщение не отображается, а только строка, которая устанавливается при соединении с сервером:
Вернее, если сервер запускать также через WTK, то все работает нормально. Но нужно, чтобы j2me клиент работал с сервером, написанным на Delphi, с которым имеет место эта проблема. Код отправки сообщения сервером:
Но проблема не в сервере, так как клиент на Delphi сообщения сервера принимает нормально |
Автор: Dancer 9.2.2010, 16:04 |
На форме есть элементы, и если нужно обновить (перерисовать) форму (элементы на форме), после изменения значения этих элементов, то: - либо создаём собственную форму и имплементим 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); } } |
Автор: Yelodia 9.2.2010, 18:52 | ||
Попробовала, не работает. Дело не в изменении объекта Item, так как изначально (то есть с сервером на j2me) работало и без этого обработчика. Изменила код так, что при получении сообщения выводилось уведомление Alert:
Нет никакой реакции, получается, что клиент от сервера вообще не принимает сообщения... |
Автор: Dancer 9.2.2010, 19:21 | ||
|
Автор: Yelodia 9.2.2010, 20:20 |
Запустила NetworkMonitor, там отправленная сервером строка отображается нормально, думаю, остальное нет смысла делать. ![]() А вот клиент по прежнему не реагирует на событие... |
Автор: W0LF 10.2.2010, 00:09 | ||
а где после qwerty "\n" ?
это значит, что он будет ждать либо переход на новую строку в конце, чтоб хоть как-то понимать как бить пакеты или же разрыв соединения. Вы ему ни того ни другого не даете. |
Автор: Yelodia 10.2.2010, 18:11 |
Ой... И правда. Как всегда, глупая ошибка. W0LF, спасибо! |