Re: Библиотеки
Вложений: 2
Пробуйте.
|
Re: Библиотеки
Возник вопрос такого плана:
1. При открытии сокета обмен данніми в асинхронном режиме?.. 2. Немного не понял, как записывать данные в сокет для отправки... Через ИнпутСтрим?.. |
Re: Библиотеки
1. есть ли что на приеме можно запросить, а отправка в любой момент.
2. пишет побайтно. если надо строку, могу сделать |
Re: Библиотеки
program Menu;
uses socket; var s: string; b : integer; begin if socket.open('socket://mrim.mail.ru:2042')<>0 then Debug('Error'); while socket.available=0 do begin delay(100); end; b := 33; while (socket.available<>0) or (b>32) do begin b := socket.read; s := s + chr(b); end; DrawText(s, 0, 0); repaint; delay(5000); end. |
Re: Библиотеки
pilgrim, уважаемый, а библиотека работает по протоколу UDP или TCP/IP ?
Бибилиотека использует протокол tcp. (Piligrim) |
Re: Библиотеки
Цитата:
socket.open('socket://...') выдает код ошибки -1. При этом сам телефон даже не выдает запрос на разрешение доступа к сети передачи данных. Что это может быть? Телефон настроен как надо, и все остальные Интернет-приложения работают :) |
Re: Lib_socket
А можно таки реализовать поддержку отправки строки в вышеуказанной библиотеке?..
|
Re: Lib_socket
Вложений: 2
C отправкой строк и количеством принятой/отправленой инфы.
|
Re: Lib_socket
Вложений: 2
чтото не хочет отправлять почту через сокет смтп, можете глянуть что не так.. ?
|
Re: Lib_socket
Вложений: 2
ну еще бы хотел ))))))
во первых: где символ перевода каретки? и что за \r\n? меняем везде SendState:= Socket.WriteStr('HELO there\r\n'); на SendState:= Socket.WriteStr('helo there' + chr(10)); во вторых: где чтение и анализ ответа сервера или хотя бы простые задержки между командами? добавляем где надо Delay(2000); while Socket.Available > 0 do RecvString:= RecvString + Chr(Socket.Read); ну и в третьих и четвертых: на сервере может быть авторизация. и у тебя на внешнем шлюзе может быть закрыт 25 порт во избежание. вобщем лови пример, код конечно ужасный, но у меня в локалке с локальным почтовиком все работает. |
Re: Lib_socket
А можно с помощъю этой либы подключаться к серверу по IP-адресу не в локальной сети, а в интернет?
|
Re: Lib_socket
Конечно можно. Не совсем понимаю о чем идет речь. чем IP адрес локальной сети отличается от интернет?
|
Re: Lib_socket
Я просто не правильно выразился.
Суть состоит в том, чтобы подключиться к удаленной машине на определенный порт. На компе запущена программа, которая прослушивает этот порт(сокет в асинхронном режиме). Мидлет должен подключиться к компу, передать ему данные и закрыть соединение. Код:
Хотя судя по логу MIDWay ошибок нет: Код:
AMS: VM_APPLICATION_STATE_CHANGED, 0 |
Re: Lib_socket
судя по логу, собственно соединение устанавливается, но ничего не прилетает. Может сервер буферирует отправку?
|
Re: Lib_socket
Цитата:
|
Re: Lib_socket
Дело в том, что подключение к серверной программе не устанавливается.
|
Ответ: Lib_socket
Как отправить данные методом POST на сервер?
|
Ответ: Lib_socket
Для этого можно воспользоваться стандартными http функциями МР, но в них есть ошибка как раз в части POST запроса. Смотри http://forum.boolean.name/showthread.php?t=5546
|
Re: Lib_socket
А можно ли этот запрос отправить именно через эту библиотеку сокетов и получить ответ сервера? http функции не катят, нужно именно через сокеты
|
Ответ: Lib_socket
ява-машина не даст подключиться по сокетам используя 80 или 443 порт.
|
Ответ: Lib_socket
А можно открыть на мобиле порт и прослушивать его в асинхронном режиме. Т.е. сделать сервер?
И ещё. Как узнать собственный IP номер на мобильном? |
Ответ: Lib_socket
В MIDP2 есть класс ServerSocketConnection. Он позволяет создать серверное соединение и ждать подключения.
У него есть метод getLocalAdress(), которая возвращает IP адрес сервера. Единственная сложность, что адрес назначается динамически и его надо сообщать клиенту каким-то образом. PS: на некоторых моделях можно адрес спросить через System.getProperty("microedition.hostname") ; |
Ответ: Lib_socket
спс за либу
|
Re: Lib_socket
Вобщем таакая проблемма, нужно коннектится к серверу, онКоннект отправить строку с логинолм и паролем, и в ответ ловить инфу.
Так вот... Работает на телефонах всех кроме НОКИА. Притом разных моделей от 3220,3230 до N80. Устанавливается GPRS соединение без проблемм с запросом все как положенно, а потом в момент когда нужно ловить данные ничего не приходит. Грешу на знак доллара. ВОбщем уже не знаю даже что и думать...Код прилагаю, помогайте люди кто могёт!!! Код:
Login := formGetText(nameField); |
Ответ: Lib_socket
Цитата:
|
Ответ: Lib_socket
Вот че я накопал: (офф. описание про мою моторолу)
Цитата:
|
Ответ: Lib_socket
ну я так и написал. много ли вы видели подписанных приложений?
а страницу сайта можно скачать с помощью HttpConnection |
Ответ: Lib_socket
Можно ли вместо socket:// использовать comm:// для подключения к com порту ? У меня не получается
|
Ответ: Lib_socket
Цитата:
|
Ответ: Lib_socket
Сколько же я нервов потратил, пока пытался заставить свой хостген (это типа программа для накрутки wap партнёрок, счётчиков, каталогов и т. п.) передать юзер агент без АНТРАСТЕДА... Ужос... Сокеты меня быстро обломали, с эмулятора работало как надо, но потом оказалось, что мобила запрещает коннект на 80 порт. Пытался каким-нибудь хитрым способом обмануть JVM, например, прописать порт 000080 :-D - разумеется не вышло. При соединении по http к юзер агенту добавляется надпись UNTRUSTED, и как я только не пытался обмануть JVM!!! :-D Например, скармливал функции (название не помню), которая добавляет http-заголовок, почти целый (!!!) http-пакет, прикиньте, РАБОТАЕТ, но всё равно UNTRUSTED добавляется к заголовку User-agent... Пытался отправить два одинаковых заголовка, вместо одного. Бесполезно... И тут меня осенило. :-D (*зловещий смех*) Если я не могу обмануть JVM, значит нужно обмануть Апач!!! И представляете, у меня получилось!!! Тестировал на локале, на сборке "Денвер". Просто пишем User_agent вместо User-agent! Апач это кушает, а JVM и понятия не имеет, что мы передаём Юзер Агент. Только перед этим нужно вписать нормальный заголовок User-agent, а то JVM его может добавить сама после нашего фейкового юзер_агента. Протестировал значит я это дело на локале - работает. Для контрольного теста решил проверить на нормальном сервере. Залил скрипт на хост (хостинг http://zavisov.net/, никому не рекомендую, раньше был нормальный хостинг, а сейчас унылое г*вно), протестил... РАБОТАЕТ!!! Кто-нибудь представляет, что такое "Минута Абсолютного Счастья"? Это было именно оно!!! Так ещё бы, ведь я только что на*бал всех, и разработчиков самого известного сервера в мире, и разработчиков платформы Java!..
Падение было резким и стремительным. Я думал, я этого не переживу. Оказалось, что работоспособность всего вышенаписанного полностью зависит то ли от настроек сервера, то ли от версии апача, я толком не понял. Как раз по иронии судьбы оказалось, что Денвер и zavisov.net были настроены именно так. Но большинство серверов не поддаются на фейковый юзер агент. Больше скажу, кроме Денвера и zavisov.net я так и не видел ни одного хостинга, который бы проглатывал это... В общем, если у кого-то после прочтения этого поста появились какие-нибудь гениальные мысли по поводу глобального обмана JVM и/или Апача, то прошу поделиться ими. А то я на хостген уже забил, так как UNTRUSTED в юзер агенте палит всё действо, и после никому деньги не выплачивают :-D , а народ, который до сих пор пользуется хостгеном, каждый день пишет мне в асю и требует, чтобы всё работало :-D Вписал в сообщение антиспам бота, что забил на ХостГен, теперь пореже пишут =) Пора переходить на Симбиан и Виндоус Мобаил, но мой Сименс С75 обидится... Всем спасибо за внимание =) |
Ответ: Lib_socket
Смешно, но для сименсов подписывать приложения проще пареной репы. Там сертификаты не защищены абсолютно ничем. Просто купи себе кабель и поставь себе программу-анлокер скрытых дисков. У самого был C75 и я его перехакал с головы до ног. Побольше бы таких телефонов. Но увы. Тебе же нужно чтоб у пользователей работало, а какой смысл от программы если она будет работать только на семёне и то инструкция по установке будет довольно длинной и расчитанной на опытного пользователя с нужным кабелем. Я уже тоже основательно обломал себе зубы на накрутке и так в итоге решения и не нашёл.
Да уж, SUN это вам не Microsoft. Уже более 15 лет прошло, а взломать до сих пор не могут. |
Ответ: Lib_socket
Цитата:
|
Ответ: Lib_socket
Сделайте пожалуйста возможность создавать сервер ( ServerSocketConnection ) и получать свой IP ( getLocalAdress() ).
|
Ответ: Lib_socket
Позволяет ли библиотека принимать строку?
|
Ответ: Lib_socket
Можно двумя способами:
1) PHP код:
PHP код:
|
Ответ: Lib_socket
парни, может кто виложит описание всех команд?
|
Ответ: Lib_socket
===
вот наткнулся в инете на небольшое описание сетевых возможностей: === Для работы с сетью в J2ME используется специальный MIDP API: Generic Connection Framework (GCF). Поддержка GCF осуществляется на уровне конфигурации. Этот набор интерфейсов расположен в пакете javax.microedition.io. GCF не ограничивается поддержкой HTTP. Возможны и другие типы соединений: HTTP | http://www.host.com: 8080 Socket | socket://host.com:80 Socket | Listener socket://:1234 -Сервер!!! на телефоне Datagram Sender datagram://host.com:9001 - UDP передача Datagram Listener datagram://: 9001 - UDP слушание... File file:/myfile.txt Comm Port comm:com0;baudrate=19200;parity=odd === Дейтаграммы Разрабатывая долгое время Java программы, Вы вполне могли не сталкиваться с понятием датаграмма. По сравнению с обычным TCP соединением, дейтаграммы позволяют более быстро передавать данные. Самым распространенным протоколом дейтаграмм является User Datagram Protocol (UDP), однако, поскольку все протоколы дейтаграмм строятся на одних и тех же базовых принципах, GCF поддерживает их непосредственно. В основе технологии дейтаграмм лежит передача данных без установки соединения. Дейтаграммы передаются в сеть "вслепую", то есть факт доставки письма адресату не проверяется. После того как сообщение отправлено, приложение уже не заботит его судьба. В случае если связь плохая, дейтаграмма вполне может не дойти до адресата. Если Вы отправляете несколько дейтаграмм, то совсем не факт, что они придут адресату в том порядке, в котором Вы их отправляли. Необходимая проверка может быть выполнена на уровне приложения. Приведенный ниже пример показывает как можно создать дейтаграмму и передать ее по указанному IP адресу. try { DatagramConnection dgc = (DatagramConnection) Connector.open("datagram://localhost:9001"); try { byte[] payload = "Test Message".getBytes(); Datagram datagram = dgc.newDatagram(payload, payload.length); dgc.send(datagram); } finally { dgc.close(); } } catch (IOException x) { x.printStackTrace(); } В примере создается дейтаграмма с текстом "Test Message", которая передается на порт 9001 локального устройства (телефон передает дейтаграмму сам себе). Это приложение будет работать правильно, даже если у вас не запущена программа, прослушивающая порт 9001, поскольку сразу после отправления приложение забывает о дейтаграмме, не требуя от адресата никакого подтверждения. Ниже приведен код приложения, получающего отправленную дейтаграмму: try { DatagramConnection dgc = (DatagramConnection) Connector.open("datagram://:9001"); try { int size = 100; Datagram datagram = dgc.newDatagram(size); dgc.receive(datagram); System.out.println( new String(datagram.getData()).trim()); } finally { dgc.close(); } } catch (IOException x){ x.printStackTrace(); } В приведенном примере устанавливается соединение с портом 9001. Предполагается, что размер дейтаграммы не может превышать 100 байт. В случае превышения лишние символы просто обрезаются. После того как дейтаграмма создана, вызывается метод receive(), который переводит поток в состояние ожидания до тех пор, пока не будет получено сообщение. После получения из дейтаграммы извлекается полезная информация и выводится на печать. Сокеты Другим распространенным типом соединения является TCP сокет-соединение. Передача данных при работе с сокетами происходит на основе подключения. Это значит, что отправитель и получатель должны установить между собой канал связи для обмена данными. Это как звонок по телефону. Если ваш друг не снял трубку, Вы не сможете передать ему информацию. Использование сокетов подразумевает гарантированную доставку данных в том порядке, в котором они были отправлены. Приведенный ниже код показывает, как организовать прослушивание порта. try { ServerSocketConnection ssc = (ServerSocketConnection) Connector.open("socket://:9002"); StreamConnection sc = null; InputStream is = null; try{ sc = ssc.acceptAndOpen(); is = sc.openInputStream(); int ch = 0; StringBuffer sb = new StringBuffer(); while ((ch = is.read()) != -1){ sb.append((char)ch); } System.out.println(sb.toString()); } finally{ ssc.close(); sc.close(); is.close(); } } catch (IOException x) { x.printStackTrace(); } В приведенном примере ServerSocketConnection открывает порт 9002. Этот тип соединения используется для единственной цели - прослушивания входящей сокет информации. После вызова метода acceptAndOpen() поток переходит в состояние ожидания. После того как соединение установлено, этот метод возвращает экземпляр класса SocketConnection. С этого момента данные можно считывать из входящего потока. Ниже приведен код, который инициализирует соединение с клиентом. try{ SocketConnection sc = (SocketConnection) Connector.open("socket://localhost:9002"); OutputStream os = null; try{ os = sc.openOutputStream(); byte[] data = "Hello from a socket!".getBytes(); os.write(data); } finally{ sc.close(); os.close(); } } catch (IOException x){ x.printStackTrace(); } SocketConnection устанавливает соединение с 9002 портом локальной машины. Если соединение успешно установлено, OutputStream записывает сообщение в исходящий поток. Обратите внимание, для передачи данных сокетам нужен канал данных. В случае если клиентское приложение не запущенно и не прослушивает порт, программа вернет ошибку. ==== вот... можно ли , на основе вышенаписанного - дополнить библиотеку сокетов... или лучше добавить ещё 3 библиотеки - по аналогии с сокетной.. 2/сокет-сервер 3/Udp-клиент 4/Udp-сервер ? === гдето читал что в Jad можно прописать автозапуск мидлет по событию.... в том числе и по УДП сигналу... |
Ответ: Lib_socket
UDP лучше не пользовать, особенно с нашим качеством связи.
Добавить ServerSocketConnection не сложно, раз уж вопрос возник, сделаю. По вопросу автозапуска библиотека уже есть. Правда думаю, что сетевые события пройдут только к подписанному приложению. |
Ответ: Lib_socket
дааа.. и если возможно - то реализовать сокет в отдельном Потоке...
и как бы чтоб оттуда выдавался статус текущего соеденения кажется сперва телефон регестрируется у оператора связи, затем уже подключается к указаному хосту... и тогда был бы вызов из сокет open(String url); которая ответила 2(идёт соеденение с сервером) st_sct()-статус сокета : (2)-идёт соеденение (1)соеденение состоялось (-1)соеденение неудачное и.. если Соеденение с оператором идёт очень долго - это определит сам пользователь в своей проге - то была б возможность - выключить Поток с прогой соеденения... чтото типа такого... может и сумбурно... :=) |
Ответ: Lib_socket
байда какаято полоучается :-(
с эмулятора с компа всё нормально - и в сети и в инете - на сервер и передаёт и получает инфу.. а с телефона... зависает на открытии сокета - минут 5 висит.. и отключается.... - кто пробовал - может чтото подделать надо? типа сперва Сайт любой по шттп открыть а уж потом сокет..???? PS - щас вот глянул прогу кепермобиле - так там сокет немного по другому открывается если в либе import javax.microedition.io.Connector; import javax.microedition.io.SocketConnection; ... public static int open(String url) { try{ c = (SocketConnection) Connector.open(url); i = c.openInputStream(); o = c.openOutputStream(); } tch(Exception ex) {return -1;} return 0; === то в кепере import java.io.DataInputStream; import java.io.DataOutputStream; import javax.microedition.io.*; ... private StreamConnection a_javax_microedition_io_StreamConnection_fld; private Thread a_java_lang_Thread_fld; private DataOutputStream a_java_io_DataOutputStream_fld; private DataInputStream a_java_io_DataInputStream_fld; ... try { a_javax_microedition_io_StreamConnection_fld = (StreamConnection)Connector.open("socket://194.67.27.110:10116"); a_java_io_DataOutputStream_fld = a_javax_microedition_io_StreamConnection_fld.openD ataOutputStream(); byte abyte0[] = s2.getBytes(); a_java_io_DataOutputStream_fld.write(abyte0); a_java_io_DataOutputStream_fld.flush(); } т.е. сокет открывается через (StreamConnection)... ==== может быть так переделать либу? (возможно будет работать с телефона) |
Ответ: Lib_socket
Не будет. StreamConnection просто родитель SocketConnection и у него нет некоторых методов последнего. Если бы дело было в этом, то не висело бы 5 минут а вылетало сразу из-за отсутствия класса SocketConnection
|
Ответ: Lib_socket
а в чём ещё может быть проблема?
другие программки - тот же мобильный кошелёк - в инет выходят... |
Ответ: Lib_socket
ЗЫ - а может всётаки проблема в реальном телефоне изза того что необходимо выполнять Соеденения в отдельном потоке?
2piligrim - глянь на статью - Многозадачность в JavaMe при HTTP соединении - http://x-coder.ru/index.php?newsid=84 может возможно библиотеку Lib_socket переделать в многопоточную? и также там реализовать анимаию??? ну типа такого :=) |
Ответ: Lib_socket
ДАА.. =) зависание на телефоне при открытии соедения - наверняка возникает изза того что Соеденение происходит в Основном потоке...
щас с помощью местной либы по многопоточности - запускал соеденение - Получилось ! :=)... правда приём данных неполучился... но на сервак Данные идут хорошо =).... --- |
Ответ: Lib_socket
Про то что сетевые и интерфейсные нити нужно разделять я знаю. Просто в МР это приходится делать через ...
Сделаю. |
Ответ: Lib_socket
2pilgrim - получилось ли реализовать сокеты в потоках?
|
Ответ: Lib_socket
:несколько моментов по использованию сокетов....
--- запускать открытие сервера в отдельном потоке... регистрация в сети и подключение к серверу происходит примерно от 25 секунд и более.. приём мессаги также занимает от 12 до 25 и более секунд... --- к примеру - я делаю игрушку - там есть регистрация клиента и получение от сервера кодов подтверждения 2 байта.... по времени подключение и передача запроса на сервер длилась около 43 секунд... а вот приём 2х байтов длился около 25 секунд.... --- затем я делал запрос на сервак о статусе игрока - передал 5 байт инфы о клиенте - в ответ ждал 20 байт... - ответ пришёл за 12 секунд... === в отдельном потоке желательно запустить анимацию - например песочные часики.... --- со стороны сервера желательно посылать первым байтом Длину передаваемого сообщения... из 20 байт переданных мне сервером я получил 3мя порциями... 1 порция в 3 байта пришла через 4 секунды 15 байт пришло через 5 секунд 2 байта через 3 секунды.... сервак написанный на Дельфях в сети АДСЛ находился на Украине... в Московском сервере отклик происходил на 1-3 секунды быстреее.... |
Ответ: Lib_socket
была такая проблемка...
если нужна либа с java.io.DataInputStream; java.io.DataOutputStream; можно взять в "основной форум - отправка e-mail pop3 (sources)" работает как в эмуляторе, так и в телефоне |
Ответ: Lib_socket
По поводу скоростей могу конечно поспорить. Если бы все обстояло так плохо, джим, агент и т.д. на телефонах никогда бы толком не заработали.
А в остальном по потокам все так и предполается сделать. |
Ответ: Lib_socket
смотрите инфу по стеку протоколов TCP/IP при отправке данных они собираются в пакеты, например мы отправили несколько маленьких блоков, а ушли они в одном пакете, т.е. реальная отправка ждет заполнения пакета или таймаута, и считать нужно пакетами
|
Ответ: Lib_socket
Я чет не понял че тут дискуссия закончилась? пол года назад? че уже ни кто этим не занимаеться? тема мне очень понравилась!!! я вот сделал сайт на php там чат есть люди общаються, хочу сделать ява чат еще для телефонов, через http соедтинение мне кажеться это не очень хорошая идея а вот через сокеты самое то, я прав? только куча вопросов, возникает. есть у кого нибудь простенький пример на пыхе( на хосте как это соединение устанавливать ). тут вообще живые есть? ))
|
Ответ: Lib_socket
Ultimat, Java не может коннектится через сокет на 80 порт! Делай по http.
|
Ответ: Lib_socket
Цитата:
(в отдельный поток только Открытие соеденения.... заранее Спасибо.. :-) |
Ответ: Lib_socket
Возможно ли открытие одновременно более одного соединения?
|
Часовой пояс GMT +4, время: 14:11. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot