Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Edward1426
1 / 1 / 0
Регистрация: 21.10.2016
Сообщений: 29
1

Сеть через Socket

16.04.2017, 14:34. Просмотров 282. Ответов 6
Метки нет (Все метки)

Есть программа (клиент), которая должна подключить к серверу, а он передаст ip других серверов и вообщем нужно иметь несколько подключений одновременно. Но возникает проблема (из AsyncTask'а не получается создать другой AsyncTask) при создании подключения к серверу => и к другим серверам. Я только начинал программировать на Java и всех особенностей не знаю, поэтому, пожалуйста, не надо оскорблять и т.д. Вообщем, помогите, пожалуйста, решить эту проблему и может быть оптимизировать программу. P.s. через socket обязательно, поэтому не надо предлагать Retrofit и т.п.

"MyApp"
Java
1
2
3
4
5
6
7
8
9
10
public class MyApp extends Application {
 
    @Override
    public void onCreate() {
        super.onCreate();
 
        // Инициализируем класс ClientSocket (Singleton)
        ClientSocket.initInstance();
    }
}
"ClientSocket"
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
80
81
82
83
class ClientSocket {
 
    private int numberOfConnections = 5;
    private final String SERVER = "192.168.1.36"; // Пока пробую в локальной сети
    private final int PORT = 8080;
    private SocketData[] sockets = new SocketData[numberOfConnections]; // Ограничение одновременных подключений
    private static ClientSocket instance;
 
    static void initInstance() {
        if (instance == null) {
            instance = new ClientSocket();
 
            // Создаем соединение с сервером
            instance.createConnection(SERVER);
        }
    }
 
    static ClientSocket getInstance() {
        return instance;
    }
 
    void createConnection(String ip){
        CreateConnection createConnection = new CreateConnection();
        createConnection.execute(ip);
    }
 
    void deleteConnection(int index){
        try{
            sockets[index].getStreamRead().cancel(false);
        } catch (Exception e){
            e.printStackTrace();
        }
        sockets[index] = null;
    }
 
    void connected(int index){
        sockets[index].setConnected(); // Подключение установленно
    }
 
    private class CreateConnection extends AsyncTask<String, Void, Void>{
 
        @Override
        protected Void doInBackground(String... params) {
            try {
                final String SERVER = params[0];
 
                // Создаем подключение
                InetAddress serverAddress = InetAddress.getByName(SERVER);
                Socket socket = new Socket(serverAddress, PORT);
 
                // Начинаем слушать соединение
                startRead(socket);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
 
        private void startRead(Socket socket){
 
            // Сохраняем данные о подключении
            for (int i = 0; i < numberOfConnections; i++){
                if (sockets[i] == null){
                    StreamRead stream = new StreamRead();
                    stream.execute(i, socket);
                    sockets[i] = new SocketData(socket, stream);
                    checkConnection(i);
                }
            }
        }
 
        private void checkConnection(int index){
            JSONObject message = new JSONObject();
            try {
                message.put("command", "ping");
                StreamWrite streamWrite = new StreamWrite();
                streamWrite.execute(message, sockets[index].getSocket());
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }
}
"StreamRead"
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
class StreamRead extends AsyncTask<Object, Void, Void> {
 
    private int index;
 
    @Override
    protected Void doInBackground(Object... params) {
        try {
            // Получаем номер подключения
            index = (int) params[0];
 
            // Получаем socket
            Socket socket = (Socket) params[1];
 
            // Создаем чтение потока
            ObjectInputStream stream = new ObjectInputStream(socket.getInputStream());
 
            // Слушаем соединение, пока не закрыли его
            while (this.isCancelled()){
                JSONObject message = (JSONObject) stream.readObject();
                if (message != null){
                    readMessage(message);
                }
            }
 
            // Освобождаем ресурсы
            socket.close();
        } catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
 
    private void readMessage(JSONObject message){
        try {
            switch (message.get("command").toString()){
                case "ping":
                    ClientSocket.getInstance().connected(index);
                    break;
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
 
    @Override
    protected void onPostExecute(Void aVoid) {
        ClientSocket.getInstance().deleteConnection(index);
    }
"StreamWrite"
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class StreamWrite extends AsyncTask<Object, Void, Void> {
 
    @Override
    protected Void doInBackground(Object... params) {
        try {
            // Json запрос
            final JSONObject message = (JSONObject) params[0];
 
            // Получаем поток для отправки
            final ObjectOutputStream stream =
                    new ObjectOutputStream(((Socket) params[1]).getOutputStream());
 
            // Отправляем
            stream.writeObject(message);
 
            // Закрываем поток отправки
            stream.close();
        } catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.04.2017, 14:34
Ответы с готовыми решениями:

Передать файл через socket или через ftp api
Посоветуйте как поступить: Есть файл на устройстве его нужно загрузить на сервер. 1 Загружать...

Подключение через Socket
Недавно начал изучать разработку под андроид и вот поставили задачу написать некий клиент, который...

Не подключается к серверу через Socket
Привет. Подключаюсь к серверу так: try { ShowMessage(&quot;try&quot;); //InetAddress ipAddress =...

Удалить не полностью переданый файл через socket
Допустим вовремя загрузки файла упало соединение и файл закачался не полностью. Как отследить что...

Socket Android Client and Java Socket Server
Доброго времени суток.Пытаюсь сделать простое клиент-серверное приложение. Клиент - приложение на...

6
vxg
Модератор
3287 / 2082 / 329
Регистрация: 13.01.2012
Сообщений: 8,107
16.04.2017, 17:34 2
Edward1426, и где ошибка? Что значит не получается?
0
Edward1426
1 / 1 / 0
Регистрация: 21.10.2016
Сообщений: 29
17.04.2017, 00:53  [ТС] 3
Я же написал у меня не запускается из AsyncTask (CreateConnection) не запускается другие AsyncTask'и (StreamRead и StreamWrite)
0
vxg
Модератор
3287 / 2082 / 329
Регистрация: 13.01.2012
Сообщений: 8,107
17.04.2017, 07:00 4
Edward1426, прямо так на экране телефона и написано "не запускаюсь я " ?
0
Edward1426
1 / 1 / 0
Регистрация: 21.10.2016
Сообщений: 29
17.04.2017, 12:55  [ТС] 5
Можете, пожалуйста, ответить в чем проблема? Я использовал Log и в LogCat проверил, что туда программа не заходит(другие AsyncTask'и), а также на сервер не пришел запрос => из AsyncTask (CreateConnection) не запускается другие AsyncTask'и (StreamRead и StreamWrite)
0
vxg
Модератор
3287 / 2082 / 329
Регистрация: 13.01.2012
Сообщений: 8,107
17.04.2017, 14:54 6
Edward1426, к сожалению у меня нет возможности запускать ваш код и искать в нем ошибку. если по логам которых в коде я не вижу вы говорите что приложение не проходит через точки входа в AsyncTask'и значит очевидно они не запускаются или по причине некой ошибки или по причине того что их не запускают - вы уверены что ЗАПУСКАЕТЕ таски и что точка входа в таску не логируется?
0
Edward1426
1 / 1 / 0
Регистрация: 21.10.2016
Сообщений: 29
17.04.2017, 15:02  [ТС] 7
Ладно, я нашел в Интернете, что второй AsyncTask не запустится, пока не завершится первый (то есть встает в очередь), поэтому я переработал немного код и у меня все заработала, а Вам спасибо, что откликнулись!
1
17.04.2017, 15:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.04.2017, 15:02

Авторизация через соц.сеть гугла
Здравствуйте! У меня проблема, уже готовый проект программы, тестируем, есть не понятная проблема...

Несколько сетей. Настроить socket на определённую сеть
Здравствуйте! Помогите пожалуйста реализовать. У меня две одинаковых камеры (goPro). Общаются с...

Невозможно создать Socket: Socket sock = new Socket(someHostString,somePortInt);
Народ! Помогите пожалуйста. Вся красота губится на exception что выскакивает в момент создания...


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

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

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