JavaME, Реализация одноранговой связи - PullRequest
1 голос
/ 07 января 2010

У меня есть 4 телефона, подключенных к точке доступа Wi-Fi, и я знаю MAC / IP всех этих, включая точку доступа Wi-Fi.

Мне нужно реализовать связь между каждым из этих телефонов, что-то вроде одноранговой связи, я думал об использовании сокетов, но тогда на каждом телефоне придется устанавливать ServerSocket и Socket на каждом из телефонов, это нормально?

IP-адреса этих телефонов будут находиться в частном диапазоне 192.168 .... поэтому я мог бы использовать что-то вроде http://192.168.xx.xx/port и связаться с любым телефоном, используя http? Какие классы я мог бы использовать для реализации этого, или есть готовый каркас, который я мог бы использовать напрямую?

1 Ответ

2 голосов
/ 07 января 2010

То, что вы планируете, просто прекрасно: телефоны могут прослушивать и сокеты.Если вы просто хотите иметь одноранговую связь и больше заинтересованы в приложении, которое вы пишете, вы, возможно, захотите взглянуть на JXTA , который является несколько популярной P2P-системой для Java.Я не знаю этого, и я слышал некоторые плохие вещи о его производительности, но для вашего приложения это могло бы подойти.

Но не так уж и сложно накатить свою собственную.Тем не менее, я не видел каких-либо HTTP серверных библиотек для Java ME, поэтому использование HTTP может оказаться более трудоемким, чем необходимо.Возможно, я бы просто реализовал пользовательский протокол через сокеты TCP, поскольку он, по-видимому, не должен был бы взаимодействовать с чем-либо уже существующим.javax.microedition.io, и со стороны клиента это похоже на использование HTTP-соединений, то есть что-то вроде

String url = "socket://192.168.xxx.xxx:12345";
SocketConnection conn = (SocketConnection) Connector.open(url);

И тогда вы можете получить InputStream и OutputStream для соединения с этого, илиDataInputStream и DataOutputStream, если вы хотите отправить двоичные данные.

На стороне сервера вы должны сделать

String url = "socket://:12345";
ServerSocketConnection sock = (ServerSocketConnection) Connector.open(url);
SocketConnection conn = (SocketConnection) sock.acceptAndOpen();

acceptAndOpen блокируется до установления соединения, так что есливажно, чтобы сервер делал что-то еще, убедитесь, что принятие соединения в его собственном потоке.

Предупреждение: когда я делал это несколько лет назад, я обнаружил, что просто слушаюрозетка не включает сеть на всех телефонах, поэтому, несмотря на то, что сервер начал слушать, к нему не удалось подключиться, потому чтов сети.Я обошел его так, чтобы открыть веб-браузер на телефоне, но достаточно открыть любой сокет для любого клиента, так что вы также можете сделать это из приложения, попытавшись открыть клиентское соединение.

Тамтакже называется Push Registry.Когда вы создаете свой Midlet, есть возможность зарегистрировать приложение с атрибутом MIDlet-Push в файле JAD, так что вам не нужно запускать ваше приложение, но система разбудит его при попытке подключенияопределенный порт.На самом деле я никогда не реализовывал это, поэтому не могу дать больше советов по этому поводу.

...