Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
18 / 13 / 5
Регистрация: 08.01.2016
Сообщений: 315

Нужен прокомментированный код простого клиент-серверного приложения

14.01.2017, 15:52. Показов 2370. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Народ, я буду очень благодарен за помощь. Только начал изучать Java в рамках мобильных приложений и после изучения элементарных вещей зашел в тупик. Не могу найти прокомментированный код клиента, подключающегося к серверу. В смысле, и здесь, и в Инете их куча - но половина не работает (точнее с ошибками написаны), а другая половина слишком сложная для меня (реализованы многопоточность, файлы передаются и т.д.). Помогите, пожалуйста, - мне нужен кусочек кода (прокомментированный специально для чайника - ваще улет будет ), который бы подключался (со смартфона) к серверу 127.0.0.1 к 5000 порту и передал сообщение "Hellow Word" не принимая ничего обратно, а дальше я постараюсь сам разобраться.
Парни, заранее спасибо...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.01.2017, 15:52
Ответы с готовыми решениями:

Написание клиент-серверного приложения
Доброго времени дня! Передо мной встала задача разработки клиент-серверного приложения под андроид. До этого писал только дэсктоп и поэтому...

Архитектура клиент серверного приложения
Добрый день. Возникла идея проекта, но как реализовать его я не представляю. Есть клиентское андроид приложение, в котором присутствует...

Архитектура клиент-серверного приложения с off-line режимом
Доброго дня. Столкнулся со следующим вопросом на тестировании: Создаётся Android-приложение, работающее с данными на сервере. В...

28
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
15.01.2017, 08:21
Elkatib, Отсутствие коннекта клиент-сервер (сокеты)
1
18 / 13 / 5
Регистрация: 08.01.2016
Сообщений: 315
16.01.2017, 05:48  [ТС]
vxg, спасибо большое за пример, но, млин, мне даже в нем сложно разобраться. По указанному Вами примеру клиента, пытался передать сообщение серверу (реализован на vb.net), но естественно у меня ничего не получилось. Вот, что я поначертил((((( P.S. Помогите разобраться, пожалуйста...

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
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
 
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
 
public class GiroActivity extends AppCompatActivity {
 
    private Button Knopka_Soedinenie;
 
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_giro);
 
 
        Knopka_Soedinenie = (Button) findViewById(R.id.button);
        Knopka_Soedinenie.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
 
                new Thread(new Runnable() {
                    @Override
                    public void run() {
 
                        Socket CSock;
                        SocketAddress SockAddr;
                        
                        SockAddr = new InetSocketAddress("127.0.0.1", 5000);
                        CSock = new Socket();
 
 
                        try {
                            
                            CSock.connect(SockAddr,0);
                            ObjectOutputStream oos = new ObjectOutputStream(CSock.getOutputStream());
                            oos.writeObject("Hellow Word");
                            if (!CSock.isConnected())
                                throw new IOException();
                            CSock.close();
                        } catch (IOException IOEx) {
                            return;
                        }
                    }
                }).start();
 
            }
        });
    }
}
0
30 / 30 / 5
Регистрация: 21.03.2013
Сообщений: 381
16.01.2017, 07:21
Elkatib,
Цитата Сообщение от Elkatib Посмотреть сообщение
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Override
* * * * * * public void onClick(View view) {
new Thread(new Runnable() {//создаем поток для работы с интернетом (в андроиде с интернетом только через поток 
//происходит)
* * * * * * * * * * @Override
* * * * * * * * * * public void run() {
Socket CSock;//сам сокет (просто забей в гугле "что такое сокет" это важно знать)
* * * * * * * * * * * * SocketAddress SockAddr;//куда конектимся ip & port
SockAddr = new InetSocketAddress("127.0.0.1", 5000);
* * * * * * * * * * * * CSock = new Socket();
try {
CSock.connect(SockAddr,0);//connect создает соединение по сокету
* * * * * * * * * * * * * * ObjectOutputStream oos = new ObjectOutputStream(CSock.getOutputStream());// выходной поток //(почитай что такое OutputStream) через него передаем данные клиенту
* * * * * * * * * * * * * * oos.writeObject("Hellow Word");//пишем строку через выходной поток серверу
* * * * * * * * * * * * * * if (!CSock.isConnected())
* * * * * * * * * * * * * * * * throw new IOException();
* * * * * * * * * * * * * * CSock.close();//закрываем сокет
* * * * * * * * * * * * } catch (IOException IOEx) {
* * * * * * * * * * * * * * return;
* * * * * * * * * * * * }
* * * * * * * * * * }
* * * * * * * * }).start();//запускаем thread на выполнение
+ почитать что такое клиент сервер архитектура
2
18 / 13 / 5
Регистрация: 08.01.2016
Сообщений: 315
16.01.2017, 12:33  [ТС]
powowstal, так это рабочий пример, который Вы прокомментировали? Просто у меня почему-то он не работает.
P.S. Спасибо за комментирование!!! Многое стало понятно в плане структуры приложения - как это должно выглядеть.
0
30 / 30 / 5
Регистрация: 21.03.2013
Сообщений: 381
16.01.2017, 14:11
Elkatib, советую поменять
Цитата Сообщение от Elkatib Посмотреть сообщение
ObjectOutputStream oos = new ObjectOutputStream(CSock.getOutputStream ());
* * * * * * * * * * * * * * oos.writeObject("Hellow Word");
на
Java
1
2
 DataOutputStream oos = new DataOutputStream(new BufferedOutputStream(CSock.getOutputStream()));
                            oos.writeUTF("Hellow Word");
И проверить разрешение на интернет в файле манифеста. В первой ссылке это описывалось.
И проверить ip и порт которые использует сервер, они должны быть одинаковы как на клиенте так и на сервере.
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
16.01.2017, 14:34
127.0.0.1 это localhost, там должен стоять IP адрес сервера
0
18 / 13 / 5
Регистрация: 08.01.2016
Сообщений: 315
16.01.2017, 16:42  [ТС]
powowstal, не могу понять в чем дело. Код вроде рабочий. Но и сервер работает нормально (использует winsock (MSWINSCK.OCX). По крайней мере могу подключиться к компьютеру с сервером через телефон, используя приложение TelNet, и отправить текстовое сообщение. А через этот код не получается (использую эмулятор с ip 127.0.0.1, и физическое устройство тогда в программе указываю реальный АйПи. В чем может быть причина? Помогите, очень прошу...
P.S. Может подскажите какой-нить готовый сервер (приложение), чтобы я смог проверить свой код.
0
30 / 30 / 5
Регистрация: 21.03.2013
Сообщений: 381
16.01.2017, 17:57
Elkatib, желательно код сервера посмотреть.
0
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
16.01.2017, 17:58
Elkatib, у меня Денвер стоит на машине в локальной сети доступной через wifi
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
16.01.2017, 18:04
я еще разок повторю, медленно - без разницы на чем стартует клиент, на эмуляторе или на телефоне, надо указывать адрес сервера
а) если это локальная сеть то серый ip
б) если удаленный комп то его реальный ip и там делать проброс порта

и в обеих случаях адрес сервера гарантировано будет не 127.0.0.1
0
18 / 13 / 5
Регистрация: 08.01.2016
Сообщений: 315
16.01.2017, 18:10  [ТС]
Паблито, я понял Вас. Я так и сделал. Последний раз я вообще установил программу на телефон, включил мобильную сеть, и пытался передать данные серверу, указав его ip(он белый). Не получилось(((
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
16.01.2017, 18:14
сервер наверное стоит в какой-то локальной сети и перед ним роутер с NAT-ом
тогда, как я и написал, надо настраивать на роутере проброс порта

кроме этого, на сервере на время теста надо бы потушить firewall потому что виндовый полюбому будет блокировать входящие соединения, если их не разрешить вручную
0
18 / 13 / 5
Регистрация: 08.01.2016
Сообщений: 315
16.01.2017, 18:17  [ТС]
powowstal, бро, вот код, который я использую - он в Инете повсюду был просто)) И это на VB6, а не на VB.NET, как я раньше писал. Вот код сервера:
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
Private Sub Form_Load()
'Задать номер порта по которому будет осуществляться
'обмен данными, присвоив значение свойству LocalPort
'Вызвать метод Listen.
tcpServer.LocalPort = 5000
tcpServer.Listen
frmClient.Show 'Показать форму клиента
End Sub
 
Private Sub tcpServer_ConnectionRequest _
(ByVal requestID As Long)
'Проверяется свойство State, было ли завершено
'предыдущее соединение. Если не завершено,
'то перед установлением нового соединения,
'старое закрывается принудительно.
If tcpServer.State <> sckClosed Then _
tcpServer.Close
'Принятие запроса Accept с параметром requestID
'на установление соедиения.
tcpServer.Accept requestID
End Sub
 
Private Sub txtSendData_Change()
'Текстовое поле txtSendData
'содержит данные для передачи. Все символы,
'которые будут вводиться в это текстовое поле, будут единой
'строкой посылаться приложению-клиенту, используя метод SendData.
tcpServer.SendData txtSendData.Text
End Sub
 
Private Sub tcpServer_DataArrival _
(ByVal bytesTotal As Long)
'Декларируется переменная-буфер для получаемых данных.
'Вызывается метод GetData и свойству Text
'текстового поля txtOutput, присваивается значение переменной-
'буфера.
Dim strData As String
tcpServer.GetData strData
MsgBox strData 'Здесь на сколько я понимаю, если клиент успешно отправил данные, должно выскачить сообщение Hellow Word.
End Sub
Добавлено через 2 минуты
Паблито, Вы правильно думаете. На самом деле так и есть, как Вы сказали. Проблема в том, что я пробросил на роутере 5000-ый порт на машину, где стоит сервер. Ведь когда я отправляю Hellow World через TelNet на смартфоне - все прекрасно работает. А через свою программу не могу.(((
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
16.01.2017, 18:19
Цитата Сообщение от Elkatib Посмотреть сообщение
не могу.
ну наверное ошибку выдает какую-то, да?
почему надо всю информацию вытягивать щипцами?

содержимое манифеста?
0
18 / 13 / 5
Регистрация: 08.01.2016
Сообщений: 315
16.01.2017, 18:29  [ТС]
Паблито, да если бы я знал, что нужно ещё предоставить, я бы сразу все выложил. В том то и дело, никаких ошибок. Ни на сервере, ни в мобильном приложении. Просто тупо на кнопку жму, и ничего не происходит. Манифест, обязательно скину как приду с работы. Но там он такой же, как при создании проекта в андроид студио, я лишь добавил разрешения на Инет, как мне подсказали выше.
0
30 / 30 / 5
Регистрация: 21.03.2013
Сообщений: 381
17.01.2017, 00:49
Elkatib, порты не все свободны https://ru.wikipedia.org/wiki/... %D0%B8_UDP
нужно брать свободный
0
18 / 13 / 5
Регистрация: 08.01.2016
Сообщений: 315
17.01.2017, 02:22  [ТС]
powowstal, я думаю дело не в порте. Я скачал приложение TelNet с Play Market'а, ввели свой белый АйПи, 5000 порт и все работает идеально. Я подключаюсь, отправлю сообщение, сервер их принимает. Я сам сделать такое приложение не могу((((( Я уже не знаю, в чем может быть причина(((

Добавлено через 1 час 5 минут
powowstal, только что включил ТелНет на Windows 10 и подключился к серверу по 127.0.0.1 5000. Все работает. Может сервер на VB6 и Java(Android) не совместимы как-то... не знаю?!? Может разные принципы работы... Хотя в VB6 использован WinSock Control, который вроде тоже на принципах сокета юзается...

Добавлено через 19 минут
Паблито, вот манифест.
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.testdrv.drv">
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
 
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".DrvActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
 
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>
 
</manifest>
0
30 / 30 / 5
Регистрация: 21.03.2013
Сообщений: 381
17.01.2017, 05:30
Elkatib,
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
public class SocketRun extends Thread {
    private Socket socket;
    private DataOutputStream dos;
    private String Msg = "MyMsg";
 
    public void starte() {
 
        String server = "/*нужный ip*/";
        int port = /*нужный port (только свободный!)*/;
 
        try {
            socket = new Socket();//(server, port);
            socket.connect(new InetSocketAddress(server, port),0);
            socket.setSoTimeout(25000);//закрываем сокет через 25 сек если не поступают данные
            dos = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
             
             dos.writeUTF("hello i'm Lindsay Lohan");
             dos.flush();
             dos.close();socket.close();
     }catch (Exception e){             
            Log.e(Msg, "Eror "+e);
        }
}
    @Override
    public void run() {
 
        try {
            starte();
        }catch (Exception e){ Log.e(Msg, "Error run "+e);}
    }
}
и на кнопке запускаем

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
                 // нажатия на кнопки
 
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button:startSoc();//button - твоя кнопка
            Log.i("MyMsg","кнопка нажата"+e);
            break;
        }
    }
    private void startSoc() {
             try{
                SocketRun sr = new SocketRun ();
                Thread t = new Thread(sr, "TreadSocket");
                //запускаем поток
                t.start();
            }catch (Exception e){Log.i("MyMsg","Error "+e);}
}
если в логах не будет "кнопка нажата" значит кнопку нужно создать.

Если этот не будет работать значит проблема в сервере или не правильные айпи или порт.
**Данные отсылаются в текстовом виде формата UTF сервер так же должен ожидать текстовых данных.

Добавлено через 2 часа 12 минут
Elkatib, просто создай новый проект, добавь кнопку, поставь для кнопки
XML
1
android:onClick="onClick"
и мой класс. И включи wifi на телефоне.
Если будет ошибка, покажи полный листинг.

Добавлено через 35 минут
1
18 / 13 / 5
Регистрация: 08.01.2016
Сообщений: 315
17.01.2017, 14:30  [ТС]
powowstal, сделал вроде как ты сказал. У меня все выглядит так:
http://my-files.ru/o1lch5
http://my-files.ru/48w95y
http://my-files.ru/df3rvb

Перетащил твой код. В некоторых местах Андроид Студио ругался. Ну, я Альт-Энтер нажимал и он сам что-то исправлял. На картинке видно, что когда я нажимаю на кнопку, то выскакивает какая-та ошибка (вроде), но в логах "нажата кнопка" появляется.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.01.2017, 14:30
Помогаю со студенческими работами здесь

Что использовать для реализации клиент-серверного приложения?
Нужно реализовать клиент-серверное приложение. Принцип работы: Клиент отправляет текстовую информацию на сервер. Сервер обрабатывает и...

Назовите приемущества клиент-серверного Android-приложения, над Web-приложением
Скажите мне вот если вам заказчик скажет, а в чем приемущества андройда, ну например на тем же вебом

Нужны исходники простого простого приложения под Android для примера
можете дать ссылку на приложение под андроид?не Hello Word а какое нибудь другое но тоже простое на подобие этого ?хочу понять как...

Нужен пример клиент-серверного приложения
У меня есть задание создать нормальное &quot;взрослое&quot; клиент-серверное приложение, те не так как в универе лишь бы для видимости, а чтобы всё...

Нужен пример клиент-серверного приложения
Подскажите как реализовать клиент сервер на VB.NE? на VB6 юзал винсок: if winsock1.state&lt;&gt;sckConnected and...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru