免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3876 | 回复: 3
打印 上一主题 下一主题

socet短信发送与线程设计的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-13 16:09 |只看该作者 |倒序浏览
20可用积分
需求是这样的,我从来没有做过socket与线程的东西:现在有这样的需求:

一个小灵通短信发送平台,我们的现在是使用客户端的socket然后向小灵通平台服务发送一个串,串的格式是这样的:
out.println("<FROM:10060><TO:" + called_num + "><MSG: DY " + info + ">\r\n");
这其中变量 called_num是电话号码,而info是短信内容

要求有短信群发,并且要求反馈回正确的短信发送结果。
平台上是这样提供的:

  当你发送成功后,会返回ST_OK的串值,失误则会发送ST_ER,
  现在有一个重要通知要发送,发送前选中要发送的人,包括群发。然后提交后会有一个反馈结果:比如是给****发送成功,给****发送失误。并且要求支持有重发功能,但是如果使用重发功能的话,这个返回结果就会很慢才出来,因为要等它发送规定的次数后才会显示结果,这个问题需要如何解决?


  另外一点,我们需要进行线程设计,把小灵通短信发送这一部分单独拿出来。比如说通知内容是一部分,小灵通发送可以放到线程当中这样设计是否合理?而反馈结果要写入数据库表当中,这样的话我应当在线程中的哪个部分处理?

  还有一点就是,在socket当中进行读取返回值时,会不会很慢?

  线程这一部分我该如何设计?希望各位做过socket的朋友给些意见,这个问题困挠我好久了,急死人了!

下面附上短信发送的函数:
        public void SMSsend(String phone, String sms) {
                //BufferedReader in;
                BufferedInputStream in;
                PrintWriter out;
               
                String called_num = phone;
                String info = sms;
                try {
                        socket = new Socket(hostIP, Integer.parseInt(hostPort));
                        //in = new BufferedReader( new InputStreamReader(socket.getInputStream()));
                        in = new   BufferedInputStream(socket.getInputStream());   
                        out = new PrintWriter(socket.getOutputStream(), true);
                        out.println("<FROM:10060><TO:" + called_num + "><MSG: DY " + info + ">\r\n");
                       
                        byte[]   tmp=new   byte[5];         
                        in.read(tmp);   
                        String   str=new   String(tmp);
                } catch (Exception e) {
                        System.out.println(e.getMessage());                       
                }
        }

论坛徽章:
0
2 [报告]
发表于 2010-12-10 14:48 |只看该作者
建议使用消息队列,将运算分开。而且可以处理失误的情况!

推荐你个博客,是金山技术经理张宴的,下面的图对我很有启发,希望对你也是:


全文地址:http://blog.s135.com/httpsqs/

当然不是说推荐使用HTTPSQS ,呵呵<JAVA有很多消息队列的开源实现,推荐用一下ActiveMQ.

主要的思想就是将执行周期不同的顺序任务,如”发短信“,”写数据库“,”发邮件“等异步起来。使大家不必相互等待。呵呵!

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
3 [报告]
发表于 2010-12-10 15:13 |只看该作者
是要往消息服务器上发送消息吗?

论坛徽章:
0
4 [报告]
发表于 2010-12-10 15:36 |只看该作者
本帖最后由 zang232 于 2010-12-10 15:40 编辑
是要往消息服务器上发送消息吗?
renxiao2003 发表于 2010-12-10 15:13



是有新消息时,马上把新消息丢到消息服务器上去,放弃资源占用,让出线程等以快速响应其它请求,避免操作时间过长,阻塞线程。
然后用单独的线程(或进程)从消息服务器上取回消息,进行耗时、可能失败、需要重连、需要出错人工处理等逻辑的程序处理操作;
类似于Socket编程中的Select,但又不一样,就是异步(如果你愿意同时也可以是分布式的)计算。呵呵!

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
5 [报告]
发表于 2010-12-10 16:38 |只看该作者
这个不太会。SOCKET发消息倒是会点。

论坛徽章:
0
6 [报告]
发表于 2010-12-13 09:48 |只看该作者
这个是异步的通信吧,如果是异步的可以把成功的先反回,重发的继续处理,最后再反回结果。

群发消息得用我线程吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP