日期:2014-05-20  浏览次数:20621 次

SMPP协议SOCKET发送数据阻塞的问题
现在是我们的程序做SMPP的服务器,网关连接我方。在连接成功,并BIND后。我方用OUTPUTSTREAM数据流格式向网关发送短消息后,(强制使线程等待了10秒)手机已经接到短消息。但我使用BIND链路的INPUTSTREAM去接收返回状态的数据,竟然出现Connection Reset的错误。
估计原因是OUTPUTSTREAM的阻塞状态仍未结束。(但我信息明明已经发完了,手机都已经收到了)
请问 这是怎么回事啊?改如何解决啊。都已经郁闷好几天了。
另外请问下 该如何监听socket的阻塞状态啊?穷人,求求大家帮帮忙吧

------解决方案--------------------
帮顶
别急
------解决方案--------------------
主要你问的问题比较困难,我要是会就告诉你了

------解决方案--------------------
楼主要明白,什么是MT,什么是Report。
你在下发短信的时候,细节上应该是向IO写一个Request和从IO读一个Response。
但是,如果,你想知道下发短信后,短信是否被手机接收。
那应该是,等短信被手机接收后,对端网关会向你发送一个状态报告信息(Report)。
这个状态报告信息,和,下发短信,使用的不是同一个Socket。
------解决方案--------------------
探讨
楼主要明白,什么是MT,什么是Report。
你在下发短信的时候,细节上应该是向IO写一个Request和从IO读一个Response。
但是,如果,你想知道下发短信后,短信是否被手机接收。
那应该是,等短信被手机接收后,对端网关会向你发送一个状态报告信息(Report)。
这个状态报告信息,和,下发短信,使用的不是同一个Socket。

------解决方案--------------------
楼主有时间,再仔细研究一下CMPP协议的具体交互过程。

据我理解,应该是互为 服务端客户端 的框架结构。

当程序要发送信息的时候,充当客户端。
当程序要接收信息的时候,充当服务端。

所以,要想完成和移动网关的对接,你的程序应该会有 服务端功能的代码和客户端功能的代码。

我们向手机用户发送短信的方向,一般称为MT。手机用户向我们发送短信的方向,一般称为MO。

发送方发送一个消息,具体过程会分成两步,发送Request和接收Response。(例如:下发给手机一条短信)
接收方接收一个消息,具体过程也会分两步,接收Request和响应Response。(例如:接收手机的一条短信)

一般情况下,收发消息的程序中,用户上行的MO消息 和 描述下行MT短信状态的Report消息,是不做严格意义上的区分的。
只是在处理业务逻辑的过程中,会针对不同的上行信息进行区分处理。 

所以,楼主的发送程序,在发送Request之后,不用强制线程等待,可以直接接收对应的Response,
这个Response只是告诉你,对方已经接收了你的下发内容,但,是否被手机收到,就不知道了。
当下行短消息被处理完成后(例如:手机收到短信),移动网关会向你发送一个Report信息,来报告刚才下发的短消息被成功处理。

------解决方案--------------------
哦,忘记了,是可以一条链接即收又发的。
不好意思。