Правильное закрытие tcp-соединения скинуть java - PullRequest
0 голосов
/ 23 марта 2012

Я пишу ESME , используя logica smpp lib , но у меня есть серьезная проблема - когда SMSC отправляет ESME [FIN, ACK] , ESME не отвечает правильно.

Здесь дамп TCP:

2751.016216 ESME -> SMSC         SMPP SMPP Submit_sm 
2751.019818         SMSC -> ESME SMPP SMPP Submit_sm - resp: "Throttling error (ESME exceeded allowed message limits)" 
2751.136172 ESME -> SMSC         TCP 42265 > 5001 [ACK] Seq=1651885221 Ack=3959508692 Win=123 Len=0 
2774.588453         SMSC -> ESME TCP 5001 > 42265 [FIN, ACK] Seq=3959508692 Ack=1651885221 Win=32768 Len=0 
2774.741502 ESME -> SMSC         TCP 42265 > 5001 [ACK] Seq=1651885221 Ack=3959508693 Win=123 Len=0 
2821.032427 ESME -> SMSC         SMPP SMPP Submit_sm 
2821.033502         SMSC -> ESME TCP 5001 > 42265 [RST] Seq=3959508693 Ack=0 Win=32768 Len=22 

Как это решить? Можно ли обработать этот пакет?

Ответы [ 2 ]

0 голосов
/ 31 июля 2015

Смысл использования фреймворка / библиотеки, такой как Logica lib, должен заключаться в том, чтобы изолировать вас от низкоуровневых деталей уровня API / TCP FIN, иначе использование фреймворка не принесет никакой пользы.Мы проходили этот путь, и если у вас нет талантливых программистов TCP, этот путь работы на уровне TCP не будет продуктивным.

Я видел SMPP lib с открытым исходным кодом lib Cloudhopper (созданный Twitter и позже открытыйИсточник) используется на очень больших платформах с годами.Он надежен и проверен во многих ведущих телекоммуникационных компаниях.У него есть примеры клиентов, которые вы можете использовать для настройки.Управление соединением: кэшируйте соединение при первом подключении SMPP (за сеанс).Выполняя PDU submitSM (отправьте SMS), проверьте тип Exception, это исключение для соединения, просто переподключите и заново подключите сеанс SMPP / Connection.Если у вас большие периоды бездействия (скажем, более 40 секунд), SMPP-серверы / SMSC на их конце могут разорвать соединение.Для повторного подключения у вас есть два варианта: a) Определить устаревшее соединение в следующий раз, когда вы выполняете PDU submitSM, переподключите, обновите кэш и затем отправьте PDU submitSm или b) Это предпочтительный вариант.Имейте отдельный поток, который периодически делает pDU enquireLink - скажем, каждые 45 секунд, это будет гарантировать, что соединение остается активным. Предполагается, что enquireLink и submitSM PDU используют один и тот же кешированный сеанс / соединение SMPP.Конечно, если enquireLink PDU обнаруживает разорванное соединение, он должен выполнить повторную привязку и обновить общий сеанс / соединение SMPP.Я видел, как этот подход хорошо работает в нескольких приложениях с годами.

0 голосов
/ 28 марта 2012

В классе TCPIPConnection, метод - public ByteBuffer receive() вы должны сделать что-то вроде этого:

                    bytesRead = inputStream.read(receiveBuffer, 0, bytesToRead);
                    if (bytesRead == -1){
                        //close connection here
                    }
...