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

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

07.08.2013, 11:51. Просмотров 2416. Ответов 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, помогите дописать цикл считывания данных
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.08.2013, 11:51
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Socket соединение между ПК и Планшетом и передача данных (Программирование Android):

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

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

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

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

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

Передача данных между активностями
к примеру есть 2 активности первая public class first_act extends Activity {...

4
MegaSinner
96 / 92 / 9
Регистрация: 09.04.2010
Сообщений: 746
07.08.2013, 14:13 #2
прочитай мой ответ здесь
Удачи.
1
DevExp
6 / 6 / 2
Регистрация: 27.05.2013
Сообщений: 59
08.08.2013, 08:57  [ТС] #3
Там по твоему коду, я так понял, считывается 1024 байта.
А если файл большой то его тоже целиком считывать? Точно не в цикле порциями нужно считывать?
0
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));
        }
1
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 архив) и сразу идёт распаковка...
0
09.08.2013, 13:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2013, 13:47
Привет! Вот еще темы с решениями:

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

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

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

Передача данных между activity
Здравствуйте! Для передачи данных между Activity требуется Пользователь...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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