среда, 9 мая 2012 г.

Запуск Netty\Java на android эмуляторе

Сегодня 09.05.2012.
Сегодня произошла большая радость. Мне удалось откомпилировать и запустить мой тестовый консольный клиент, написанный на Netty, на android-эмуляторе!

Суть решения:
1. Создать в проекте папку "libs" и положить в неё netty.jar (ADT автоматически подгружает папку с таким именем)
2. Добавить программе разрешение на выход в интернет. В файле AndroidManifest.xml добавить запись

<uses-permission android:name="android.permission.INTERNET" />

Просто рассказ:
Вчера я довёл до некоторого стабильного состояния классы Client и Server, основанные на Netty\Java.
А сегодня утром написал короткое консольное приложение, которое может запускаться как сервер и клиент и цепляется к порту моего компьютера.
После отладки работы клиента и сервера под управлением JVM в Windows, я приступил к созданию тестового консольного приложения для Android.
Я думал, что меня встретят трудности, когда я попытаюсь использовать Client класс в android-приложении.

Так и произошло. Но на мою радость, я нашёл решение в google за один вечер.

Суть проблемы была в том, что хотя Eclipse и добавил JAR файл в текущий android-проект, но при запуске проекта на эмуляторе - библиотеку netty.jar не попадала на андроид.

Ответ оказался простым, во что я и верил, ADT плагин Eclipse не подгружал мой netty.jar.
Оказалось, что ADT подгружает внешние *.jar библиотеки только из папки "libs".
Я создал эту папку в своём проеке, поместил туда netty.jar и...
Мой клиент написанный на Netty заработал на Android эмуляторе!


Ниже пример клиент-серверной программы. (В данном состоянии пример не будет запускаться, т.к. здесь не хватает реализации классов Client и Server).
/**
 * Пример клиент-серверной программы, написанной на Netty\Java.

 * Запуск сервера:

 * 
java -jar server.jar
* Запуск клиента: *
java -jar server.jar client
* На стороне клиента пишем сообщения и они отправляются на сервер в * пакете {@link Packet1Ping}. Сервер выводит пришедшие пакеты в стандартный поток * вывода. * * Клиент и сервер заточены для запуска с одного компьютера. * Сервер и клиент работают с localhost:8080 * @author Galiego710 * */ public class Main { public static final void out(String str) { System.out.println(str); } /** * @param args */ public static void main(String[] args) throws IOException { out("Program is started."); out("Print 'quit' or 'exit' to exit."); // запустить как клиент или сервер if ( (args.length > 0) && (args[0].equals("client"))) { ClientProgram(); } else { ServerProgram(); } out("Program is ended."); System.exit(0); } /** * Серверная часть * @throws IOException */ public static void ServerProgram() throws IOException { out("Mode: Server"); final Server server = new Server("MainServer", new InetSocketAddress("localhost",8080)); // Устанвить хук на завершение программы Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { // отключить сервер server.stop(); out("ShutdownHook done."); } }); // Установить слушателя серверу server.setListener(new ConnectorListener() { @Override public void connectionOpen(ConnectorHandler handler) { out("+++ SERVER: Client connected."); } @Override public void packetReceived(ConnectorHandler handler, Packet packet) { out("+++ SERVER: received " + packet); } }); // Запуск сервера if(!server.start()) { System.err.println("Server can't started!"); } else { System.out.println("Server is started"); } BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // Обрабатывать ввод с клавиатуры String str; do { System.out.print("Enter: "); str = br.readLine(); out("str=" + str); } while (!(str.equals("quit") || str.equals("exit"))); } /** * Клиентская часть * @throws IOException */ public static void ClientProgram() throws IOException { out("Mode: Client"); final Client client = new Client("user","pass", new InetSocketAddress("localhost",8080)); // Установить хук на закрытие программы Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { // потушить сервер client.stop(); out("ShutdownHook done."); } }); // Запустить клиента if(!client.start()) { System.err.println("Client can't started!"); } else { System.out.println("Client is started"); } BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // Обрабатывать ввода с клавиатуры String str; do { System.out.print("Enter: "); str = br.readLine(); out("str=" + str); // отправить пакет client.sendPacket(new Packet1Ping(str)); } while (!(str.equals("quit") || str.equals("exit"))); } }

Смотрите также: Netty\Java - асинхронный событийно ориентированный сетевой фреймворк

Комментариев нет:

Отправить комментарий