C/S架构下的移动资费页面终结者—理想网关代理

大家看到这篇文章,我心情真的是很沉重的。为什么?那我告诉你,我现在写的是第二遍~刚才准备提交的时候不小心按到什么。。。没啦!5555。。。写了1个小时诶~

最近手头有一个C/S架构项目,完成了HTTP跟SOCKET两种方式的连接,在进行CMNET测试都已经通过,但是在进行CMWAP就没这么顺利了!原先我们做的都是对content-type进行判断。但是自从资费页面又改了,这个方法我就再也没有成功过!因为程序在哪里死循环住了!想想这样被移动牵着鼻子走也不是个事,干脆自定义数据标识头,也不要去搭理text/vnd.wap.wml是什么!接下来我贴一下关键代码:

客户端:

//cRef是自定义一个数据标识头,就是我们的关键,这个需双方协议定义好!这里我暂且为4,3,2,1.实际项目大家可复杂些为好!

byte[] cRef=new byte[4];
String url="http://125.120.160.11:8080";

//第一次发起连接

try {

conn = (HttpConnection) Connector.open("http://10.0.0.172"+"/WebModule1/uisevlet", 3,true);
conn.setRequestProperty("X-Online-Host", url);

conn.setRequestMethod (HttpConnection.POST);

conn.setRequestProperty ("Accept","*/*");

conn.setRequestProperty ("User-Agent","Profile/MIDP-2.0 Configuration/CLDC-1.0");

conn.setRequestProperty("Content-Length", "");//无发送数据
conn.setRequestProperty ("Connection", "Keep-Alive");

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

try {


dos=new DataOutputStream(conn.openOutputStream());
dis=new DataInputStream(conn.openInputStream());

//读取标识数据
dis.read(cRef, 0, cRef.length);

//此处为了方便测试,把标示数据转换成字符串显示在paint中,供程序员查看是否正确

strTest=String.valueOf(cRef[0]);
strTest1=String.valueOf(cRef[1]);
strTest2=String.valueOf(cRef[2]);
strTest3=String.valueOf(cRef[3]);

//如果不是我们协议中规定的,那么再次连接
while(cRef[0]!=3&&cRef[1]!=2&&cRef[2]!=1&&cRef[3]!=0)

{

//这里是对上次的连接进行关闭与释放
dos.close();

dos=null;

conn.close();

conn=null;

//再次连接

conn = (HttpConnection) Connector.open("http://10.0.0.172"+"/WebModule1/uisevlet", 3,true);
conn.setRequestProperty("X-Online-Host", url);

conn.setRequestMethod (HttpConnection.POST);

conn.setRequestProperty ("Accept","*/*");

conn.setRequestProperty ("User-Agent","Profile/MIDP-2.0 Configuration/CLDC-1.0");

conn.setRequestProperty("Content-Length", "");//请求无数据发送

conn.setRequestProperty ("Connection", "Keep-Alive");

//dos=new DataOutputStream(conn.openOutputStream());


dos=new DataOutputStream(conn.openOutputStream());
dis=new DataInputStream(conn.openInputStream());

//读取标识数据
dis.read(cRef, 0, cRef.length);
//此处为了方便测试,把标示数据转换成字符串显示在paint中,供程序员查看是否正确
strTest=String.valueOf(cRef[0]);
strTest1=String.valueOf(cRef[1]);
strTest2=String.valueOf(cRef[2]);
strTest3=String.valueOf(cRef[3]);
}

//连接成功
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();

}finally
{
try {if(dos!=null)
{


dos.close();
dos=null;
}
if(dis!=null)
{
dis.close();
dis=null;
}
if(conn!=null)
{
conn.close();
conn=null;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

服务端代码:

服务端是servlet写的!

import javax.servlet.http.*;
import java.io.*;
import java.util.*;

public class UISevlet extends HttpServlet {
private static final String CONTENT_TYPE = "text/html; charset=GBK";

//Initialize global variables
public void init() throws ServletException {
}


//Process the HTTP Post request
public void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
System.out.println("servlet启动");

//定义连接返回给客户端的标示数据
byte[] sSend=new byte[4];
//内容分别赋予4,3,2,1.这里只是简单设置,实际应用中为了数据安全可复杂些
for(int i=0;i<4;i++)
{
sSend[3-i]=(byte) i;
}

//建立输入输出流管道
ServletInputStream servletIn=request.getInputStream();
DataInputStream dis=new DataInputStream(servletIn);

ServletOutputStream servletOut=response.getOutputStream();
DataOutputStream dos=new DataOutputStream(servletOut);
response.setContentType("application/octet-stream");
//发送数据管道,servlet方式发送
/发送连接标示数据
dos.write(sSend);
dos.flush();
System.out.println("发送完毕");
System.out.println("is post");

}

//Clean up resources
public void destroy() {
}

}

新手之痛,我想每一个人多有过!我希望大家都有助人之心,这样我们的行业才会前进!才会扩大发展!没之前写的多!因为没思绪了!再此也谢谢曾今帮助过我的达人们!你们的回答没有白费,它已经促进了这个行业的进步!

你可能感兴趣的:(C++,c,servlet,C#,dos)