Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> реализация простого протокола на java, правильно ли я делаю? 
:(
    Опции темы
zone51
Дата 7.1.2008, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 17.2.2006

Репутация: нет
Всего: 1



Доброго времени суток всем! Помогите решить проблему. Задача стоит такая: написать небольшой протокол обмена информацией между клиентом и сервером
Значит так сервер занимается отправкой сообщений смс. Он принимает от клиента по сокету служебное слово DELIVERYSTART после чего должен принять список получателей сообщения каждый получатель идет командой RECIPIENT и само сообщение по команде MESSAGE. Завершается передача командой DELIVERYEND. Так вот у меня вопрос как сделать так чтобы гарантировать корректную обработку ошибки в случае неполной передачи и можно ли передать список получателей как обьект скажем ArrayList тот же самый. И самое главное как организовать на клиенте все эти функции то есть взаимодействие с сервером. В принципе я понимаю как это сделать но я не уверен правильно ли , буду рад любой помощи, заранее спасибо. Здесь привожу фрагмент сервера

Код

package sms;

import ie.omk.smpp.Address;
import ie.omk.smpp.Connection;
import ie.omk.smpp.message.SMPPPacket;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;

public class SMSSender extends Thread {

    private String message;
    private Socket socket = null;
        
    public SMSSender(String message, Socket s) {
        this.message = message;
        this.socket = s;
    }

    public void run() {

        boolean flag = false;
        boolean flag1 = false;
        boolean flag2 = false;
        boolean flag3 = false;
        BufferedReader in;
        String buf = "";
        PrintWriter out;
        ArrayList<String> recps = new ArrayList<String>();
        Connection connection;

        try {

            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));

            while ((buf = in.readLine()) != null) {
                if (buf.indexOf("STARTDELIVERY") != -1) {
                    flag1 = true;
                    out.println("OK 250");
                }
                if (buf.indexOf("RECIPIENT") != -1) {
                    flag2 = true;
                    recps.add(buf.substring(buf.indexOf("=") + 1));

                }
                if (buf.indexOf("MESSAGE") != -1) {
                    flag3 = true;
                    message = buf.substring(buf.indexOf("=") + 1);
                }
                if (buf.indexOf("ENDDELIVERY") != -1) {
                    out.println("OK BYE");
                    flag = true;
                    break;
                }
            }

            if (flag && flag1 && flag2 && flag3) {


                SMPPPacket sms;

                // sms = connection.newInstance(SMPPPacket.SUBMIT_SM);


                Address address = new Address();
                //  address.setAddress(destination);
                //sms.setDestination(address);

                //   sms.setMessageText(message);

                //  connection.sendRequest((SMPPRequest) sms);


            } else {
                //Generate error
            }
        }


        catch (Exception ux) {
            System.err.println("SMPPAPI:" + ux.getMessage());
        }
    }
}


 smile 


--------------------
The truth is out there
PM MAIL   Вверх
AntonSaburov
Дата 8.1.2008, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



Я бы попробовал передавать в виде XML - пусть немного накладнее, зато можно гарантировать, что если уж документ передан, то надежно все передано.
PM MAIL WWW ICQ   Вверх
barin_Student
Дата 8.1.2008, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 488
Регистрация: 10.8.2007
Где: Казахстан , Алмат ы

Репутация: 1
Всего: 2



Помойму проще не разрабатывать то что есть...
Вы уже в своем коде использовали часть SMPP протокола, проще его полностью реализовать..
www.isms.ru, посмотрите, если я про то.


--------------------
Нехорошо блин!!!
PM MAIL   Вверх
jManiak
Дата 8.1.2008, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 6.2.2007
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Ну можно каким-нибудь алгоритмом генерировать контрольную сумму сообщения.
И на другой стороне генерировать такой же checksum, после чего сравнивать их. Если не равно одно другому, то пересылать заново.
PM MAIL ICQ   Вверх
niasilil
Дата 8.1.2008, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 4.6.2007
Где: USA

Репутация: 8
Всего: 9



Цитата(jManiak @ 8.1.2008,  15:10)
Ну можно каким-нибудь алгоритмом генерировать контрольную сумму сообщения.
И на другой стороне генерировать такой же checksum, после чего сравнивать их. Если не равно одно другому, то пересылать заново.

Можно, конечно, только смысла особого нет - TCP же. 


--------------------
SCJP 5.0, SCJD
PM MAIL   Вверх
barin_Student
Дата 9.1.2008, 06:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 488
Регистрация: 10.8.2007
Где: Казахстан , Алмат ы

Репутация: 1
Всего: 2



Если вам надо массовую рассылку SMS,
прочитайте спецификацию SMPP,а именно SubmitMultiSM, и не надо будет самому что то делать, надо будет просто подставить готовые классы в нужном вам итоге... smile 


--------------------
Нехорошо блин!!!
PM MAIL   Вверх
jManiak
Дата 9.1.2008, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 6.2.2007
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата(niasilil @  8.1.2008,  21:32 Найти цитируемый пост)
Можно, конечно, только смысла особого нет - TCP же. 

Да, знаю я несколько систем, которые тоже обмениваются данными через tcp... 
Вы не поверите, но процент ошибочных данных примерно равен 30%, хотя в целом от точки отправления до точки назначения не более 10% потерь больших пакетов, точно таких же как пересылает эта система.

Так что tcp - это как выяснилось еще не гарантия доставки данных. Я бы не поленился и написал проверку чексама...
PM MAIL ICQ   Вверх
w1nd
Дата 9.1.2008, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



Цитата(jManiak @  9.1.2008,  09:19 Найти цитируемый пост)
Так что tcp - это как выяснилось еще не гарантия доставки данных. Я бы не поленился и написал проверку чексама...

TCP/IP не гарантирует доставки всех данных. Гарантируется лишь целостность тех данных, которые дошли.


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
niasilil
Дата 9.1.2008, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 4.6.2007
Где: USA

Репутация: 8
Всего: 9



jManiak, можно подробнее про эти несколько систем? почему теряется 30% данных и где? 


--------------------
SCJP 5.0, SCJD
PM MAIL   Вверх
zone51
Дата 9.1.2008, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 17.2.2006

Репутация: нет
Всего: 1



barin_Student, 
А вы можете подсказать где этот класс взять или привести простой пример процедуры для посылки смс с проверкой ее доставки? Огромное спасибо, очень надо smile  smile  smile 


--------------------
The truth is out there
PM MAIL   Вверх
barin_Student
Дата 9.1.2008, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 488
Регистрация: 10.8.2007
Где: Казахстан , Алмат ы

Репутация: 1
Всего: 2



Есть библиотека org.smpp.*; и еще много разных, вот привиду пример работы как по протоколу это делается:
В этой библиотеке есть команда 
Bind*// посылается запрос на установление соединения с SMPP сервером..
для посылки сообщения используются восновном DeliverSM и SubmitSM, для массовой рассылки используется SubmitMultiSM..
В DeliverSM есть поле (не помню точно как ) ,отвечающее за ответ о доставке..
Вот маленький пример как примерно работать по SMPP протоколу с Опсос либо просто SMPP серверами:
Код

 try {
        
            BindRequest request = null;
            BindResponse response = null;
            String syncMode = (asynchronous ? "a" : "s");
            request = new BindTransmitter();
           TCPIPConnection connection = new TCPIPConnection("127.0.0.1", 10013);
            connection.setReceiveTimeout(20*1000);
            session = new Session(connection);
             request.setSystemId("param1");
            request.setPassword("param2");
            request.setSystemType(null);
            request.setInterfaceVersion((byte)0x34);
           byte Ton = 1;
            byte Npi = 0;
            addressRange.setTon(Ton);
            addressRange.setNpi(Npi);*/
            request.setAddressRange(addressRange);
            // send the request
            System.out.println("Bind request " + request.debugString());
            response = session.bind(request);//приконекчиваемся к SMPP серверу, посылаем BindTransceiver();

            System.out.println("Bind response " + response.debugString());
            if (response.getCommandStatus() == Data.ESME_ROK) {
                bound = true;
                DeliverSM deliverSM = new DeliverSM();
                deliverSM.setShtoMessage("SMS ka");
             //для того чтобы указать серверу генерацию отчета надо еще указывать ESME там еще чаго то точно сказать не могу
                DeliverSMResp deliverResponse = new DeliverSMResp();
                 deliverResponse=session.deliver(deliverSM);
                 System.out.println("Otchet= "+deliverResponse.debugString());//собственно до SMPP Сервера уже дошло 
            }

        } catch (Exception e) {
                        debug.write("Bind operation failed. " + e);
            System.out.println("Bind operation failed. " + e);
        } finally {
                  }
    }


Добавлено @ 12:01
Да не всегда совпадает отчет о доставке с реальной доставкой, впринципе вы можете пока ограничется отчетом о получение команды доставки, вот есть начатая тема , там и полностью доки есть о SMPP:
http://www.isms.ru/faq.shtml?nameact=view&...=3&id2=1297

Добавлено через 8 минут и 13 секунд
В примере есть граматические ошибки , но не в этом суть...
Вы мне расскажите что дословно вам надо, кому вы посылаете сообщения ? Зачем вам отчет о доставке?(Хотя глупый вопрос).. И почему вы обрабатывали слова?

Это сообщение отредактировал(а) barin_Student - 9.1.2008, 12:02


--------------------
Нехорошо блин!!!
PM MAIL   Вверх
zone51
  Дата 9.1.2008, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 17.2.2006

Репутация: нет
Всего: 1



barin_Student, 
Цитата

В примере есть граматические ошибки , но не в этом суть...
Вы мне расскажите что дословно вам надо, кому вы посылаете сообщения ? Зачем вам отчет о доставке?(Хотя глупый вопрос).. И почему вы обрабатывали слова?

А вы не из ЦРУ?  smile 
Система такая: есть электронный магазин и он отсылает клиентам смс о сделанных заказах, о  событиях если заказ пришел и т д, я сделал на яве смс центр который собирает информацию от магазина об смс, обрабатывает ее и посылает смс клиентам. Просто магазин не мой и все очень сложно я просто побоялся интегрировать это все в магазин. Вот и всё. А как просто послать смс толкового примера я не нашел я пользовался smppapi.sourceforge.net там в юзергейте это есть но ниче толкового не получилось а сроки поджимают поэтому и хотелось где то найти более менее рабочий пример посылки смс. Буду очень рад если у меня получится сделать рабочий модуль для этого) smile 


--------------------
The truth is out there
PM MAIL   Вверх
barin_Student
Дата 9.1.2008, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 488
Регистрация: 10.8.2007
Где: Казахстан , Алмат ы

Репутация: 1
Всего: 2



http://www.koders.com/java/fidF86298CF6D3D...F9C2D05759.aspx
простой пример, если вам от магазина приходит просто текст который вам надо передать и куда(номер), а вы уже должны передать при помощи операторов СМС , то вам надо практически полностью делать сам протокол , там есть пингация и т.п. , за день вы это не решите)) smile  


--------------------
Нехорошо блин!!!
PM MAIL   Вверх
zone51
Дата 9.1.2008, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 17.2.2006

Репутация: нет
Всего: 1



barin_Student, 
Нет просто вот попытаюсь так сказать: надо послать просто через интернет послать смс на мобилу, не через мобилу а через смпп интернет протокол. Неужели так сложно написать минимальный пример для этого? Мне казалось это уже давно решено


--------------------
The truth is out there
PM MAIL   Вверх
barin_Student
Дата 9.1.2008, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 488
Регистрация: 10.8.2007
Где: Казахстан , Алмат ы

Репутация: 1
Всего: 2



Возмите тот пример по последней ссылке , тот метод что есть Sumbit(), это и есть посылка смс..
не делал по Http , а если при помощи Опсос то это ко мне.. Я просто не вижу сложности разобрать тот пример, максимально простой..


--------------------
Нехорошо блин!!!
PM MAIL   Вверх
zone51
Дата 9.1.2008, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 17.2.2006

Репутация: нет
Всего: 1



barin_Student, 
так да не сложно я про то что не понял вас о сложности через опсос щас все понятно.
Кстати а отправка через смпп протокол это же и есть через шттп?
То есть человек заключает контракт с провом тот дает ему логин пароль для доступа к смпп и уже через этот протокол идет отправка смс по тарифам за одно смс. Я правильно понимаю?

Добавлено через 25 секунд
То есть просто пров предоставляет интернет канал для отправки смс


--------------------
The truth is out there
PM MAIL   Вверх
jManiak
Дата 9.1.2008, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 6.2.2007
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата(niasilil @  9.1.2008,  09:49 Найти цитируемый пост)
jManiak, можно подробнее про эти несколько систем? почему теряется 30% данных и где? 

Система управления финансами уровня города. т.е. Написана похоже на дельфи, но не уверен. Опять же там есть web-интерфейс на jsp. 
Пробовали проверять на каком именно уровне теряются данные, но отслеживание tcpdump'ом особо ничего не дало, при загрузке программы особых простоев не было, ничего странного на вид.
Никаких сервисных программ система не предусматривает, так что отследить кто (сервер или коиент) от кого ждет какие данные тоже не представляется возможным.
Разработчики всего этого безобразия говорят да, есть такой косяк и разводят руками.

Да кстати, еще не сказал... часть данных передается по tcp протоколу, а часть по smtp, причем большая по smtp(но суть-то все равно та же... в результате же tcp...).

т.е. часто бывает так: программа запустилась, но многие функции вылетают с ошибкой, т.к. некоторые данные получается пришли ошибочные(скорее неполные).
PM MAIL ICQ   Вверх
niasilil
Дата 9.1.2008, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 4.6.2007
Где: USA

Репутация: 8
Всего: 9



Интересно. Вобщем да, с сетевыми протоколами глюки ловить очень сложно. Наверное, ты прав, лучше перебдеть, чем недобдеть. smile 

Это сообщение отредактировал(а) niasilil - 9.1.2008, 20:01


--------------------
SCJP 5.0, SCJD
PM MAIL   Вверх
zone51
Дата 9.1.2008, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 17.2.2006

Репутация: нет
Всего: 1



Кстати а чем отличаются синхронный и синхронный передатчики смс? Какой лучшк использовать?


--------------------
The truth is out there
PM MAIL   Вверх
nornad
Дата 9.1.2008, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



Цитата(zone51 @  10.1.2008,  00:43 Найти цитируемый пост)
синхронный и синхронный

лучше синхронный  smile 
Синхронный - запустил, дождался ответа, обработал, пошёл дальше.
Асинхронный - запустил, пошёл дальше. Пришёл ответ - обработал.


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
barin_Student
Дата 10.1.2008, 05:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 488
Регистрация: 10.8.2007
Где: Казахстан , Алмат ы

Репутация: 1
Всего: 2



Синхронный лучше, глюков меньше...
По сути вы по паролю и логину на определенный хост и порт , посылаете команду, например BindTransceiver()(здесь и указывается пароль , логин, а так же возможно systemId(ваше имя), эта команда подключает вас к СМСЦ как приемо-передатчик), на эту команду он посылает BindTransceiverResp()? надо посмотреть поле CommandStatus, если = 0 , значит вы уже имеете возможность посылать СМСки, они называются : DeliverSM, SubmitSM, QuerySM,DataSM и есть массавая рассылка SubmitMulti(). На все команды шлецца Response что тебе на твой Request , что СМСЦ на его Request. Так же СМСЦ постоянно посылает EnquireLink() - производит пингацию, не послал EnquireLinkResp в ответ , он (СМСЦ) отключит коннект. Для завершения сессии посылается команда Unbind().


--------------------
Нехорошо блин!!!
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2149 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.