Гость
Форумы / Android [игнор отключен] [закрыт для гостей] / Андроид, работа с сокетами / 2 сообщений из 2, страница 1 из 1
04.08.2015, 12:48
    #39022494
VaneS Ri_lax
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Андроид, работа с сокетами
Здравствуйте, реализовываю клиент серверное приложение.
Делаю все по примеру тут
Но почему то если с сервера передавать данные размером 150килобайт, данные не передаются до конца клиенту, но зато почему то в android studio в консоле атладки появляется возможность вводить данные с клавиатуры, в чем может быть причина?

1 данные которые пришли не полностью.
2 символы вводил с клавиатуры
Вот код клиента:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
import android.os.AsyncTask;
import android.util.Log;

import java.net.Socket;

public class Client {

    public static String command;
    AsyncClient asyncClient;

    public void setCommand(String command) {
        this.command = command;
        asyncClient = new AsyncClient();
        asyncClient.execute();
    }

    ////////////////////////////////////////////////////////
    class AsyncClient extends AsyncTask<Void, Void, Void> {

        Socket s;

        @Override
        protected void onPreExecute(){
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(Void... params) {
            try {
                s = new Socket("172.16.16.11",1122);
                //String msg = "hi server";
                s.getOutputStream().write(command.getBytes()); //посылаем команду на сервер
                byte[] buf = new byte[64*1024];
                int r = s.getInputStream().read(buf);
                String data = new String(buf,0,r); //строка от сервера

                Log.d("test", "Сообщение сервера: " + data);

                buf = new byte[500*1024];
                s.getOutputStream().write("ok".getBytes()); //говорим серверу что подтверждение полученно

                r = s.getInputStream().read(buf);
                //r = s.getInputStream().read();
                String xml = new String(buf,0,r); // принимаем большие данные
                Log.d("test",xml);


                s.close();
                s = null;
            }catch (Exception e){
                Log.d("test","Произошла ошибка: "+e);
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void resuld){
            super.onPostExecute(resuld);
        }
    }
}


Заранее большое спасибо!
...
Рейтинг: 0 / 0
04.08.2015, 15:44
    #39022690
irbis_al
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Андроид, работа с сокетами
VaneS Ri_lax,

Ну вы взяли примитивный пример.
Надо не забывать ,что пакеты в сокет приходят асинхронно,а не сразу всё...
Поэтому надо в цикле обрабатывать
Пока есть данные читаем(пишем) в буфер

Код: java
1.
2.
3.
4.
5.
 while ((count = bis.read(buffer, 0, buffer.length)) != -1) {
                            total += count;
                            dos.write(buffer, 0, count);
                            dos.flush();
                        }


Вот на этом форму кто-то выкладывал клиен серверю
http://www.sql.ru/forum/1151147/klient-server-porugayte-kod-servera

А иногда может решить вопрос
после
server.accept()
(Кствти в вашем примере этого ,что ниже нельзя сделать)


Надо сделать Thread.currentthread.sleep(1000 или больше секунд...и тогда "пока спим" данные дотянутся.)
...
Рейтинг: 0 / 0
Форумы / Android [игнор отключен] [закрыт для гостей] / Андроид, работа с сокетами / 2 сообщений из 2, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]