由于公司需要,让我用JAVA做一个接口,业务需求是,将我们产品监控报警的信息通过短信的方式发给用户,需要带参数(手机号码和短信内容)。客户已经有短信网关服务器(那啥爱迪生短信网关服务器),上级要求必须是采用Socket方式进行通信。我对网络编程方面不熟悉,在网络上找了很多资料,但是依旧未能解决。
以下是短信网关服务器提供的API供我们做二次开发:开发方法
连接端口号:TCP协议,端口号9518,长连接。
命令语法:<指令名>参数1#参数2#参数3#……
例子:
客户端发送命令:<登陆>用户名#密码#
服务器成功则返回:<登陆>成功可发送条数#
服务器失败则返回:<登陆>用户名错误#  或者 <登陆>口令错误#我的分析是,我只要做一个Client发送:<登陆>用户名#密码#,然后等服务器返回 <登陆>成功可发送条数# 后,我在发送命令:<发短信>自定义编号#手机号#短信内容#,然后根据服务器返回的信息判断短信是否发出去了。如果没发出去我需要将服务器发送过来的信息记录在一个日志文件中(例如信息:<登陆>成功可发送条数# , <发短信>提交成功可发送条数# ,<短信发送报告>发送成功#自定义编号# 等)我将一部分JAVA代码贴出来:
package net.message.main;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Date;public class MessageClient { private static int PORT = 9518; private static String IPADDRESS = "127.0.0.1"; private static String LOGINNAME = "demo"; private static String PASSWORD = "123"; public void message(String msgContent, String mobileNumber) throws Exception {
Socket so = new Socket(IPADDRESS, PORT);
InputStream is = so.getInputStream();
OutputStream os = so.getOutputStream();
                  BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
PrintStream ps = new PrintStream(os);
while (true) {
if("<发短信>未登陆#".equals(br.readLine())||"".equals(br.readLine())){
ps.println("<登陆>"+LOGINNAME+"#"+PASSWORD+"#");
Thread.sleep(2000);//停下来2秒等待服务器返回验证信息
}
ps.println(
                            "<发短信>"+(new Date().getTime())+"#"+mobileNumber+"#"+msgContent+"#");
//System.out.println(br.readLine());
if ("<服务暂停>服务暂停#".equals(br.readLine())) {
break;
}
if ("<短信发送报告>发送成功#自定义编号#".equals(br.readLine())) {
break;
}
}
ps.close();
br.close();
so.close();
}

public static void main(String[] args) throws Exception {
new MessageClient().message("hahahhaa", "1231231231");
}
}这段代码是我一个小Demo,用来验证是否可以接受到服务器的信息,结果,我啥都没收到,但是我应该是联通了服务器,请大家指教一二,看怎样才能获得服务器响应的数据。
PS:我在自己机子上装了一个爱迪生短信网关服务器模拟测试,所以IP填的是本机。

解决方案 »

  1.   

    他的返回是写在哪里的?信息体还是head?
      

  2.   


    我也不知道。
    网络编程让我很迷茫。我终于在4楼上传好了一张 截图,这个截图是那个爱迪生短信网关所提供的API。就这么寥寥几句,让我等新手倍感吃力
      

  3.   

    试试在循环最后加一句br.flush();感觉你并没有把信息发送出去,client死循环了,你在哪接受信息的?
      

  4.   

    while (true) {
    if("<发短信>未登陆#".equals(br.readLine())||"".equals(br.readLine())){
    ps.println("<登陆>"+LOGINNAME+"#"+PASSWORD+"#");
    Thread.sleep(2000);//停下来2秒等待服务器返回验证信息
    }
    ps.println("<发短信>"+(new Date().getTime())+"#"+mobileNumber+"#"+msgContent+"#");// 
    System.out.println(br.readLine()); 
    //System.out.println(br.readLine());
    if ("<服务暂停>服务暂停#".equals(br.readLine())) {
    break;
    }
    if ("<短信发送报告>发送成功#自定义编号#".equals(br.readLine())) {
    break;
    }
    ps.flush();
    }
      

  5.   

    加上了代码:
    System.out.println(br.readLine()); 

    ps.flush();结果依然没有收到信息
      

  6.   

    如果实在不行,大家帮忙贴一小段DEMO程序,让我测试一下,可能我写的代码有无。因为对网络编程比较外行,所以请大家帮个忙,谢谢大家了。
      

  7.   

    搞错了,不是br.flush();
    会不会是ps没有将信息发出去~~
      

  8.   

    要去吃饭了,仔细看了一下
     if("<发短信>未登陆#".equals(br.readLine())||"".equals(br.readLine())){
                    ps.println("<登陆>"+LOGINNAME+"#"+PASSWORD+"#");
                    Thread.sleep(2000);//停下来2秒等待服务器返回验证信息
                }
    这段有问题啊,你还没发送信息呢,怎么能读取信息的呢
      

  9.   

    那我就算写一个非常直接,非常简单的DEMO,就是直接发送一个命令过去,服务器也没反应。
    那 爱特生服务器 是从网上下载的,也没法验证其是否有其他问题(其实就是一个EXE文件)。
    唉。
    长连接的话,还得先写个心跳协议。package net.message.main;import java.io.BufferedReader;  
    import java.io.InputStream;  
    import java.io.InputStreamReader;  
    import java.io.OutputStream;  
    import java.io.PrintStream;  
    import java.net.Socket;  
      
    public class TestClient {  
        public static void main(String[] args) throws Exception{  
            Socket so = new Socket("127.0.0.1",9518); 
            InputStream is = so.getInputStream();  
            OutputStream os = so.getOutputStream();  
            BufferedReader br = new BufferedReader(new InputStreamReader(is));  //客户从server的输入流
            PrintStream ps = new PrintStream(os);
           // System.out.println("请输入:");
            //InputStreamReader isr = new InputStreamReader(System.in);  
         //   BufferedReader key = new BufferedReader(isr);  //从键盘的输入流 
            while(true){  
               // String temp = key.readLine();  
             String temp="<登录>demo#123#";
                ps.println(temp);//因为server用的是readline,必须用println  
                System.out.println(br.readLine());  
                if(temp.equals("bye")){  
                    Thread.sleep(1000);//为了把bye更好的发送  
                    System.out.println("输入bye,将要跳出");
                    break;  
                }  
            }  
            //key.close();//java 包名.类名  
            ps.close();  
            br.close();  
            so.close();  
        }  
      
    }