Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Не работает связь сервер/клиент

Привет всем народ =)
Сделал прогу на java сервер и клиент, они работают, всё нормально запускается через командную строку клиент конектится к серверу и сервер передаёт ему данные

Сервер
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
import java.net.*;
import java.io.*;
public class Server {
    public static void main(String[] ar)    {
        int port = 6666; // случайный порт (может быть любое число от 1025 до 65535)
    try {
        ServerSocket ss = new ServerSocket(port); // создаем сокет сервера и привязываем его к вышеуказанному порту
        System.out.println("Waiting for a client...");
 
        Socket socket = ss.accept(); // заставляем сервер ждать подключений и выводим сообщение когда кто-то связался с сервером
        System.out.println("Got a client :) ... Finally, someone saw me through all the cover!");
        System.out.println();
 
        // Берем входной и выходной потоки сокета, теперь можем получать и отсылать данные клиенту.
        InputStream sin = socket.getInputStream();
        OutputStream sout = socket.getOutputStream();
        // Конвертируем потоки в другой тип, чтоб легче обрабатывать текстовые сообщения.
        DataInputStream in = new DataInputStream(sin);
        DataOutputStream out = new DataOutputStream(sout);
 
        BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));
        String dor = null;
 
 
        while (true) {
            dor = keyboard.readLine(); // ждем пока пользователь введет что-то и нажмет кнопку Enter.
            out.writeUTF(dor); // отсылаем введенную строку текста клиенту.
            out.flush(); // заставляем поток закончить передачу данных.
        }
    } catch(Exception x) { x.printStackTrace(); }
}
}
Клиент
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
import java.net.*;
import java.io.*;
enum Status {dor_close, dor_open}
 
public class Client {
    public static void main(String[] ar) {
        int serverPort = 6666; // здесь обязательно нужно указать порт к которому привязывается сервер.
        String address = "127.0.0.1"; // это IP-адрес компьютера, где исполняется наша серверная программа.
        // Здесь указан адрес того самого компьютера где будет исполняться и клиент.
 
        try {
            InetAddress ipAddress = InetAddress.getByName(address); // создаем объект который отображает вышеописанный IP-адрес.
            System.out.println("Any of you heard of a socket with IP address " + address + " and port " + serverPort + "?");
            Socket socket = new Socket(ipAddress, serverPort); // создаем сокет используя IP-адрес и порт сервера.
            System.out.println("Yes! I just got hold of the program.");
 
            // Берем входной и выходной потоки сокета, теперь можем получать и отсылать данные клиентом.
            InputStream sin = socket.getInputStream();
            OutputStream sout = socket.getOutputStream();
 
            // Конвертируем потоки в другой тип, чтоб легче обрабатывать текстовые сообщения.
            DataInputStream in = new DataInputStream(sin);
            DataOutputStream out = new DataOutputStream(sout);
 
            Status status = Status.dor_close;
            System.out.println(status);
 
            while (true) {
                String dor = in.readUTF(); // ожидаем пока сервер пришлет строку текста.
                out.flush(); // заставляем поток закончить передачу данных.
                if (Status.dor_close == status && "1".equals(dor)) {
                    status = Status.dor_open;
                    System.out.println(status);
                    continue;
                } else if (Status.dor_open == status && "0".equals(dor)) {
                    status = Status.dor_close;
                    System.out.println(status);
                    continue;
                }
            }
        } catch (Exception x) {
            x.printStackTrace();
        }
    }
}
Когда переношу в приложение код клиента, и пытаюсь запустить сервер через командную строку, а клиента через приложение, то не происходит подключение =/
может кто подскажет как правильно там нужно всё подключать ?
Клиент запускаю в эмуляторе на том же компе, что и сервер.
Ответ: и еще, вместо String address = "127.0.0.1";
надо вписать адрес компьютера на котором сервер, он 100% не 127.0.0.1
Вопрос: Синхронизация приложения и сервера

Всем привет. Пишу сервер для своего андроид приложения и возникло 2 вопроса по поводу синхронизации.

1. И так... Для примера представим что у меня на сервере (в БД) есть текстовая запись "Запись №1", и вот я с помощью приложения (при подключенном интернете) ее успешно обновил на сервере и локальной БД до "Запись №2". Пока есть интернет, то все ок. Но вот представим что у меня один аккаунт (user_id и его таблицы на сервере) используют одновременно планшет и смартфон. Также представим что у планшета и телефона в данный момент нет интернета и они пишут только в свою локальную БД, т.е на планшете запись меняем на "Запись №3", а на смартфоне "Запись №4".
Если сделать просто, то: смартфон подключился первым и обновил запись на сервере до "Запись №3", а потом планшет подключился и обновил до "Запись №4". Получается что обновления смартфона удалились. Как лучше поступать в таком случаи?? Есть идея возможности отката вручную к нужным настройкам, но пока не знаю как осуществить

2 вопрос. Как вообще лучше осуществлять синхронизацию, тоесть как клиент (приложение) будет знать что на сервере есть данные которых у него нет (имеется ввиду после подключения интернете)?? Добавлять к какдой таблице новое поле: дата последнего обновления и в самой аппе сохранять значение последней синхронизации (и если дата в записи позднее чем синхронизации, то обновить его в локальной БД приложения). Ну и стоить учитывать что гаджетов может быть несколько, т.е надо слушать клиенту сервер и серверу клиента. Может есть какие-то туториалы как лучше делать?

И вообще может у кого есть информация по синхронизации и ее принципах и реализациях, буду очень признален если поделитесь ею

Всем спасибо, всем добра
Ответ: ExFau$t, это я просто пытаюсь выдумать что там может быть, но у ТС там может быть что то реально адское
Вопрос: Перенос кода клиент/сервера на Android

Здравствуйте =)
Начал изучать андроид и возникла такая проблема, а именно перенос Java кода в код приложения
У меня есть работающий код сервера и клиента, а именно на сервере пишется с клавиатуры 1 или 0 и отправляется клиенту, клиент же выводит у себя значение статуса в зависимости от присланной переменной
1 - dor_open
0 - dor_close

Сервер
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
import java.net.*;
import java.io.*;
public class Server {
    public static void main(String[] ar)    {
        int port = 6666; // случайный порт (может быть любое число от 1025 до 65535)
        try {
            ServerSocket ss = new ServerSocket(port); // создаем сокет сервера и привязываем его к вышеуказанному порту
            System.out.println("Waiting for a client...");
 
            Socket socket = ss.accept(); // заставляем сервер ждать подключений и выводим сообщение когда кто-то связался с сервером
            System.out.println("Got a client :) ... Finally, someone saw me through all the cover!");
            System.out.println();
 
            // Берем входной и выходной потоки сокета, теперь можем получать и отсылать данные клиенту.
            InputStream sin = socket.getInputStream();
            OutputStream sout = socket.getOutputStream();
 
            // Конвертируем потоки в другой тип, чтоб легче обрабатывать текстовые сообщения.
            DataInputStream in = new DataInputStream(sin);
            DataOutputStream out = new DataOutputStream(sout);
 
            BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));
            String dor = null;
 
            while (true) {
                dor = keyboard.readLine(); // ждем пока пользователь введет что-то и нажмет кнопку Enter.
                out.writeUTF(dor); // отсылаем введенную строку текста клиенту.
                out.flush(); // заставляем поток закончить передачу данных.
            }
        } catch(Exception x) { x.printStackTrace(); }
    }
}
Клиент
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
import java.net.*;
import java.io.*;
enum Status {dor_close, dor_open}
 
public class Client {
    public static void main(String[] ar) {
        int serverPort = 6666; // здесь обязательно нужно указать порт к которому привязывается сервер.
        String address = "127.0.0.1"; // это IP-адрес компьютера, где исполняется наша серверная программа.
        // Здесь указан адрес того самого компьютера где будет исполняться и клиент.
 
        try {
            InetAddress ipAddress = InetAddress.getByName(address); // создаем объект который отображает вышеописанный IP-адрес.
            System.out.println("Any of you heard of a socket with IP address " + address + " and port " + serverPort + "?");
            Socket socket = new Socket(ipAddress, serverPort); // создаем сокет используя IP-адрес и порт сервера.
            System.out.println("Yes! I just got hold of the program.");
 
            // Берем входной и выходной потоки сокета, теперь можем получать и отсылать данные клиентом.
            InputStream sin = socket.getInputStream();
            OutputStream sout = socket.getOutputStream();
 
            // Конвертируем потоки в другой тип, чтоб легче обрабатывать текстовые сообщения.
            DataInputStream in = new DataInputStream(sin);
            DataOutputStream out = new DataOutputStream(sout);
 
            Status status = Status.dor_close;
            System.out.println(status);
 
            while (true) {
                String dor = in.readUTF(); // ожидаем пока сервер пришлет строку текста.
                out.flush(); // заставляем поток закончить передачу данных.
                if (Status.dor_close == status && "1".equals(dor)) {
                    status = Status.dor_open;
                    System.out.println(status);
                    continue;
                } else if (Status.dor_open == status && "0".equals(dor)) {
                    status = Status.dor_close;
                    System.out.println(status);
                    continue;
                }
            }
        } catch (Exception x) {
            x.printStackTrace();
        }
    }
}
Что мне нужно от андроида
Нужно перенести код в андроид приложение так, что бы устанавливалось соединение с сервером и на сервере вводилась переменная и отправлялась на приложение, а в приложении в зависимости от присланной переменной менялся цвет небольшого индикатора
0 - красный цвет
1 - зелёный цвет

Что я прошу от тебя, читатель, что бы ты помог мне с написанием приложения или помог с нужно литературой (потому что я не нашёл ничего такого :/ ) и подсказал нужное ПО, что бы там писать (пользуюсь Android Studio, может нормально )
Ответ: shavuz, ты вообще читаещь что ТС пишет??

JanCover, ну сперва надо понять что в андроиде нельзя выполнять такую работу как передача данных, надо обязательно создать отдельный поток.
Не понятно на андроиде что будет сервер или клиент?
Вообще море мануалов в инете. Да и от студии был сэмпл с чатом.
Вопрос: Клиент-серверная разработка под Android

Нужна помощь в вопросе клиент серверных приложений на java под Андроид.
Уже несколько недель потратил на поиски нужной информации в интернете но так и не нашел ответов на свои вопросы.
Прошу помогите.
Вопросы которые меня интересует:
Подробный курс или что-то подобное по тому, как же все таки сделать и клиент и сервер и как их связывать вместе. А конкретно ещё и то, где же и как правильно разместить серверную часть, интересует все, вплоть до выбора хотсинга и настройки.
Не то чтобы я не умею пользоваться поиском... Прочитал много статей но ни где не нашел подробного объяснения как это сделать. Да много информации находил, но ни где ни кто не публикует то, как он например серверную часть размещает на хостинге, как он определяет то, как его приложение найдет его сервер в интернете. Мне бы хотя бы просто строчку с текстом передать на сервер, и сохранить ее там, и когда захочу получить ее от туда на клиент. И чтобы множество разных клиентов могли подключаться. Уж по другому мне изучить это вопрос не получается
Ответ: Арендуете какой нибудь VDS, я например выбрал first (не реклама), но у них приятная wiki на все случаи жизни.
При аренде выберите ОС и конфигурацию, после завершения придёт письмо с вашим личным IP для вашего VDS.
На нём поднимаете что хотите, хоть java сервер, хоть web(можно заренее установить автоматически).

В самой java программе должен быть сервер сокет
new ServerSocket(2000);
2000 это порт

теперь чтобы подключиться из android, в android надо использовать соответственно
Java
1
2
addr = new InetSocketAddress(ip, port);
socket.connect(addr, reconnectInterval);
При этом на сервере можете в одном потоке работать пока с одним клиентом, потом или nio или по потоку на клиента, тут от кол-ва клиентов исходить и своих возможностей.

В android же обязательно отдельный поток, ну это поймёте на автомате потом.

Сейчас пока арендовать ничего не надо, работайте в локальной сети, чтобы деньги зря не тратить.
Потом когда научитесь работать дома тогда и переносите сервер в vds, а в android приложении просто в addr замените ip и всё.

И да, мы прописываем ip циферками в приложении дабы исключить проблемы с DNS различного рода.
Вопрос: Не приходит сообщение от сервера

Здравствуйте! Ситуация такова: при отправке сообщения от клиента серверу все в порядке - сообщение приходит и отображается, однако, когда добавляю в код
Java(TM) 2 Platform Standard Edition 5.0
1
2
3
dataInputStream = new DataInputStream (client.getInputStream());
                    msg1 = dataInputStream.readUTF();
                    tvRes.setText(msg1);
при отправке сообщений клиенту от сервера и серверу от клиента, они отправляются, но не отображаются.

Клиент(код, с которым перестает работать выделил, как комментарии):
Java(TM) 2 Platform Standard Edition 5.0
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
package com.example.client_1;
 
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
 
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
 
public class MainActivity extends Activity {
    
    TextView tvCon;// tvRes;
    Button btnCon;
    Socket client = null;
    int cPort = 6574;
    String  msg1;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        btnCon = (Button)findViewById(R.id.btnCon);
        //tvRes = (TextView)findViewById(R.id.tvRes);
        tvCon = (TextView)findViewById(R.id.tvCon);
        tvCon.setText("Cotrol Connect to Port:" + cPort);
        
        OnClickListener oclBtn = new OnClickListener(){
 
            @Override
            public void onClick(View v) {
                
                Thread t = new Thread (new Runnable(){
                    public void run(){
                        DataOutputStream dataOutputStream = null;
                        //DataInputStream dataInputStream = null;
                try 
                {
                    client = new Socket ("10.0.2.2", cPort);
                    dataOutputStream = new DataOutputStream (client.getOutputStream());
                    dataOutputStream.writeBytes("123 Android !@#$%^&*()_+");
                    //dataInputStream = new DataInputStream (client.getInputStream());
                    //msg1 = dataInputStream.readUTF();
                    //tvRes.setText(msg1);
 
                }
                catch (UnknownHostException e)
                {
                    tvCon.append('\n' + "Error" + e.getMessage());
                    e.printStackTrace();
                }
                catch (IOException e)
                {
                    tvCon.append('\n' + "Error" + e.getMessage());
                    e.printStackTrace();
                }
                    }
                });
                t.start();
            }
            
        };
        btnCon.setOnClickListener(oclBtn);
        
    }
 
    }
Сервер на VB6 (это условие задания - именно VB6):
Visual Basic
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
Private Sub cmdSendData_Click()
'Отправляем данные
Winsock1.SendData txtSendData.Text
'Записываем в лог чата
txtOutput.Text = txtOutput.Text & vbNewLine & "Сервер: " & txtSendData.Text
'Стираем текст
txtSendData.Text = ""
'передаем фокус ввода текстовому полю
txtSendData.SetFocus
End Sub
 
Private Sub Form_Load()
'Блокируем лог чата от ввода
txtOutput.Locked = True
'Устанавливаем размеры элементов
txtOutput.Move 0, 0, Me.Width, Me.Height * 0.6
txtSendData.Move 0, txtOutput.Height + 10, Me.Width
cmdSendData.Move 0, txtSendData.Top + txtSendData.Height, Me.Width
'Устанавливаем другие свойства
txtOutput.Text = ""
txtSendData.Text = "Введите сюда текст, чтобы отправить"
cmdSendData.Caption = "Отправить"
'Устанавливаем порт для прослушивания
Winsock1.LocalPort = 6574
'Начинаем прослушивать
Winsock1.Listen
End Sub
 
Private Sub txtSendData_KeyPress(KeyAscii As Integer)
'Если нажат Enter - отправляем данные
If KeyAscii = 13 Then cmdSendData_Click
End Sub
 
Private Sub Winsock1_Close()
'Закрываем соединение, если оно еще не закрыто
If Winsock1.State <> sckClosed Then Winsock1.Close
'Начинаем прослушивать еще раз
Winsock1.Listen
End Sub
 
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
'Останавливаем прослушивание
'(Обязательно!)
Winsock1.Close
 
'Подключаем клиента
Winsock1.Accept requestID
 
'Очищаем лог разговора
txtOutput.Text = "ЕСТЬ ПОДКЛЮЮЧЕНИЕ!!!"
End Sub
 
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim s As String
'Принимаем все данные
Winsock1.GetData s, vbString
 
'Записываем данные в лог разговора
txtOutput.Text = txtOutput.Text & vbNewLine & "Клиент: " & s
 
'Перемещаем курсор в конец лога
txtOutput.SelStart = txtOutput.SelLength
 
End Sub
 
Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
 
MsgBox Description, vbCritical
Winsock1_Close
End Sub
Ответ: Я бы сделал так, поставил бы Wireshark или подобные сетевые программы на комп с сервером и посмотрел бы что принимает и передает сервер, с Wiresharkom всегда прокатывает, основная мысль в том ,чтобы прослушать сеть и понять, что отваливается конкретно
Вопрос: Клиент-серверное приложение с чатом

Добрый вечер! Собираюсь писать многопользовательское клиент-серверное приложения для Android. Проблема в том, что я не знаю как организовать сервер, связь между приложением и сервером, как организовать чат? Так же непонятно где будет находиться этот сервер? Как создать базу данных на сервере, как обращаться к этой базе. В общем я имею очень расплывчатые представления по этому поводу. Буду благодарен любой помощи и совету.
Ответ: наверно сервер будет где-то под Вашим контролем? в большинстве случаев так делают. может стоит начать с этой точки? поднять сервер где-то, где он будет доступен всем участникам. сделать какую-то серверную логику для поддержки чата. продумать, как клиент будет с ним работать. и потом делать клиента.

ну или можно написать клиента, а потом купить серверное решение, но тут возможны сюрпризы. :-)

дайте больше деталей - ответы будут более полезны. :-)
Вопрос: Клиент Android не коннектится к Серверу пк

Клиент Android не коннектится к Серверу ПК.

Сервер:
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
import java.io.*;
import java.net.*;
 
public class Server {
 
    public static void main(String[] args) throws IOException {
        System.out.println("Welcome to Server side");
        BufferedReader in = null;
        PrintWriter    out= null;
 
        ServerSocket servers = null;
        Socket       fromclient = null;
        Socket       fromclient2 = null;
 
        // create server socket
        try {
            servers = new ServerSocket(4444);
        } catch (IOException e) {
            System.out.println("Couldn't listen to port 4444");
            System.exit(-1);
        }
 
        try {
            System.out.print("Waiting for a 1 client...");
            fromclient = servers.accept();
            System.out.println("Client connected");
            System.out.print("Waiting for a 2 client...");
            fromclient2 = servers.accept();
            System.out.println("Client connected");
        } catch (IOException e) {
            System.out.println("Can't accept");
            System.exit(-1);
        }
 
        in  = new BufferedReader(new
                InputStreamReader(fromclient.getInputStream()));
        out = new PrintWriter(fromclient2.getOutputStream(),true);
        String         input,output;
 
        System.out.println("Wait for messages");
        while ((input = in.readLine()) != null) {
            if (input.equalsIgnoreCase("exit")) break;
            out.println("S ::: "+input);
            System.out.println(input);
        }
        out.close();
        in.close();
        fromclient.close();
        servers.close();
    }
}
Клиент:
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package vershiloandrey.clientandroid;
 
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
 
import com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.common.api.GoogleApiClient;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
 
public class MainActivity extends AppCompatActivity implements Runnable{
 
    /**
     * ATTENTION: This was auto-generated to implement the App Indexing API.
     * See [url]https://g.co/AppIndexing/AndroidStudio[/url] for more information.
     */
    private GoogleApiClient client;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        setContentView(R.layout.activity_main);
 
        final Button[] buttonArray = {
                (Button) findViewById(R.id.button1),
                (Button) findViewById(R.id.button2),
                (Button) findViewById(R.id.button3),
                (Button) findViewById(R.id.button4),
                (Button) findViewById(R.id.button5),
                (Button) findViewById(R.id.button6),
                (Button) findViewById(R.id.button7)
        };
 
        int i = 0;
        final int ifinal = i;
        buttonArray[i].setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                buttonArray[ifinal].setText("o");
                try {
                    connecting();
                }catch(IOException e){
 
                }
            }
        });
 
        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See [url]https://g.co/AppIndexing/AndroidStudio[/url] for more information.
        client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
    }
 
    public void connecting() throws IOException {
 
        //System.out.println("Welcome to Client side");
        run();
    }
 
    @Override
    public void onStart() {
        super.onStart();
 
        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See [url]https://g.co/AppIndexing/AndroidStudio[/url] for more information.
        client.connect();
        Action viewAction = Action.newAction(
                Action.TYPE_VIEW, // TODO: choose an action type.
                "Main Page", // TODO: Define a title for the content shown.
                // TODO: If you have web page content that matches this app activity's content,
                // make sure this auto-generated web page URL is correct.
                // Otherwise, set the URL to null.
                Uri.parse("http://host/path"),
                // TODO: Make sure this auto-generated app URL is correct.
                Uri.parse("android-app://vershiloandrey.clientandroid/http/host/path")
        );
        AppIndex.AppIndexApi.start(client, viewAction);
    }
 
    @Override
    public void onStop() {
        super.onStop();
 
        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See [url]https://g.co/AppIndexing/AndroidStudio[/url] for more information.
        Action viewAction = Action.newAction(
                Action.TYPE_VIEW, // TODO: choose an action type.
                "Main Page", // TODO: Define a title for the content shown.
                // TODO: If you have web page content that matches this app activity's content,
                // make sure this auto-generated web page URL is correct.
                // Otherwise, set the URL to null.
                Uri.parse("http://host/path"),
                // TODO: Make sure this auto-generated app URL is correct.
                Uri.parse("android-app://vershiloandrey.clientandroid/http/host/path")
        );
        AppIndex.AppIndexApi.end(client, viewAction);
        client.disconnect();
    }
 
    public void run(){
        try {
            Socket fromserver = null;
            fromserver = new Socket("192.168.0.104", 4444);
            BufferedReader in = new BufferedReader(new InputStreamReader(fromserver.getInputStream()));
            PrintWriter out = new PrintWriter(fromserver.getOutputStream(), true);
            BufferedReader inu;
            inu = new BufferedReader(new InputStreamReader(System.in));
 
            String fuser, fserver;
 
            while ((fuser = inu.readLine()) != null) {
                out.println(fuser);
                fserver = in.readLine();
                System.out.println(fserver);
                if (fuser.equalsIgnoreCase("close")) break;
                if (fuser.equalsIgnoreCase("exit")) break;
            }
 
            out.close();
            in.close();
            inu.close();
            fromserver.close();
        }catch(IOException e){
            System.out.println("rtr");
        }
    }
}
В AndroidManifest вписал только эту строчку
Java
1
<uses-permission  android:name = "android.permission.INTERNET"  />
У меня не получается приконнектится к серверу с клиента. Похоже, дело в адресе... Но после строки
Java
1
  fromserver = new Socket("192.168.0.104", 4444);
fromsetver = null и программа завершается...
Ответ: Паблито,

манифест
XML
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
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="vershiloandrey.clientandroid" >
 
    <uses-permission  android:name = "android.permission."  />
    <uses-permission  android:name = "android.permission.ACCESS_FINE_LOCATION"  />
    <uses-permission  android:name = "android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"  />
    <uses-permission  android:name = "android.permission.ACCESS_COARSE_LOCATION"  />
    <uses-permission  android:name = "com.example.towntour.permission.MAPS_RECEIVE"  />
    <uses-permission  android:name = "android.permission.ACCESS_NETWORK_STATE"  />
    <uses-permission  android:name = "android.permission.CALL_PHONE"  />
    <uses-permission  android:name = "android.permission.READ_PHONE_STATE"  />
    <uses-permission  android:name = "com.google.android.providers.gsf.permission.READ_GSERVICES"  />
 
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >
        <activity android:name=".MainActivity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity><!-- ATTENTION: This was auto-generated to add Google Play services to your project for
     App Indexing.  See [url]https://g.co/AppIndexing/AndroidStudio[/url] for more information. -->
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
    </application>
 
</manifest>
А ошибки нет, клиент вроде коннектится, но сервер не видит его...
Вопрос: Подключение android-клиента через сокет

К осуществить соединение между андроид-клиентом и сервером посредством сокета?
Сокет требует ip-адрес и порт. Но сервер компьютера подключен к локальной сети. А вся сеть имеет один статический ip-адрес. Соответственно требуемый компьютер (сервер) имеет ip-адрес в этой локальной сети, не белый ip-адрес.
К такому адресу клиент, не находящейся в этой сети, не подключится.
Что делать? Можно ли в такой ситуации подключится к серверу?
Ответ: в инете есть +100500 мануалов как сделать проброс порта на роутере

1. клиент подключается на белый адрес, за которым сидит вся сетка
2. на роутере настраивается проброс порта (гуглить по модели роутера и словам port forwarding) на локальный ip сервера
3. PROFIT
Вопрос: Мобильный клиент интернет магазина для Android API

Здравствуйте,

Сразу скажу что ранее подобных API не создавал, поэтому не очень ориентируюсь в текущих best practice.
Собственно нужно разработать standalone клиент интернет магазина для мобильного устройства.

Требуется естественно свзязать его с сайтом. Для реализации этой задачи было выбрано реализовать REST API.
Как реализовать все запросы которые не требует авторизации, это понятно.

А вот дойдя до осуществления возникли проблемы в дальнейшей разработке, точнее не разработке, а выборе последующего направления.

Задача естественно провести защищенную авторизацию пользователя на сервере и хранить эту информацию на время работы пользователя. Собсвтенно с вебом это понятно как сделать, а по средством API возникли проблемы, точнее даже сомнения.

Существует множество standalone (не webview и мобильная версия) мобильных клиентов, для крупных и не очень интернет магазинов. Соотвественно есть какие-то общее принципы построения защинного доступа с мобильных устройств.

Естественно, смотрел различные варианты защищенных соеденений АПИ, такие как oauth,paypal api ......

Но как-то не нашел одного наиболее принятого способа авторизации. Обычно такой информации много в просторах интернета, а в данном случае очень мало информации о архитектуре построения подобных приложений и API, такое чуство что есть какой-то другой общепринятый, надежный способ это реализовать, задача ведь очень популярная.

Обычно все примеры которые я встречал сводятся к получению данных с помощью GET запросов и отправке данных с помощью POST запросов без авторизации.

Извините за много писанины.

Вопрос мой заключается в том что, хотелось бы услышать от людей имевших с этим дело, информацию о том как это принято, правильно и надежно сейчас реализуют многие магазины. ТО есть как построить взаимодействие сo standalone клиентом и сервером.

Я не прошу дать мне готовый пример, чтобы поставить свои значения и тупо использовать, хотелось бы наоборот услышать как это правильно реализовать, какие вообще общепринятые варианты решение этой задачи существуют и подобное. Может есть какая-то литература или хорошие публикации на эту тему.
Буду очень благодарен всем кто прочитает, а темболее ответит.
Спасибо заранее.
Ответ: CROSP, при авторизации сервер выдаёт какой-нибудь уникальный token, комбинацию символов достаточно длинную для хорошей уникальности. Все последующие авторизированые запросы с моб. клиента идут с этим token-ом в хэдере. Это как один из вариантов.
Вопрос: Как заставить сокет клиента слушать данные с сервера постоянно?

есть такой клиент
Java(TM) 2 Platform Standard Edition 5.0
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
 
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import java.net.UnknownHostException;
 
public class LoginActivity extends AppCompatActivity {
 
    Button buttonEnter;
    TextView textViewHeader;
    EditText editTextLogin;
    Socket client = null;
    DataOutputStream dataToServerStream = null;
    DataInputStream dataFromServerStream = null;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
 
        buttonEnter = (Button) findViewById(R.id.buttonEnter);
        textViewHeader = (TextView) findViewById(R.id.textViewHeader);
        editTextLogin = (EditText) findViewById(R.id.editTextLogin);
 
        //asyntask
        class ConnectToServer extends AsyncTask<Void, Void, Void>{
            @Override
            protected Void doInBackground(Void... voids) {
                //подключение к серверу
                try {
                    client = new Socket("193.106.169.249", 1605);
                    dataToServerStream = new DataOutputStream(client.getOutputStream());
                    dataFromServerStream = new DataInputStream(client.getInputStream());
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    System.out.println("Got an IOException: " + e.getMessage());
                }
                return null;
            }
        }
 
        ConnectToServer Connect = new ConnectToServer();
        Connect.execute();
 
 
        class GetDataFromServer extends AsyncTask<Void, Void, Void>{
 
            @Override
            protected Void doInBackground(Void... voids) {
                //чтение данных с сервера
                while (true) {
                    try {
                        String r = "";
                        byte[] readBuffer = new byte[5 * 1024];
                        int read = 0;
                        read = dataFromServerStream.read(readBuffer);
                        if (read != -1) {
                            byte[] readData = new byte[read];
                            System.arraycopy(readBuffer, 0, readData, 0, read);
                            try {
                                r = new String(readData, "UTF-8");
                            } catch (UnsupportedEncodingException e) {
                            }
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    return null;
                }
            }
        }
 
        GetDataFromServer GetData = new GetDataFromServer();
        GetData.execute();
 
 
        //обработчик нажатий
        View.OnClickListener OnClickListener = new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                switch (view.getId()){
                    case R.id.buttonEnter:
                        try {
                            //отправка данных на сервер
                            String sendText = editTextLogin.getText().toString();
                            byte[] buf = sendText.getBytes("UTF-8");
                            dataToServerStream.write(buf, 0, buf.length);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        break;
                }
            }
        };
 
        buttonEnter.setOnClickListener(OnClickListener);
    }
}
работает хорошо - подключается, по нажатию кнопки данные отправляются, но при отправки данных сервер отправляет в ответ данные, а приложение только один раз их видит, при последующих нажатия он не читает данные с сервера. скажи как исправить?
Ответ:
а если мне нужно, чтобы приложение принимало данные с сервера когда оно не запущено? это значит функцию приёма надо пихать в сервис? и вот еще что: я же положил в бесконечный цикт while приём данных, почему срабатывает всего 1 раз? или обязательна некоторая пауза, допустим sleep в 3 секунды?
GCM используй и будет тебе счастье )... нечего батарею на устройстве садить бесконечным опросом сервера.