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

socet短信发送与线程设计的问题
需求是这样的,我从来没有做过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());
}
}


------解决方案--------------------
怎么socket通信不用我告诉你了吧,下面把起线程执行socket通信后如何取返回值的方法告诉你代码如下:
public class test {
public static String bac;

public test() {
testthread td=new testthread();
td.start();

while (true){
try {
Thread.sleep(1000);
if (td.getState().toString().equals( "TERMINATED ")){
System.out.println(bac);
break;
}

System.out.println(td.getState());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

public static void main(String[] args) {
new test();
}
}
------解决方案--------------------
public class testthread extends Thread{

public testthread() {

}

public void run(){
try {
sleep(5000);//这里模拟你的socket执行用时
test.bac= "this is thread backmessage ";
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}