一直有一个疑问:CMWAP环境下是否可用Socket。以前没仔细去了解CMWAP,今天详细了解下:CMWAP是基于http协议的,所以用socket通信肯定是不行的。Http://10.0.0.172:80。从这可以看出,协议--http,端口--80,注意一个问题:协议是http,不是httpS。
在网上看到一篇文章:使用Socket连接穿越CMWAP代理(http://www.360doc.com/content/07/0309/16/3500_390662.shtml)
描述:CMWAP只是中国移动建立的一个HTTP网络服务器,所以在使用HTTP网络编程中,可以很方便的使用。但是在使用socket方法操作时,这个方式好象就行不通了。
文章中的代码没有去测试,手上没socket的地址,用到的时候再去研究吧。
----------------------------------------------------------------------------------------------------------------------------------------------
这个帖子中有一些可取的建议:http://www.iteye.com/topic/195584
cmnet才行,cmwap只能走http
需要证书是因为JavaME规范的问题,你用socket链接某些特殊的端口(http 80 8080,,wap9201~9203)等,需要证书,只要你服务器不是这些敏感端口,可以随意用socket链接的。不幸的是cmwap代理的端口就是80
CMWAP是不能走SOCKET的,要想走的话,要去移动登记注册
------------------------------------------------------------------------------------------------------------------------------------------------
上面提到的CMWAP只能用于http,非https。在网上找到一个文章,该文十分详细,顶楼主http://files.cnblogs.com/felixYeou/MySocketHttpConnection.rar
利用socket来解决这个问题
conn = (SocketConnection) Connector.open("socket://10.0.0.172:80", Connector.READ_WRITE, true);
conn.setSocketOption(SocketConnection.DELAY, 0);
conn.setSocketOption(SocketConnection.KEEPALIVE, 300);
// 发送和回复的请求
os = conn.openDataOutputStream();
is = conn.openDataInputStream();
// 在此我们使用HTTP 1.0,HTTP 1.1自己还需要处理chunk,比较麻烦
String reqStr = "GET https://ebs.95559.com.cn/corporbank/es_logon.jsp HTTP/1.0/r/n" +
"Host: ebs.95559.com.cn:443/r/n" +
"User-Agent: FelixBrowser/r/n" +
"Accept-Charset: utf-8;/r/n" +
"Connection: close;/r/n" +
"Accept-Language: zh-cn/r/n/r/n";
os.write(reqStr.getBytes());
os.flush();
该方法跟前面提到的使用Socket连接穿越CMWAP代理,原理都是一样:跟代理地址建立连接,再转发:GET https://ebs.95559.com.cn/corporbank/es_logon.jsp HTTP/1.0/r/n"
----------------------------------------------------------------------------------------------------------------------------
再次来研究get与post的不同之处:
Get----相对来说容易:所有的参数都附在url后面,不存在像post一样,需要打开输出流,将所有参数提交出去。
步骤:打开连接,获取响应的输入流,接受数据,就OK。
httpconnection = (HttpURLConnection) getUrl.openConnection();
httpconnection.setUseCaches(false);//设置一些参数
httpconnection.setRequestMethod("GET");
httpconnection.setConnectTimeout(connnetTime);
httpconnection.connect();
Post ----比get强大些,比如可以上传文件等...
httpconnection = (HttpURLConnection) postUrl.openConnection();//此处跟get相似
httpconnection.setRequestProperty("connection", "keep-alive");
httpconnection.setRequestMethod("POST");
httpconnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");//文件类型,若是文件上传,则要改变类型了,看下面的讲述
httpconnection.setRequestProperty("Content-Length", Integer.toString(postCon.getBytes().length));
httpconnection.setDoInput(true);//设置可以输入
httpconnection.setDoOutput(true);//设置可以输出
httpconnection.setUseCaches(false);
httpconnection.setConnectTimeout(connnetTime);////设置超时时间
//打开输出流,将参数提交出去,此处get是没有的
OutputStream out = httpconnection.getOutputStream();
DataOutputStream data = new DataOutputStream(out);
data.write(postCon.getBytes());
data.flush();
data.close();
out.close();
httpconnection.connect();//此处跟get相似
---------------------------------------------------------------------------------------------------------------------------------
关于application/x-www-form-urlencoded等字符编码的解释说明
application/x-www-form-urlencoded: 窗体数据被编码为名称/值对。这是标准的编码格式
multipart/form-data: 窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分。
text/plain:窗体数据以纯文本形式进行编码,其中不含任何控件或格式字符。
参考文章:http://www.xiaotai.com/article.asp?id=2125
收集到的一个上传文件类工具:
http://lgj573.iteye.com/blog/670273
http://student.csdn.net/space.php?uid=46868&do=blog&id=25873