|
精华帖 (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()); } } 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间:2007-09-13
每条短信都起新的线程发送,但是要限制线程的数量,弄个线程池之类的吧
|
|
| 返回顶楼 | |
|
时间:2007-09-13
jdk1.5实现了一个线程池,开箱即用
楼主第一个问题没看明白 |
|
| 返回顶楼 | |
|
时间:2007-09-13
ps:楼主单词拼写错误,socket
|
|
| 返回顶楼 | |
|
时间:2007-09-14
看样子,你每一短信就new一个Socket,用的是短连接,并且每次短信提交成功后,都是直接返回状态的.
如果是这样的话,第一个问题,如果需要重发,那么你只能在输出流发出之后在这个socket上等服务器返回输入流,就是堵在这个socket上. 每发一条短信,建议起一个线程,包括new Socket,向服务器端发送数据包,接受反馈结果,把反馈结果写入数据库表当中.当然线程肯定是要通过线程池来控制的. 在socket当中进行读取返回值时,会不会很慢?这个问题,我觉得取决网络情况和服务器端的响应情况. 你们这个小灵通发短信不是基于smgp协议的吗?协议就这么简单? |
|
| 返回顶楼 | |
|
时间:2007-09-14
这个肯定不是smgp协议的~
建立一个线程池,每次发送时候从线程池取得一个连接,然后发送,发送完成放回线程池。 |
|
| 返回顶楼 | |
|
时间:2007-09-14
jdk5的Executor,现成的,试试就知道
|
|
| 返回顶楼 | |
|
时间:2007-09-14
线程池不是万能的,如果每个连接一个线程,几千几万个连接的话.....线程间切换会成为性能瓶颈。
|
|
| 返回顶楼 | |
|
时间:2007-09-14
线程池不是可以设置最大线程数的吗?你要设成上亿吗?
|
|
| 返回顶楼 | |
|
时间:2007-09-14
线程池应该是少不了的,不过在子线程里等待反馈结果,这无疑会一直占用着内存,如果在网络不好或其他情况导致发送信息不通过,可能就会导致阻塞。
认为最好有收和发的2个主线程,这样运作能好一些! |
|
| 返回顶楼 | |










