论坛首页 Java版

socet短信发送与线程设计的问题

浏览 2719 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2007-09-13 关键字: socket,thread
需求是这样的,我从来没有做过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());
}
}
   
最后更新时间:2007-09-13
每条短信都起新的线程发送,但是要限制线程的数量,弄个线程池之类的吧
   
0 请登录后投票
最后更新时间:2007-09-13
jdk1.5实现了一个线程池,开箱即用
楼主第一个问题没看明白
   
0 请登录后投票
最后更新时间:2007-09-13
ps:楼主单词拼写错误,socket
   
0 请登录后投票
最后更新时间:2007-09-14
看样子,你每一短信就new一个Socket,用的是短连接,并且每次短信提交成功后,都是直接返回状态的.
如果是这样的话,第一个问题,如果需要重发,那么你只能在输出流发出之后在这个socket上等服务器返回输入流,就是堵在这个socket上.
每发一条短信,建议起一个线程,包括new Socket,向服务器端发送数据包,接受反馈结果,把反馈结果写入数据库表当中.当然线程肯定是要通过线程池来控制的.
在socket当中进行读取返回值时,会不会很慢?这个问题,我觉得取决网络情况和服务器端的响应情况.
你们这个小灵通发短信不是基于smgp协议的吗?协议就这么简单?
   
0 请登录后投票
最后更新时间:2007-09-14
这个肯定不是smgp协议的~

建立一个线程池,每次发送时候从线程池取得一个连接,然后发送,发送完成放回线程池。
   
0 请登录后投票
最后更新时间:2007-09-14
jdk5的Executor,现成的,试试就知道
   
0 请登录后投票
最后更新时间:2007-09-14
线程池不是万能的,如果每个连接一个线程,几千几万个连接的话.....线程间切换会成为性能瓶颈。
   
0 请登录后投票
最后更新时间:2007-09-14
线程池不是可以设置最大线程数的吗?你要设成上亿吗?
   
0 请登录后投票
最后更新时间:2007-09-14
线程池应该是少不了的,不过在子线程里等待反馈结果,这无疑会一直占用着内存,如果在网络不好或其他情况导致发送信息不通过,可能就会导致阻塞。
认为最好有收和发的2个主线程,这样运作能好一些!
   
0 请登录后投票
论坛首页 Java版

跳转论坛:
JavaEye推荐