正确关闭tcp连接抛出java

时间:2012-03-23 12:18:47

标签: java tcp smpp

我正在使用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 :(得分:0)

在课程TCPIPConnection中,方法 - public ByteBuffer receive()您应该执行以下操作:

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

答案 1 :(得分:0)

使用像Logica lib这样的框架/库的重点应该是将您与低级API / TCP FIN级别的详细信息隔离开来,否则使用框架就没有任何增值。我们已经通过这条路线了,除非你有才华的TCP程序员,否则这种在TCP级别工作的路线不会有效。

我见过开源SMPP lib Cloudhopper(由Twitter制作,后来开源)多年来一直在非常大的平台上使用。它在许多领先的电信公司中都很强大且经过生产验证。它有示例客户端,您可以使用它来自定义。连接管理:第一次进行SMPP连接时缓存连接(每个会话)。在执行submitSM PDU(发送SMS)时,检查Exception的类型,它是连接异常,只需重新绑定并重新插入SMPP会话/连接。如果您有大量的活动期(例如超过40秒),SMPP服务器/ SMSC可能会丢弃连接。要重新连接,您有两个选择:a)下次执行submitSM PDU时检测过时连接,重新连接,更新缓存然后发送submitSm PDU或b)这是首选选项。有一个单独的线程定期执行enquireLink pDU - 比如每45秒一次,这将确保连接保持活动状态。假设enquireLink和submitSM PDU使用相同的缓存SMPP会话/连接。当然,如果enquireLink PDU检测到连接断开,它应该重新绑定并更新公共SMPP会话/连接。多年以来,我已经看到这种方法在多个应用程序中运行良好。