Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Android socket — задача при отправке данных. Отчего данные шлются только позже закрытия исходящего потока сокета?

Anna | 5.06.2014 | нет комментариев

Пишу клиентское приложение под андроид. Отправление запросов на сервер и приобретение результатов с сервера. Соединение с сервером через сокеты.

Столкнулся с такой загвоздкой: данные отсылаются только позже закрытия выходящего потока сокета. Опишу обстановку: есть Asynctask, в котором должно быть открыто ТОЛЬКО ОДНО соединение с сервером. Но у меня не получается это реализовать. Получается сделать только по такой схеме: открыл соединение, отправил данные, принял данные, закрыл соединение. Потому что без закрытия соединения не отсылаются данные на сервер.

Привожу класс AsyncTask:

class InternetRequestAsyncTask extends AsyncTask<String, Integer, String>
    {
        private Socket socket = null;
        private DataOutputStream outStream = null;
        private BufferedReader in;
        private String ip, port;
        final String GPS_MESSAGE = "GPS_MESSAGE";
        final String LOGIN_REQUEST = "LOGIN_REQUEST";
        final String LIST_REQUEST = "LIST_REQUEST";
        private String command = "";

        public InternetRequestAsyncTask(String IP, String PORT) 
        {
            ip = IP;
            port = PORT;
        }

        private void setCommandType(String commandType)
        {
            command = commandType;
        }

        private void connect()
        {
            try {
                socket = new Socket(ip, Integer.parseInt(port));
                socket.setKeepAlive(true);

                in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                outStream = new DataOutputStream(socket.getOutputStream());

            } catch (NumberFormatException e) {
                e.printStackTrace();
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            Log.d("MyTag", "Connected");
        }

        private void disconnect()
        {
            if (socket != null)
            {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (outStream != null)
            {
                try {
                    outStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            Log.d("MyTag", "Disconnected");
        }

        private void writeMessage(String message) throws IOException
        {            
            outStream.writeBytes(message   "rn");
        }

        @Override
        protected String doInBackground(String... params) 
        {        
            this.connect();

            while (true)
            {
                if (command.equals(GPS_MESSAGE))
                {

                    try {
                        this.writeMessage(GPS_MESSAGE);
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                    command = "";

                } else
                {
                    if (command.equals(LOGIN_REQUEST))
                    {

                        try {
                            this.writeMessage(LOGIN_REQUEST);

                            StringBuilder sb = new StringBuilder();
                            String str;

                            while ((str = in.readLine()) != null)
                            {
                                sb.append(str);
                            }
                            Log.d("MyTag", sb.toString());

                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                        command = "";

                    } else
                    {
                        if (command.equals(LIST_REQUEST))
                        {

                            try {
                                this.writeMessage(LIST_REQUEST);

                                StringBuilder sb = new StringBuilder();
                                String str;

                                while ((str = in.readLine()) != null)
                                {
                                    sb.append(str);
                                }
                                Log.d("MyTag", sb.toString());
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }

                            command = "";

                        } else
                        {
                            if (command.equals("EXIT"))
                            {
                                break;
                            }
                        }
                    }
                }
            }

            return null;
        }

        @Override
        protected void onPostExecute(String result) 
        {
            this.disconnect();

            super.onPostExecute(result);
        }

        @Override
        protected void onCancelled() 
        {
            this.disconnect();

            super.onCancelled();
        }
    }

использую так:

InternetRequestAsyncTask irat = new InternetRequestAsyncTask(IP, PORT);
irat.execute();

и по нажатию на кнопки передаю надобные команды:

irat.setCommandType(commandType);

в таком виде код (когда connect() вызывается только один раз, а disconnect() по окончанию работы потока) сообщение на сервер шлется только один раз.

Помогите разобраться. Необходимо открыть ОДНО соединение в AsyncTask и многоразово применять его для отправки/приема сообщений.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB