cmnet和cmwap的访问

CMWAP(通过WAP网关代理,由WAP网关连接服务器,然后将服务器返回的结果转发给客户端)和CMNET(使用直接连接互联网的方式与服务器通信)是中国移动提供的两种网络接入方式,CMWAP实际上是一种客户端 <--> WAP网关 <--> 服务器的连接方式,而CMNET采用的是客户端 <--> 服务器直连方式。

 

public class ActionDispatcher extends MIDlet {
	private Display display = Display.getDisplay(this);
	private Form f;
	
	protected void startApp() throws MIDletStateChangeException {
		f = new Form("Network Test");
		f.append("正在连接网络, 情稍候;当出现cmwap和cmnet字样时,程序结束,可退出");
		display.setCurrent(f);
		try {
			cmwap(); // 电脑模拟器无法访问wap网络,除非电脑能够访问的中国移动的wap网关。这个要通过手机测试。
			cmnet();
		} catch (IOException e) {
			e.printStackTrace();
		}
		f.append("程序运行结束,可退出");
		display.setCurrent(f);
	}

	private void cmwap() throws IOException {
		HttpConnection conn = null;
		InputStream is = null;
		if (f.size() > 0) f.delete(0); // cmwap()是先执行的,后执行的cmnet()不必执行Form.delete()方法
		try {
			conn = (HttpConnection) Connector.open("http://10.0.0.172:80/", Connector.READ_WRITE, true);
			conn.setRequestProperty("X-Online-Host", "wap.sina.com");
//			conn.setRequestProperty("Accept", "*/*");
			is = conn.openInputStream();
			f.append("cmwap: no exception, test passed");
		} catch (Exception e) {
			f.append("cmwap failed: " + e.toString());
		} finally {
			if (is != null) {
				is.close();
				is = null;
			}
			if (conn != null) {
				conn.close();
				conn = null;
			}
			f.append("\n");
		}
	}
	private void cmnet() throws IOException {
		HttpConnection conn = null;
		InputStream is = null;
		try {
            conn = (HttpConnection) Connector.open("http://wap.sina.com/", Connector.READ_WRITE, true); // timeouts - A flag to indicate that the caller wants timeout exceptions
            is = conn.openInputStream();
            f.append("cmnet: no exception, test passed");
        } catch (Exception e) {
        	f.append("cmnet failed: " + e.toString());
        } finally {
			if (is != null) {
				is.close();
				is = null;
			}
			if (conn != null) {
				conn.close();
				conn = null;
			}
			f.append("\n");
		}
	}
	protected void pauseApp() {}
	protected void destroyApp(boolean arg0) throws MIDletStateChangeException {}
}

经由CMWAP方式接入时,MIDlet直接和WAP网关建立连接,地址是10.0.0.172。同时,MIDlet应该在Http头(Header)中添加下面的信息,X-Online-Host:联网服务器的域名和端口,这样WAP网关作为代理向服务器转发请求。同时可以在HTTP头中添加一些字段,例如User Agent等。

 

再发一个Demo

public HttpConnection openCMWAP(String url, String contentType) throws IOException {
	HttpConnection httpConn = null;
	for (int i = 0; i < 5; i++) { // 连接5次,如果5次都不成功,说明网络or服务器有问题
		if (httpConn != null) httpConn.close();
		httpConn = (HttpConnection) Connector.open(url, Connector.READ);
		httpConn.setRequestMethod(HttpConnection.GET);
		if (httpConn.getHeaderField("Content-Type").indexOf(contentType) > -1) {
			if (httpConn.getResponseCode() == HttpConnection.HTTP_OK) {
				return httpConn;
			}
			break;
		}
	}
	throw new IOException("Max Connector open count.");
}
public HttpConnection openCMNET(String url, String contentType) throws IOException {
	String proxy = "http://10.0.0.172";
	String serverName = null;
	boolean needProxy = false;
	if (proxy != null && proxy.length() > 0) {
		needProxy = true;
		// http://servername/filename
		serverName = url.substring(0, (url.indexOf("/", 7) + 1));
		url = proxy + "/" + url.substring(url.indexOf("/", 7) + 1, url.length());
	}
	HttpConnection httpConn = null;
	for (int i = 0; i < 5; i++) {
		if (httpConn != null) httpConn.close();
		httpConn = (HttpConnection) Connector.open(url, Connector.READ, true);
		if (needProxy) {
			httpConn.setRequestProperty("X-Online-Host", serverName);
			httpConn.setRequestProperty("Accept", "*/*");
		}
		httpConn.setRequestMethod(HttpConnection.GET);
		if (httpConn.getHeaderField("Content-Type").indexOf(contentType) > -1) {
			if (httpConn.getResponseCode() == HttpConnection.HTTP_OK) {
				return httpConn;
			}
			break;
		}
	}
	throw new IOException("Max Connector open count.");
}

你可能感兴趣的:(互联网,F#,中国移动,WAP)