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

Клиент-серверная архитектура на основе сокетов - Android

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
Shuklin Sergey
6 / 6 / 4
Регистрация: 03.05.2013
Сообщений: 97
22.05.2013, 04:39     Клиент-серверная архитектура на основе сокетов #1
Есть такой код клиента под андроид. Сервер написан на си++. Подключаю ноут и телефон в одну сеть. Сервер работает точто правильно, но возникает вопрос, все ли правильно с клиентом - андроидом?

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
package com.example.client_servercpp_android;
 
import java.io.BufferedReader;
import java.io.PrintWriter;
import java.net.Socket;
//import java.util.Scanner;
 
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
 
//Цей код корисного нічого робити не повинен. Ми просто відкриваємо з'єднання з иншим пристроє.
//Як нам у мережі (чи це интерьнет, чи локальна - це однакового) розрізняти, куди надсилати инхвормацію? 
public class MainActivity extends Activity {
      /** Called when the activity is first created. */
        Socket jSocket = null;
 
//Це робиться за ipAddress та port'ом. Айпі-адреса означає пристрій, з яким ведеться обмін.  
        private final String ipAddress = "192.168.43.74";
 
//А кожен пристрій, комп наприклад, то він хоче одночасно і скай тримати,
//і оновлення завантажувати, і сайт розкривати - тобто аби під'єднання кожного разу
//не переривати з'єднання встановлються більш-менш постійні з'єднання,
//і аби вони їх розрізняти ми для кожного з'єднання маємо своє віртуальне таке гніздо, це називають "порт".
//Тобто як до міста може бути прибито багато кораблів, у кожного гнізді-порті по кораблю. Їх наприклад, від 1 до 65535 (приблизно).
       private final int port =1234;
 
//Через цей потік ми пишемо инхвормацію
        PrintWriter out = null;
 
//Через цей читаємо 
        BufferedReader inFromServer;
        String inTxt;
 
        @Override
        public void onCreate(Bundle savedInstanceState) { 
            super.onCreate(savedInstanceState);
// Встановлюємо потрібну нам розмітку вікна
            setContentView(R.layout.activity_main); 
 
            try
            {
//Створюємо з'єднання (сокет - в перекладі "різетка") на певний пристрій, до певного порту.
                jSocket = new Socket(ipAddress, port);
                
                
                Log.v("Here", "good");
            }
            catch(Exception ee)
            {
                Log.v("Here", "bad");
            }
//Далі було б логічно бачити якесь писання в мережу, але поки цього бачу, нема. 
        }
    }
а именно, есть подозрения, что в 44 строке телефон создает сокет, но ничего с ним не делает! правильно я понимаю систему? созданый сокет еще нужно отправить на попытку подключения...?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.05.2013, 04:39     Клиент-серверная архитектура на основе сокетов
Посмотрите здесь:

Архитектура приложения ирк-клиент для андроид Android
Android Архитектура приложения
Архитектура клиент серверного приложения Android
Android Архитектура приложений
Android Ошибка сокетов: D/AndroidRuntime: Shutting down VM
Серверная часть для Android приложения. Куда смотреть Android
Есть ли книга где хорошо описывается создание сокетов? Android
Android Серверная часть мобильных приложений
Android Серверная часть приложения
Программирование сокетов Android
Архитектура приложения Android
Android Архитектура клиент-серверного приложения с off-line режимом

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
GiGaBiTe911
24 / 24 / 1
Регистрация: 04.02.2013
Сообщений: 132
Записей в блоге: 1
22.05.2013, 10:36     Клиент-серверная архитектура на основе сокетов #2
Если я правильно помню, то при таком создании сокета он подключаеЦа сразу. но вообще у сокета есть метод коннект и я предпочитаю делать иначе:
Java
1
2
3
4
Socket soc = new Socket(); // создаем новый сокет
soc.bind(null); // биндим его на определенный порт устройства (null - биндиЦа автоматически на любой свободный порт)
soc.connect(new InetSocketAddress(m_host, m_port),5000); // подключаем передавая адрес, порт и таймаут в мс.
soc.setKeepAlive(true); // указываем сокету существовать вечно, чтобы система не закрыла его при простое
spydark91
84 / 84 / 2
Регистрация: 03.03.2011
Сообщений: 1,872
23.05.2013, 22:59     Клиент-серверная архитектура на основе сокетов #3
а как принимать сообщения от сервера? в вечном цикле?
V0v1k
1157 / 981 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
23.05.2013, 23:04     Клиент-серверная архитектура на основе сокетов #4
spydark91, возможно это то, что вам нужно - Google Cloud Messaging for Android
spydark91
84 / 84 / 2
Регистрация: 03.03.2011
Сообщений: 1,872
23.05.2013, 23:16     Клиент-серверная архитектура на основе сокетов #5
полезная ссылка, но я о чистых сокетах, без вмешательства гугла
GiGaBiTe911
24 / 24 / 1
Регистрация: 04.02.2013
Сообщений: 132
Записей в блоге: 1
24.05.2013, 11:09     Клиент-серверная архитектура на основе сокетов #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
не совсем в вечном цикле, но вы почти угадали. нужно запустить отдельный поток и в нем слушать созданный сокет. примерно вот так:
Java
1
2
3
4
5
6
private void CreateThread()
{
        // создаем новый поток и в него передаем объект Runnable для обработки этого потока
    listenThread = new Thread(null, doBackgroundListening,"BackgroundListen");                                                                                                          
    listenThread.start();
}
объект Runnable для обработки
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private Runnable doBackgroundListening = new Runnable() 
{
    @Override
    public void run() 
    {
        if(Connect()) // здесь создаем сокет и подключаемся
        {               
            isSterted = true;       
            isRcvData= true;
            handler.post(doUpdateGUIonStartSucces); // для обновления UI из этого потока
            backgroundListening();  // собственно вызываем метод в котором создаем и слушаем сокет          
        }
        else
        {
            isSterted=false;
            handler.post(doUpdateGUIonStartError);
        }
    }
};
метод в котором создаем и слушаем сокет
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
private void backgroundListening()
    {                       
        try 
        {
            int len;
            inp = soc.getInputStream();
            Context context = getApplicationContext();
            incomData = new byte[0];
            boolean isReaded = false;           
            byteTransfered=0;
            soc.setReceiveBufferSize(Integer.MAX_VALUE);
            while(isRcvData)
            {                                                               
                byte bufin[] = new byte[1];                                                                                             
                                
                while((len=inp.read(bufin)) !=-1)               
                {                                                                                                   
                    // здесь читаем данные из буфера                                                    
                }                               
            }
        } 
        catch (IOException e) 
        {           
            Log.e("IO ERROR:", e.getMessage() );        
        }
        catch (Exception ex) 
        {                   
            Log.e("IO ERROR 2:", ex.getMessage() );         
        }       
        
    }
метод в котором создаем сокет и подключаемся
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
private boolean Connect()
    {
        boolean isConnected = false;
        try
        {                                                   
            soc = new Socket();
            soc.bind(null);
            
            soc.connect(new InetSocketAddress(m_host, m_port),5000);            
            soc.setKeepAlive(true);                     
            isConnected = true;                         
            
        }
        catch(NumberFormatException ex)
        {           
            Log.e("CONNECT ERROR - NumForm",ex.getMessage());       
        }
        catch(SocketTimeoutException ex)
        {
            Log.e("CONNECT ERROR - SockTimeOut",ex.getMessage());
        }
        catch(Exception ex)
        {           
            Log.e("CONNECT ERROR - Uncnown",ex.getMessage());
        }       
        
        return isConnected;
    }
Yandex
Объявления
24.05.2013, 11:09     Клиент-серверная архитектура на основе сокетов
Ответ Создать тему
Опции темы

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