сервер клиент двусторонней связи в андроид - PullRequest
0 голосов
/ 10 сентября 2011

Я реализую этот пример

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

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

на стороне сервера, после получения сообщения от клиента, я решил добавить принтер out = new PrintWriter (client.getOutputStream (), true);

и затем в цикле while, где мы читаем ввод от клиента, внутри исполняемого кода, который я добавил просто out.println ("привет клиент");

код, похоже, не падает, так что, думаю, это хорошо. Итак, теперь я смотрю на стороне клиента. Я понимаю, что важно запускать код сокета в отдельных потоках, потому что он «блокирует». Однако клиентский код в этом примере, похоже, не использует обработчик, и мне интересно, почему. Я попытался поместить bufferedreader в код клиента, а затем опубликовать новый исполняемый файл, как это делает код сервера. Я помещаю его в тот же блок try catch, в котором у клиента есть свой принтер

 in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

                     n=in.readLine();


                    if(n!=null)
                    {
                        handler.post(new Runnable() {
                            @Override
                            public void run() {

                                fromserver.setText(n);
                            }
                        });
                        //

                    }

Что мне интересно, так это то, что когда это происходит, мой серверный код, который обычно обновляет значения счетчика клиента, которые он получил, и значения его собственного счетчика больше не обновляются. Это говорит о том, что это связано, хотя. Я запрограммировал его так, чтобы он не устанавливал свою текстовую метку, пока не получит сообщение от клиента; это должно означать, что клиент больше не отправляет сообщения. Мне интересно, что я делаю неправильно на стороне клиента.

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

Спасибо

1 Ответ

0 голосов
/ 10 сентября 2011

Примечание: мобильные сети используют NAT . NAT предотвращает инициирование входящих (интернет-соединение) соединений. Это эффективно предотвращает размещение серверов на мобильных устройствах.

Ваш подход будет работать только в локальных сетях.

...