大家看到这篇文章,我心情真的是很沉重的。为什么?那我告诉你,我现在写的是第二遍~刚才准备提交的时候不小心按到什么。。。没啦!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() {
}
}
新手之痛,我想每一个人多有过!我希望大家都有助人之心,这样我们的行业才会前进!才会扩大发展!没之前写的多!因为没思绪了!再此也谢谢曾今帮助过我的达人们!你们的回答没有白费,它已经促进了这个行业的进步!