Как получить данные в / из сокета в потоке? - PullRequest
9 голосов
/ 05 декабря 2010

Android нуб здесь.Я учусь лучше всего, увидев исходный код функционального примера, но мне не удалось найти простой, но полный пример использования сокета в его собственном потоке.

У меня есть служба Android, которая нуждается вобщаться с интернетом.Я хочу открыть сокет TCP, который подключается к серверу в Интернете.Служба должна отправлять данные в Интернет, а данные, возвращающиеся из сети, должны поступать в службу.Поскольку служба также выполняет другие функции, соединение с сокетом должно жить в своем собственном потоке.

Есть идеи, где я мог бы найти пример сокета в потоке с обменом данными в / из сокета?

Спасибо

enter image description here

Ответы [ 2 ]

15 голосов
/ 24 февраля 2011

Вам просто нужно создать асинхронную задачу, которая взаимодействует в фоновом режиме, а затем обновляет поток пользовательского интерфейса по мере необходимости.Вот фоновый поток, чтобы получить информацию из сокета и обновить текстовое представление с количеством байтов, которые он получает

  public class InternetTask extends AsyncTask<Void, Integer, Void> {

    private WeakReference<TextView> mUpdateView;

    public LoginTask(TextView view) {
        this.mUpdateView = new WeakReference<TextView>(view);
    }

    @Override
    protected Void doInBackground() {

        try {
            Socket socket = new Socket("127.0.0.1", 80);
                    InputStream is = socket.getInputStream();

                    byte[] buffer = new byte[25];
                    int read = is.read(buffer);
                    while(read != -1){
                         publishProgress(read);
                         read = is.read(buffer);
                    }

                    is.close();
                    socket.close();



        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        if(mUpdateView.get() != null && values.length > 0){
                     mUpdateView.get().setText(values[0].toString());
                }
    }

}

А вот как вы можете запустить этот поток

public class TestTab extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.someLayout);

            TextView textView = (TextView)findViewById(R.id.someid);
            InternetTask task = new InternetTask(textView);
            task.execute();

    }
}
8 голосов
/ 05 декабря 2010

Вот длинный блог на эту тему, в котором показаны как серверная, так и клиентская части, а связь через сокет проходит через отдельный поток.

http://thinkandroid.wordpress.com/2010/03/27/incorporating-socket-programming-into-your-applications/

Следует помнить одну вещь: если вы передаете int s, вы можете столкнуться с проблемой порядка следования байтов, поэтому просто проведите некоторое тестирование, и я бы посоветовал вам убедиться, что сервер отправляет в формате, который Android нужен, если у вас есть серверы на более чем одной ОС.

Для простоты, на Android, чтобы найти порядок байтов, вы можете использовать это: http://developer.android.com/reference/java/nio/ByteOrder.html

Согласно этой статье, порядок байтов может быть изменен для оптимизации: http://en.wikipedia.org/wiki/Dalvik_(software)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...