Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.89
DevExp
6 / 6 / 2
Регистрация: 27.05.2013
Сообщений: 59
#1

Socket соединение между ПК и Планшетом и передача данных - Программирование Android

07.08.2013, 11:51. Просмотров 2326. Ответов 4
Метки нет (Все метки)

Доброго времени суток!

Создаю socket соединение между ПК и планшетом:
ПК - программа сервер (программа написана на Delphi - используется компонент TServerSocket)
планшет - программа клиент

Программа сервер должна отсылать данные (текст, картинки и тд) клиенту при подключении. Реализовали так:
Delphi
1
2
3
4
5
6
7
8
9
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
var
  Size: integer;
  buf : Pointer;
begin
  Memo1.Lines.Add('Соединение установлено');
  FS := TFileStream.Create('C:\soft\1.txt', fmOpenRead);
  ServerSocket1.Socket.Connections[0].SendStream(FS);
end;
Клиентская часть:
Java
1
2
3
4
5
6
7
8
9
10
try {
    Thread thread = new Thread(new Runnable() {
        public void run() {
            socket = new Socket("127.0.0.1", 8888);
            ...
        }
    });
    thread.start();
} catch (Exception e) {
}
Соединение проходит. Ок.
А как считать данные в цикле, которые приходят на клиент порциями??
Господа, я новичок в программировании под Android, помогите дописать цикл считывания данных
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.08.2013, 11:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Socket соединение между ПК и Планшетом и передача данных (Программирование Android):

Соединение с сервером, передача данных - Программирование Android
Добрый вечер. Такой вопрос: есть некая программа - сервер, написанная на С++ Qt. Там пара вкладок на ней пара ползунков. Это набросок,...

Передача данных между активностями - Программирование Android
к примеру есть 2 активности первая public class first_act extends Activity { @Override protected void onCreate(Bundle...

Передача данных между activity - Программирование Android
Здравствуйте! Для передачи данных между Activity требуется Пользователь вводит данные в строку(текст)-где этот param...

Передача данных между Activity1 3 - Программирование Android
1. надо сделать что бы из 1 окна передать данные на 3 окно 2. если честно я не понял как пользоваться INTENT вот код: отправить ...

Передача данных между активити - Программирование Android
как сделать так чтобы при нажатии на кнопку в первом активити изменялись данные во втором активити, но без перехода в него, а переход...

Передача данных между устройствами - Программирование Android
Всем привет! Подскажите, пожалуйста, как передать значение переменной на другое устройство. Думал использовать wifi direct. Но как это...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MegaSinner
91 / 91 / 3
Регистрация: 09.04.2010
Сообщений: 746
07.08.2013, 14:13 #2
прочитай мой ответ здесь
Удачи.
DevExp
6 / 6 / 2
Регистрация: 27.05.2013
Сообщений: 59
08.08.2013, 08:57  [ТС] #3
Там по твоему коду, я так понял, считывается 1024 байта.
А если файл большой то его тоже целиком считывать? Точно не в цикле порциями нужно считывать?
GiGaBiTe911
24 / 24 / 1
Регистрация: 04.02.2013
Сообщений: 132
Записей в блоге: 1
08.08.2013, 11:55 #4
вот я так получаю данные. вначале ставлю задержку в 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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
    private void backgroundListening()
    {           
        long tS =  System.currentTimeMillis();
        try 
        {
            int len;
            inp = soc.getInputStream();
            Context context = getApplicationContext();
            incomData = new byte[0];
            boolean isReaded = false;
            boolean isDemen = false;
            boolean isSended = false;
            byteTransfered=0;
            soc.setReceiveBufferSize(Integer.MAX_VALUE);
            while(isRcvData)
            {                                           
                Log.d("DURATION_WAIT", String.valueOf(System.currentTimeMillis()-m_globalstartTime));
                isSended = false;
                byte bufin[] = new byte[1];                                                                                             
                                
                while((len=inp.read(bufin)) !=-1)               
                {
                    Log.d("DURATION_RECEIVE", String.valueOf(System.currentTimeMillis()-m_globalstartTime));                    
                    isReaded=false;                 
                    if(!isDemen)
                    {                                               
                        try {
                            listenThread.sleep(2000);
                        } catch (InterruptedException e) {                          
                            e.printStackTrace();
                        }
                        
                        incomData= new byte[inp.available()];                                           
                    }                                                               
                    
                    if(!isReaded)
                    {
                        inp.read(incomData);                                             
                        incomData= Tools.ConcatArray(incomData, bufin);                                                                         
                        isDemen = true; 
                        String ms= String.valueOf(byteTransfered)+" Available: "+ String.valueOf(inp.available());
                        Log.d("BYTE READ:", ms);
                        byteTransfered++;                       
                    }
                                        
                    if(inp.available()==0)
                    {                       
                        m_rcvMessage = new String(incomData);                       
                        handler.post(doUpdateGUI);
                        isReaded= true;
                        byteTransfered=0;
                        isDemen=false;                              
                    }
                } 
                                    
                if (inp.available()==0)
                {
                    if(isReaded)
                        isRcvData=false;
                }
            }
        } 
        catch (IOException e) 
        {           
            Log.e("IO ERROR:", e.getMessage() );
            //Toast.makeText(getApplicationContext(), "IO ERROR: "+ e.getMessage(), Toast.LENGTH_SHORT).show();
        }
        catch (Exception ex) 
        {
                    
            Log.e("IO ERROR 2:", ex.getMessage() );
            //Toast.makeText(getApplicationContext(), "IO ERROR 2: "+ ex.getMessage(), Toast.LENGTH_SHORT).show();
        }       
        long tE = System.currentTimeMillis();
        
        long resultT= tE-tS;
        
        Log.d("DURATION INCOM", String.valueOf(resultT));
        }
DevExp
6 / 6 / 2
Регистрация: 27.05.2013
Сообщений: 59
09.08.2013, 13:47  [ТС] #5
На основе Вашего кода написал вот что:

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
public int Convert4BytesToInteger(byte[] b) {    
    int MASK = 0xFF;
    int result = 0;
 
    result = b[0] & MASK;
    result = result + ((b[1] & MASK) << 8);
    result = result + ((b[2] & MASK) << 16);
    result = result + ((b[3] & MASK) << 24);
        
    return result;
}
 
protected int Recv() {
    ByteArrayOutputStream zipBAOS = new ByteArrayOutputStream();
    int iTotalBytesReceived = 0;        
        
    try {
        byte[] bLength = new byte[4];
        is.read(bLength, 0, 4); //принимаем размер архива (integer = 4 байта)       
        int iLength = Convert4BytesToInteger(bLength);
            
        if (iLength > 0) {          
            while (iTotalBytesReceived < iLength) {
                int iAvailableBytes = is.available();
                if (iAvailableBytes != 0) {
                    byte[] buffer = new byte[iAvailableBytes];      
                    is.read(buffer, 0, iAvailableBytes);
                    zipBAOS.write(buffer);                  
                    iTotalBytesReceived = iTotalBytesReceived + iAvailableBytes;
                }
            }
        }           
    } catch (Exception e) {
    }           
 
 
    try {
        InputStream zipIS = new ByteArrayInputStream(zipBAOS.toByteArray());            
        ZipInputStream ZIS = new ZipInputStream(zipIS);
            
        ZipEntry entry;     
        while ((entry = ZIS.getNextEntry()) != null) { //перебор и распаковка всех файлов в архиве
            long iFileSize = entry.getSize();
                
            System.out.println("entry: " + entry.getName() + ", " + iFileSize);  
    
            ByteArrayOutputStream unzipBAOS = new ByteArrayOutputStream();              
            byte[] buffer = new byte[1024];
                
            int len;    
            while ((len = ZIS.read(buffer)) > 0) {
                unzipBAOS.write(buffer, 0, len);
            }
            //String str = new String(unzipBAOS.toString("Cp1251"));
        }
    } catch (Exception e) {
    }
        
    return iTotalBytesReceived;
}
тут принимается поток данных (подразумевается zip архив) и сразу идёт распаковка...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2013, 13:47
Привет! Вот еще темы с ответами:

Передача данных между ListView - Программирование Android
Доброго времени суток форумчане! Не получается решить одну проблему, надеюсь на вашу помощь. В классе фрагмента есть метод onCreateView,...

Передача данных между Активити - Программирование Android
Все никак не могу разобраться, как передавать данные между активити? я до этого пользовался статическими полями, но это кажется не совсем...

Передача данных между потоками - Программирование Android
Всем доброго времени суток. В общем есть приложение, которое парсит сайт с музыкой, добавляет результат в listView и затем выводит...

Передача данных между Activity - Программирование Android
Доброго времени суток, господа. Такой вопрос: с точки зрения ООП програмирования и программирования в целом, каким образом практичнее...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.08.2013, 13:47
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru