接收长短信的时候,由于短信网关发送过来的拆分短信顺序不是按从小到大,导致长短信接收乱码

88 views
Skip to first unread message

yong guo

unread,
Jan 26, 2010, 10:39:36 PM1/26/10
to smgp
接收长短信的时候,由于短信网关发送过来的拆分短信顺序不是按从小到大,比如 一条长短信被拆分成3条,网关发送的顺序是1-3-2,结果程序将收到的
3条拆分短信在longsmsbuffer里面按第1、3、2条的顺序合并,导致长短信接收乱码。

yong guo

unread,
Jan 26, 2010, 10:58:07 PM1/26/10
to smgp
呵呵,不好意思,搞错了,可能是本地起了多个接收的长连接导致的,我把longsmsbuffer改成static变量试试。 ^_^

do well

unread,
Jan 27, 2010, 1:30:04 AM1/27/10
to smg...@googlegroups.com
如果是多个连接引起的长短信次序错乱的情况,应该会是拼接错误超时后抛出的,6个字节udh已经被转换成ascii显示的。如果是两个client分别接收的,你把ongsmsbuffer改成static是没用的。

2010/1/27 yong guo <yong.guo.cn@gmail.com>
呵呵,不好意思,搞错了,可能是本地起了多个接收的长连接导致的,我把longsmsbuffer改成static变量试试。  ^_^



--
林路(Dowell)


欢迎访问我的Blog网站
IT评论:http://www.donews.net/dowell/
           http://blog.sina.com.cn/dowellhz
IT技术:http://blog.csdn.net/dowellhz

我的smgp开源项目:http://smgp.googlecode.com

yong guo

unread,
Jan 27, 2010, 9:17:31 PM1/27/10
to smgp
我调整了一下你的程序,加上了发送连接池和接收连接池,每次需要发送和接收的时候从相应的连接池里获取可用连接(顺便说一下,一旦网关返
回-1Socket错误的话,好像这个链接就再也不能用了,不过看协议上好像是会通过ActiveTest消息自动修复的),我的接收链接缺省是2,如
果一旦去接收一条长短信的话,短信网关有可能会把分割短信发送到不同的接收线程上,这样如果longsmsbuffer不是静态的就不可能凭借成功。我
改成static测试成功。 :-)
还有一个,MsgFormat=8的时候在Linux上采用“iso-10646-ucs-2”
this.MsgContent = msgcontent.getBytes("iso-10646-ucs-2");
收到的是乱码,我这里的做法是先将String转换成“UTF-16”,再将其转换成byte[],然后将该比特数组的前两位删去,在Windows和
Linux上测试均通过。

do well

unread,
Jan 27, 2010, 9:31:36 PM1/27/10
to smg...@googlegroups.com

-1并不是网关返回的的,是程序在发现sokect异常的时候扔出的,程序本在在5秒后会自动重连,出现-1的时候,程序建议sleep 5秒以上,然后重发,。
 
汉字是否能够正常显示跟操作系统自身的编码环境有关系,你在windows和linux上测试通过,并不表示所有的系统都这样,因为别人的操作系统的编码环境可能给你的不一样。
另外,修改后能否给个文件上来。

yong guo

unread,
Jan 27, 2010, 10:02:24 PM1/27/10
to smgp
你是指长短信的么?
private static HashMap<String, LongDeliver> longsmsbuffer = new
HashMap<String, LongDeliver>();
....
private void AddLongSms(DeliverMessage dm) {
synchronized (longsmsbuffer) {
// int curstat=0;
if (longsmsbuffer.get(dm.SrcTermID) != null) {
int curstat = longsmsbuffer.get(dm.SrcTermID).AddDeliver(dm);
// 0表示正常
// 1表示长短信已经满了
// -1表示长短信出错了

if (curstat == 0) {
return;
} else if (curstat == 1) {
this.deliverbuffer.add(longsmsbuffer.get(dm.SrcTermID)
.MergeDeliver());
longsmsbuffer.remove(dm.SrcTermID);
} else if (curstat == -1) {
DeliverMessage[] tmpdeliver = longsmsbuffer.get(
dm.SrcTermID).popDeliver();
for (int i = 0; i < tmpdeliver.length; i++) {
this.deliverbuffer.add(tmpdeliver[i]);
}
longsmsbuffer.put(dm.SrcTermID, new LongDeliver(dm));
}
} else {
longsmsbuffer.put(dm.SrcTermID, new LongDeliver(dm));
}
return;
}
}
......
private boolean CheckLongSmsOverTime(int second) {
synchronized (longsmsbuffer) {
Iterator spit = longsmsbuffer.keySet().iterator();
// System.out.println("检查是否有长短信被执行");
while (spit.hasNext()) {
DeliverMessage[] tmpDeliverMsg;
String key = "";
if ((tmpDeliverMsg = longsmsbuffer.get(
(key = (String) spit.next())).CheckIfOverTime(second)) != null)
{
for (int i = 0; i < tmpDeliverMsg.length; i++) {
this.deliverbuffer.add(tmpDeliverMsg[i]);
}

longsmsbuffer.remove(key);
return true;
}

}
return false;
}
}

yong guo

unread,
Jan 27, 2010, 10:03:45 PM1/27/10
to smgp
连接池是采用Apache的PoolableObjectFactory对象池实现的
Message has been deleted

dowell

unread,
Jan 27, 2010, 10:55:25 PM1/27/10
to smgp
能否给个完整的修改程序,你作为附件之间发上来

On 1月28日, 上午11时03分, yong guo <yong.guo...@gmail.com> wrote:
> 连接池是采用Apache的PoolableObjectFactory对象池实现的

yong guo

unread,
Jan 27, 2010, 10:56:38 PM1/27/10
to smgp
转换UCS-2编码:

public static byte[] toUCS2Byte(byte[] content) {
byte[] bt_content = null;
byte[] byte1;
try {
String str_content = new String(content);
// System.out.println("MsgContentUtil : "+str_content);
byte1 = str_content.getBytes("UTF-16");
int len = byte1.length - 2;
bt_content = new byte[len];
for (int i = 0; i < len; i++)
bt_content[i] = byte1[i + 2];
} catch (UnsupportedEncodingException e) {
bt_content = null;
e.printStackTrace();
}
return bt_content;
}

Reply all
Reply to author
Forward
0 new messages