Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java ME (J2ME) > Сокеты в J2ME |
Автор: alexdrob 20.2.2009, 04:34 | ||||
Здравствуйте! Начал изучать Java и сталкнулся с такой проблеммой, хочу сделать мидлет который будет подключаться к другому с помощью сокетов и посылать и принемать данные. как я понял что ессли для openInputStream() или openOutputStream() выполнить .close() то openInputStream() и openOutputStream() уничтожаются. передаю данные так
а принимаю так
так проблемма в том что код после кода приёма не выполняеться пока не выполню os.close(); т.е. получаеться что после каждой отправки данных нужно опять создавать SocketConnection? или яне правильно что то делаю |
Автор: eugine_s 20.2.2009, 12:56 | ||
попробуй
|
Автор: alexdrob 20.2.2009, 13:28 | ||||||||||
а что это изменит? проблемма в последней строке
после закрытия больше нельзя пользовотся
вот функция отправки
первый раз вызывается норм, а второй не вызываеться |
Автор: alexdrob 20.2.2009, 13:48 | ||||||
выложу весь код проги, эту прогу делаю для изучения работы сокетов: Main
NetServer
NetClient
|
Автор: alexdrob 20.2.2009, 17:38 | ||||||
вообщем вроде разобрался с этим, но появилась новая проблемма, на эмуле всё норм работает, а сотовый не можект выполнять роль сервера. если комп запустить первым то он в роли сервера, потом запустить сотовый и он конектится и всё работает. если сотовый запустить первым, то он доходит до строки
и на этом виснет. пробовал на самсунге i710 и на SE c702 работать должно так: прога конектится к http://stone-decor.ru/xNetBat.php и в ответ приходит OK а IP сервера сохраняеться на хостинге http://stone-decor.ru/xNetBat.php после этого когда конектится другая прога ей приходит IP сервера (первой проги) код приложения ниже: Main
NetSocket
|
Автор: W0LF 21.2.2009, 01:23 |
надо просто javadoc внимательно читать есть такой метод - acceptAndOpen() http://www.java2s.com/Tutorial/Java/0430__J2ME/ServerSocketConnection.htm |
Автор: alexdrob 21.2.2009, 02:12 | ||
я использую этот метод
из этого кода выполняеться только первая строка, а на второй строке просто зависает и всё. ошибки не появляються, просто виснет. НО если запустить не на сотовом а на эмуляторе на компе то всё работает норм |
Автор: W0LF 21.2.2009, 03:47 |
потому что сначала у сервера нужно взять host вот у тебя там в метод start() передавался cIP. откуда ты его брал?? тебе сначала нужно взять у серверсокета getLocalAddress() это и есть хост, а потом на него рубиццо с клиента Добавлено через 5 минут и 12 секунд нашел. ты его вычитываешь с какого-то пхпшного сервака. он втупую ОК возвращает.... то есть ты коннектишься к OK хосту??? смысл такой - создаешь сервер сокет, узнаешь хост, отправляешь например смской куда-нидь клиенту этот хост, далее клиент берет этот хост и рубиццо к нему по сокету. НО, не все операторы определяют нормально хост, с этим траблов в поряде может быть |
Автор: alexdrob 21.2.2009, 12:24 | ||||
php файл по очереди возвращает либо OK либо IP адрес. это просто зделанно чтобы первый подключивщийся был сервер второй клиент. но проблемма не в том. адрес нужен клиенту а виснет серв на строке
т.е. весь код до этой строки выполняеться а после неё нет. доходит до неё и останавливаеться. не каких ошибок не вылетает. НО не работает только если запустить на сотовом, пробовал на разных и на разных сетях. с компа с эмулятара серв запускаеться и работает. |
Автор: W0LF 22.2.2009, 18:09 | ||
теперь давай разберемся: на телефоне меняется текст на "YOU SERVER!" а потом "WAIT CLIENT!" не показывается а на эмуляторе показывается? Вообще это плохая практика - менять гуй из другого потока, не синхронизируя, например блекберри не позволит такое сделать.. в j2me это вроде как разрешается. то есть у тебя меняется на дисплее текст на - YOU SERVER! ? Второй вопрос, который меня интересует - а где пхпшный сервак берет айпишник для твоего сервер-телефона? он ему что, сам его придумывает? |
Автор: alexdrob 23.2.2009, 03:43 |
Да текст меняеться на YOU SERVER IP берётся так: запускаю сотовый он обращаеться к пхп файлу этот файл проверяет текстовый файл на сервере, если он пустой то он записывает туда IP того телефона который обратился, потом второй телефон обращаеться к файлу файл проверяет текстовый файл и берёт оттуда IP первого телефона и отправляет второму телефону. Но с IP проблем нет, серверу IP вообще не нужен. это клиенту нужен, но клиент работает и конектится, если эмулятор с компа запустить. Мне сказали что NAT сотовых провайдеров не пропускает пакеты к сотовым. Т.е. на телефоне серв типа не запустится, только клиент. |
Автор: W0LF 23.2.2009, 20:25 | ||||
Ну у меня ж он какого-то фига два года назад запускался на sonyericsson k500i а со временем и на nokia3250.. Кароче, к чему я все веду. Мне кажеццо, что у тебя реально виснет на
и ждет, что клиент не могет подконнектиться.
проверь пожалуйста, айпи, который взял сервер и тот, который вернул getLocalAddress() одинаковы? открой просто на телефоне серверсокет, выведи для себя его getLocalAddress() возьми у него же, а потом просто в другом телефоне перед запуском сделай возможность ввода айпишника, введи его и подконнектись с ним к серверу. просто попробуй сделать так |
Автор: alexdrob 25.2.2009, 01:05 |
вообщем я сделал серв на яве на компе запускаю, оба телефона конектятся и игра заработала)) |
Автор: W0LF 25.2.2009, 13:04 |
ну, это как бы оптимальное решение =))) |
Автор: gosnis 25.2.2009, 17:17 | ||
На мой взгляд, самое правильное решение. Game engine, сидит на сервере, а клиенты только прорисовывают текущее положение. По идее это должно облегчить и работу аппликации. Учитывая ограничения в ресурсах и мощностях телефонов, это только на пользу. |
Автор: alexdrob 26.2.2009, 00:17 | ||||||
у меня возник вопрос, у меня есть клас NetSocket он не наследник других класов
а в класе Main есть Vector
т.е. я передаю указатель на вектор в класс, если я в класе сделаю так
то из памяти обьект удалиться? просто память при новом соединении увеличиваеться а при отключении уменьшаеться но не на столько на сколько увеличилась. |
Автор: gosnis 26.2.2009, 02:02 | ||
Garbage collector срабатывает раз в какое то время. Никто не гарантирует, что память освободится сразу после того, как вы обнуллили референс на объект. Может дело в этом? |