powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / Android [игнор отключен] [закрыт для гостей] / Андроид, работа с сокетами
2 сообщений из 2, страница 1 из 1
Андроид, работа с сокетами
    #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
Андроид, работа с сокетами
    #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
2 сообщений из 2, страница 1 из 1
Форумы / Android [игнор отключен] [закрыт для гостей] / Андроид, работа с сокетами
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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