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

Привет всем народ =)
Сделал прогу на 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
Вопрос: Перенос кода клиент/сервера на 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, ну сперва надо понять что в андроиде нельзя выполнять такую работу как передача данных, надо обязательно создать отдельный поток.
Не понятно на андроиде что будет сервер или клиент?
Вообще море мануалов в инете. Да и от студии был сэмпл с чатом.
Вопрос: SocketServer, Client. Получение ответа от сервера

Уже устал, не пойму где ошибка...

Клиент:
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
    client = null;     
                            dataOutputStream = null;
                            dataInputStream = null;
                            
                        Runnable runnable = new Runnable() {
                            public void run() {
                                try {
                                        client = new Socket(ip, Integer.parseInt(port)); 
                                        client.setSoTimeout(20); 
                                        dataOutputStream = new DataOutputStream(client.getOutputStream()); 
                                        dataInputStream = new DataInputStream(client.getInputStream()); 
                                    dataOutputStream.writeUTF("["get-server-name", ""+pass+""]");
                                    dataOutputStream.flush();
                                    
                                    ddServerAnswer = dataInputStream.readUTF();
                                    edPassAdd.post(new Runnable() {
                                            @Override
                                            public void run()
                                            {
                                                edPassAdd.setText(ddServerAnswer);
                                            }
                                        });
                                    
                                } catch (UnknownHostException e) {
                                    //e.printStackTrace();
                                    Toast.makeText(getApplicationContext(), "Ошибка: Неизвестный адрес", Toast.LENGTH_LONG).show();
                                } catch (IOException e) {
                                    e.printStackTrace();
                                    Toast.makeText(getApplicationContext(), "Ошибка: IOException", Toast.LENGTH_LONG).show();
                                }
Сервер:
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
ServerSocket ss = new ServerSocket(1111); // создаем сокет сервера и привязываем его к вышеуказанному порту
                    
                    while(true) {
                        Socket socket = ss.accept(); // заставляем сервер ждать подключений и выводим сообщение когда кто-то связался с сервером
                        // Берем входной и выходной потоки сокета, теперь можем получать и отсылать данные клиенту. 
                        InputStream sin = socket.getInputStream();
                        final OutputStream sout = socket.getOutputStream();
                        // Конвертируем потоки в другой тип, чтоб легче обрабатывать текстовые сообщения.
                        DataInputStream in = new DataInputStream(sin);
                        final DataOutputStream out = new DataOutputStream(sout);
                        
                        line = in.readUTF(); // [ожидаем пока клиент пришлет строку текста.
                        out.writeUTF(line);
                        btn1.post(new Runnable() {
                                public void run() {
                                    btn1.setText(line);
                                }
                            });
                            if (!line.equals(null)) {
                                line = null;
                                socket.close();
                                sin.close();
                                in.close();
                                out.close();
                                socket.shutdownOutput();
                            }
                    }
                } 
                catch(Exception x) { x.printStackTrace(); }
Помогите пожалуйста!!! Как вывести полученные от сервера данные? Как корректно с ними работать?

Добавлено через 1 час 4 минуты
Что, никто не знает? ;(
Ответ: Паблито, я бы логами пользовался, но... У меня с ними проблема, не всегда выводятся.
Вопрос: Xamarin developer Android. Отправка Method Post

Здравствуйте товарищи программисты, я начинаю изучать xamarin, и тут столкнулся с проблемой...
Как правильно отправить на сервер Логин и пароль?
Сервер PHP


HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 <form action="process.php" method="post">
    <input type="hidden" name="task" value="login" />
    <input type="hidden" name="return" value="" />
    <table border="0" cellpadding="0" cellspacing="10">
      <tr>
           <td align="right"><img width="79" height="34" src="http://panel.serv-host.org/templates/default/images/login.png"></td>
        <td><input type="text" name="email" class="text" size="30" value="" /></td>
      </tr>
      <tr>
        <td align="right"><img width="79" height="34" src="http://panel.serv-host.org/templates/default/images/password.png"></td>
        <td><input type="password" name="password" class="text" size="30" value="" /></td>
      </tr>
      <tr>
        <td colspan="2" align="center"><label for="rememberme"><input type="checkbox" name="rememberme" id="rememberme" /> Запомнить меня</label></td>
      </tr>
<p>&nbsp;</p></label></td>
      </tr>
      <tr>
    <td colspan="2" align="center"><input type="submit" value="войти" name=submit2 class="button" /></td>
      </tr>
    </table>
  </form>
Ответ: Согласно браузеру - он отправляет такое -
HTML5
1
?task=login&return=&email=email&password=password&submit2=%D0%B2%D0%BE%D0%B9%D1%82%D0%B8
Вопрос: Отсутствие коннекта клиент-сервер (сокеты)

Задача в следующая:
Есть код на сервере:

Java
1
2
3
4
5
6
7
8
9
        System.out.println(InetAddress.getLocalHost());
 
        ServerSocket SSock = new ServerSocket(8045);
 
        Socket CSock = SSock.accept();
        System.out.println("New one connect!");
 
        CSock.close();
        SSock.close();
И код в евенте нажатия на кнопку в Android-приложении

Java
1
2
3
4
5
6
7
8
9
          Socket CSock = null;
 
          try {
               CSock = new Socket(InetAddress.getByName("DESKTOP-34GG5QJ"), 8045); 
               // DESKTOP-34GG5QJ - имя ПК в сети
          } catch (Exception Ex) {
          } finally {
                  CSock.close();
          }
Все делается локально, т.е. доступ к ПК с Android устройства происходить должен (по крайней мере тот же код работает на ПК-устройсвах) не через глобальную сеть, потому и пишу локальное имя устройства.
Однако... ничего. Кнопка нажимается, а результатов нет - серв висит на прослушке и все. В чем может быть проблема ?
Ответ:
Сообщение от Таченко
Ни разу не встречался с методами bind и connect при работе с сокетами и классом SocketAddress
судя по ошибкам NetworkOnMainThreadException и java.lang.SecurityException это самое "ни разу" в вашем случае длится пару дней - маловато для статистики) я всю жизнь работая с сокетами в разных средах использовал bind и connect
Вопрос: Подключение android-клиента через сокет

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

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

Среди существующих тем не нашёл ответа на свой вопрос, поэтому решил задать сам.
Попытаюсь объяснить, что я имел в виду.
Пишу мобильное приложение для сбора информации с датчиков и управления устройствами.
В общем, есть мобильное приложение на Android, на ПК стоит сервер Apache+MySQL+php. Мобильное приложение обращается к php-скрипту, получает ответ.

А теперь вопрос, который не даёт мне покоя: как поступить, чтобы отслеживать изменение параметров устройств.
Вариант 1: опрашивать сервер через определённые промежутки времени. Думаю, многие понимают, что это не практично, т.к. будет сильно расходоваться заряд батареи и трафик.
Вариант 2: push notification. Схема взаимодействия, насколько я понял, там следующая: Device - Notification server(Google Cloud Messaging) - Your server. Сфера применения, как я понял, тут немного другая.
Вариант 3: использование сокетов. Я представляю, как написать простенький чат на сокетах, но как переделать своё приложение пока не представляю.

Возможно, кто-то уже с этим сталкивался и может подсказать.
Ответ:
Сообщение от zoleg
Ставим жабу, цепляемся с одного конца клиентом, с другого сервером, и получаем свой Cloud Messaging.
Можно по-подробнее, что такое "жабер"? Не "Jabber"?
Вопрос: Создание приложения для организации

Есть небольшая организация, курсы английского. Нужно создать небольшое приложение где будут регистрироваться учащиися, видеть прогресс и уведомления о уроках. Кроме того директор хочет периодически отпралять всем сообщения (поздравления, и т.д и т.п). Вопрос с чего начать, какие советы можете предложить может кто-то уже сталкивался с подобным, чтобы не наступать на одни и те же грабли. Я так понимаю придется работать с базой данных и нужен будет сервер где это все хранится. Буду рад любой помощи
Ответ: к любому веб-серверу можно подключаться кросс-платформенно
вопрос - на чем его писать
и тут ответов такая куча, что все и не переберешь
по традиции, считается, что проще всего и распространеннее всего на php
можно начать
но уже готовые решения, априори, лучше
Вопрос: Как заставить сокет клиента слушать данные с сервера постоянно?

есть такой клиент
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 используй и будет тебе счастье )... нечего батарею на устройстве садить бесконечным опросом сервера.
Вопрос: Сервер

Тест android приложения на сервере, на своем компьютере, возможно? Существуют программы, которые позволяют создать сервер на java или php на своем компьютере, с последующим обращением к нему через android устройство?
Ответ:
Если устройство, то, полагаю, в первую очередь нужен WiFi router с прямой видимостью с сервера. Т. е. чтоб устройство, подключившись к точке WiFi могло получить доступ к адресу, по которому развёрнут сервер. А сам сервер, полагаю, можно хоть в виде обычного приложения делать, лишь б оно прослушивало некоторый endpoint. И для отладки, полагаю, достаточно будет его запустить из тех ж Eclipse или IDEA, разумеется, запустив их от имени пользователя с достаточными правами доступа.