网络连接模块

    技术2022-05-19  27

    一直有一个疑问: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

     

     

     

     

     

     


    最新回复(0)