серверное приложение на Android

297
18 марта 2017, 00:42

Добрый день. Возникла такая проблема. Есть приложение под андроид, которое содержит MainActivity, в котором при создании запускается сервер, которые слушает определенный порт, и выполняет некоторые действия, когда на порт приходят команды. Одна из команд - запустить проигрывание видео по ссылке. При ее получении сервер получает адрес стрима, и запускает новое Активити с видеоплеером. Затем, если во время проигрывания видео нажать кнопку назад, то видеоплеер пропадает, и активной становится стартовая страница (MainActivity), однако, если потом послать на сервер команду закрытия видеоплеера, то приложение падает. Собственно вопрос, как мне грамотно организовать сервер, которые по приходу новых команд открывает нужные активити? (не только видеоплеер, есть еще проигрывание аудио и отображение файлов - тоже отдельными активити), и решить вот эту проблему с кнопкой назад.

код сервера:

public class Server {
    MainActivity activity;
    ServerSocket serverSocket;
    String message = "";
    Socket socket;
    static final int socketServerPORT = 8080;
    private final String TAG = "SERVER_LOG";
    public Server(MainActivity activity) throws IOException {
        this.activity = activity;
        Thread socketServerThread = new Thread(new SocketServerThread());
        serverSocket = new ServerSocket(socketServerPORT);
        socketServerThread.start();
    }
    public int getPort() {
        return socketServerPORT;
    }
    public void onDestroy() {
        if (serverSocket != null) {
            try {
                serverSocket.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    private class SocketServerThread extends Thread {
        @Override
        public void run() {
            try {
                socket = serverSocket.accept();
                while (true) {
                    InputStream is = socket.getInputStream();
                    byte buf[] = new byte[64*1024];
                    int r = is.read(buf);
                    final String data = new String(buf, 0, r);
                    if (data.equals("@@stop")) {
                        is.close();
                        Intent main_activity = new Intent(activity, MainActivity.class);
                        activity.finish();
                        main_activity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                        activity.startActivity(main_activity);
                        continue;
                    }
                    if (data.equals("@@stop_streaming")) {
                        Log.e(TAG, "stop command was detected");
                        continue;
                    }
                    if (data.equals("@@continue_stream")) {
                        Log.e(TAG, "continue  command was detected");
                        continue;
                    }
                    if (Pattern.matches("http://[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}:[0-9]{1,5}/[a-z,A-Z,0-9]*", data)) {
                        final String reply = new String("Successfully connected!");
                        OutputStream outputStream = socket.getOutputStream();
                        if (r > 0)
                            outputStream.write(reply.getBytes());
                        outputStream.flush();
//                        PrintStream printStream = new PrintStream(outputStream);
//                        printStream.print("kek");
//                        printStream.close();
                        activity.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                activity.msg.setText(data);
                            }
                        });
//                      SocketServerReplyThread socketServerReplyThread = new SocketServerReplyThread(
//                              socket, count);
//                      socketServerReplyThread.run();
                        final String url = new String(data);
                        Intent toFullscreen = new Intent (activity, VideoVLCActivity.class);
                        Bundle b = new Bundle();
                        b.putString("videoUrl", url);
                        toFullscreen.putExtras(b); //Put your id to your next Intent
                        activity.startActivity(toFullscreen);
                    }
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    private class SocketServerReplyThread extends Thread {
        private Socket hostThreadSocket;
        int cnt;
        SocketServerReplyThread(Socket socket, int c) {
            hostThreadSocket = socket;
            cnt = c;
        }
        @Override
        public void run() {
            OutputStream outputStream;
            String msgReply = "Hello from Server, you are #" + cnt;
            try {
                outputStream = hostThreadSocket.getOutputStream();
                PrintStream printStream = new PrintStream(outputStream);
                printStream.print(msgReply);
                printStream.close();
                message += "replayed: " + msgReply + "\n";
                activity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        activity.msg.setText(message);
                    }
                });
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                message += "Something wrong! " + e.toString() + "\n";
            }
            activity.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    activity.msg.setText(message);
                }
            });
        }
    }
    public String getIpAddress() {
        String ip = "";
        try {
            Enumeration<NetworkInterface> enumNetworkInterfaces = NetworkInterface
                    .getNetworkInterfaces();
            while (enumNetworkInterfaces.hasMoreElements()) {
                NetworkInterface networkInterface = enumNetworkInterfaces
                        .nextElement();
                Enumeration<InetAddress> enumInetAddress = networkInterface
                        .getInetAddresses();
                while (enumInetAddress.hasMoreElements()) {
                    InetAddress inetAddress = enumInetAddress
                            .nextElement();
                    if (inetAddress.isSiteLocalAddress()) {
                        ip +=  inetAddress.getHostAddress();
                    }
                }
            }
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            ip += "Something Wrong! " + e.toString() + "\n";
        }
        return ip;
    }
}
Answer 1

Ошибка возникает потому что вы сначала завершаете Activity activity.finish(), а потом через 2 строчки пытаетесть стартануть другое активити из уже завершенного activity.startActivity(). Попробуйте перенести finish после startactivity.

P.S. Хотя, по-моему, флаги, которые вы ставите в интент должны и так закрыть активити, и вызов finish() не нужен.

READ ALSO
Selenide: случайные ошибки при автотестировании

Selenide: случайные ошибки при автотестировании

Всем доброго времени суток!

290
Ошибка при работе с Tomcat:Connection refused: localhost:8080

Ошибка при работе с Tomcat:Connection refused: localhost:8080

Только начинаю разбиратьсяСкачал Tomcat, запустил его

447
Серверы приложения не видят JSP

Серверы приложения не видят JSP

С проблемой столкнулся неожиданно, так как раньше всегда конфигурировал проект тем же способом

265
Приложение с WebView на Android

Приложение с WebView на Android

Здарова ребятаМой первый раз

484