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

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

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

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

07.08.2013, 11:51. Просмотров 2314. Ответов 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 Соединение с сервером, передача данных
Передача данных между ListView Android
Android Передача данных между потоками
Передача данных между активностями Android
Передача данных между Activity Android
Android Передача данных между Activity1 3
Передача данных между активити Android
Передача данных между устройствами Android
Передача данных между Активити Android
Android Передача данных между activity
Android Передача данных между tab Activities
Android Передача данных между tab Activities

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MegaSinner
91 / 91 / 3
Регистрация: 09.04.2010
Сообщений: 746
07.08.2013, 14:13     Socket соединение между ПК и Планшетом и передача данных #2
прочитай мой ответ здесь
Удачи.
DevExp
6 / 6 / 2
Регистрация: 27.05.2013
Сообщений: 59
08.08.2013, 08:57  [ТС]     Socket соединение между ПК и Планшетом и передача данных #3
Там по твоему коду, я так понял, считывается 1024 байта.
А если файл большой то его тоже целиком считывать? Точно не в цикле порциями нужно считывать?
GiGaBiTe911
24 / 24 / 1
Регистрация: 04.02.2013
Сообщений: 132
Записей в блоге: 1
08.08.2013, 11:55     Socket соединение между ПК и Планшетом и передача данных #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  [ТС]     Socket соединение между ПК и Планшетом и передача данных #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 архив) и сразу идёт распаковка...
Yandex
Объявления
09.08.2013, 13:47     Socket соединение между ПК и Планшетом и передача данных
Ответ Создать тему
Опции темы

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