⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 networkmanager.java

📁 j2me编写的游戏基础引擎,作为学习很不错.
💻 JAVA
字号:
package engine.optional.network;

import javax.microedition.lcdui.*;
import javax.microedition.rms.*;
import javax.microedition.io.*;
import java.util.*;
import java.io.*;
import engine.kernel.*;

/**
*	网络管理器
*	@author 贾永明
*	@version 2.8.0
*	@since HuoHouStudioEngine1.0
*/
public final class NetworkManager{
	/**
	*	本地数据错误,在还没有打开网络连接的时候发生这个错误。
	*/
	public final static int LOCAL_DATA_ERROR = -1;
	/**
	*	连接状态之后发生的异常。
	*/
	public final static int CONNECTED_DATA_ERROR = -2;
	/**
	*	目标连接无法找到发生的异常。
	*/
	public final static int INVALID_CONNECTION_ERROR = -3;
	/**
	*	联网模式中的cmwap的代理模式,即http移动网关模式。
	*/
	public final static byte AGENT_CONNECTION_MODE = 0;
	/**
	*	联网模式中的cmwap的非代理模式,即http直联模式。
	*/
	public final static byte DIRECT_CONNECTION_MODE = 1;
	/**
	*	联网模式中的cmnet的接入模式,即socket模式。
	*/
	public final static byte SOCKET_CONNECTION_MODE = 2;
	/**
	*	联网模式。<br>
	*	AGENT_CONNECTION_MODE(0):联网模式中cmwap的代理模式,即http移动网关模式。<br>
	*	DIRECT_CONNECTION_MODE(1):联网模式中cmwap的非代理模式,即http直联模式。<br>
	*	SOCKET_CONNECTION_MODE(2):联网模式中cmnet的模式,即socket模式。<br>
	*	默认的是联网模式中cmwap的代理模式,即http移动网关模式。
	*/
	static int connectionMode;
	/**
	*	刷新的联网模式。<br>
	*	AGENT_CONNECTION_MODE(0):联网模式中cmwap的代理模式,即http移动网关模式。<br>
	*	DIRECT_CONNECTION_MODE(1):联网模式中cmwap的非代理模式,即http直联模式。<br>
	*	SOCKET_CONNECTION_MODE(2):联网模式中cmnet的模式,即socket模式。<br>
	*	默认的是联网模式中cmwap的代理模式,即http移动网关模式。
	*/
	static int renovateConnectionMode;
	/**
	*	RMS中存储联网模式的记录的名字。
	*/
	private static String rsNameOfConnectionMode;
	/**
	*	网络连接的url。<br>
	*	本引擎的url并不是RFC 2396中规定的完全意义的url,在这个规定中url组成如下:<br>
	*	<b>{scheme}:[{target}][{params}]</b><br>
	*	{scheme}表示的采用的是什么协议,比如http或者socket。<br>
	*	{target}表示的是某种类新的网络地址,比如www.sina.com.cn,www.163.com:80,127.0.0.1,127.0.0.1:80,等等。<br>
	*	{params}表示一系列的“;x=y”组成形式的参数,比如“;type=1”。<br>
	*	本引擎的url实际仅仅是<b>[{target}][{params}]</b>部分。
	*	<b>请注意:由于以上的原因,所以,本引擎的联网协议并不能够通过url的协议头来确定。真正确定联网的协议的是renovateConnectionMode这个参数,这个参数的默认方式所采用的协议是HTTP协议,而这个参数是通过方法public final static void setConnectionMode(byte _renovateConnectionMode)来设置的。</b>
	*/
	static String url;
	/**
	* 	网络管理器的实例。
	*/
	static NetworkConnector networkConnector;
	/**
	*	网络请求处理类的实例。
	*/
	static NetworkRequestHandle networkRequestHandle;
	/**
	*	网络管理器是否启动,true:启动,false:不启动。
	*/
	static boolean isStartup;
	/**
	*	连接流。
	*/
	static StreamConnection streamConnection;
	/**
	*	请求流。
	*/
	static DataOutputStream request;
	/**
	*	响应流。
	*/
	static DataInputStream response;
	/**
	*	联网的响应代码。
	*/
	static int responseCode;
	/**
	*	联网的失败次数。
	*/
	static int failedTimes;
	/**
	*	constructor。<br>不可以产生NetworkManager的实例。
	*/
	private NetworkManager(){
	}
	/**
	*	启动网络。<br>
	*	如果网络引擎还没有启动,调用此方法无任何作用。<br>
	*	本方法会根据最近一次设定选择联网的模式,如果选择失败会抛出异常<br>Error: read <EM>rsNameOfConnectionMode</EM>
	*	@param <b>_networkRequestHandle</b> 网络请求处理实例,如果为null,会抛出异常<br>Error: network can't startup
	*	@param <b>_rsNameOfConnectionMode</b> 联网模式的记录存储的名字,如果为null,会抛出异常<br>Error: network can't startup
	*	@param <b>_url</b> 联网的地址,如果为null,会抛出异常<br>NullPointerException<br>参考{@link engine.optional.network.NetworkManager#setURL(String) setURL(String _url)}。
	*	@param <b>_maxEvent</b> 联网事件队列的最大长度,如果为负数或0,会抛出异常<br>Error: network can't startup
	*/
	public final static void  startup(NetworkRequestHandle _networkRequestHandle, String _rsNameOfConnectionMode, String _url, int _maxEvent){
	 	if(!isStartup){
	 		if(_networkRequestHandle == null || _rsNameOfConnectionMode == null || _url == null || _maxEvent <= 0){
	 			throw new Error("network can't startup");
	 		}
			isStartup = true;
			failedTimes = 0;
	 		networkRequestHandle = _networkRequestHandle;
	 		if(rsNameOfConnectionMode == null){
	 			rsNameOfConnectionMode = _rsNameOfConnectionMode;
	 		}
	 		connectionModeRMSOperate(0);
	 		connectionMode = renovateConnectionMode;
			updateURL(_url);
	 		networkConnector = new NetworkConnector(_maxEvent);
	 		new Thread(networkConnector).start();
	 	}
	}
	/**
	*	关闭网络。<br>
	*	如果网络引擎还没有启动,调用此方法会被忽略。
	*/
	public final static void terminate(){
		if(isStartup){
			if(NetworkConnector.checkIsStartup()){
				networkConnector.terminate();
			}
		}
	}
	/**
	*	加入网络事件。<br>
	*	如果网络引擎还没有启动,调用此方法会被忽略。<br>
	*	@param <b>eventBody</b> 加入的网络事件的事件主体,具体由使用者自己写入。
	*/
	public final static void addEvent(byte[] eventBody){
		if(isStartup){
			if(NetworkConnector.checkIsStartup()){
				networkConnector.addEvent(eventBody);
			}
		}
	}
	/**
	*	修改当前联网模式。<br>
	*	如果网络引擎还没有启动,调用此方法会被忽略。
	*	@param <b>_renovateConnectionMode</b> 新的联网模式。<br><br>
	*	AGENT_CONNECTION_MODE(0):联网模式中cmwap的代理模式,即http移动网关模式。<br>
	*	DIRECT_CONNECTION_MODE(1):联网模式中cmwap的非代理模式,即http直联模式。<br>
	*	SOCKET_CONNECTION_MODE(2):联网模式中cmnet的模式,即socket模式。<br>
	*	注意:<br>
	*	① 当参数_renovateConnectionMode不属于以上三种情况的时候,会抛出异常<br>Error: invalid connection-mode<br>
	*	② 当参数是SOCKET_CONNECTION_MODE并且当前简表版本是MIDP-1.0的时候,会抛出异常<br>Error: socket isn't supported by the platform<br>因为MIDP-1.0还不支持socket的连接模式。<br>
	*	③ 本方法会把新的联网模式保存起来,当保存失败的时候会抛出异常<br>Error: write <EM>rsNameOfConnectionMode</EM><br>其中的rsNameOfConnectionMode是由具体的联网模式在记录存储中的记录的名字确定的,不过,需要提醒的是,只要调用这个方法,不管是否保存成功,运行环境的联网模式都已经被修改。<br>
	*/
	public final static void setConnectionMode(int _renovateConnectionMode){
		if(isStartup){
			if(_renovateConnectionMode < AGENT_CONNECTION_MODE || _renovateConnectionMode > SOCKET_CONNECTION_MODE){
				throw new Error("invalid connection-mode");
			}
			if(_renovateConnectionMode == SOCKET_CONNECTION_MODE && EngineManager.checkProperty("microedition.profiles", "MIDP-1.0")){//检测当前简表的版本
				//j2me标准的socket连接是在midp2.0的时候才实现的,所以如果是midp1.0版本平台就认为不支持socket连接
				throw new Error("socket isn't supported by the platform");
			}
			if(NetworkConnector.checkIsStartup()){
				renovateConnectionMode = _renovateConnectionMode;
				connectionModeRMSOperate(1);
			}
		}
	}
	/**
	*	获得当前联网模式。
	*	@return 当前联网模式。<br>
	*	AGENT_CONNECTION_MODE(0):联网模式中cmwap的代理模式,即http移动网关模式。<br>
	*	DIRECT_CONNECTION_MODE(1):联网模式中cmwap的非代理模式,即http直联模式。<br>
	*	SOCKET_CONNECTION_MODE(2):联网模式中cmnet的模式,即socket模式。<br>
	*	如果网络引擎还没有启动,调用此方法会返回-1。<br>
	*	如果网络引擎已经关闭,调用此方法会返回-1。
	*/
	public final static int getConnectionMode(){
		if(!isStartup || !NetworkConnector.checkIsStartup()){
			return -1;
		}else{
			return renovateConnectionMode;
		}
	}
	/**
	*	对联网模式的记录存储的操作的内部方法。<br>
	*	当保存失败的时候会抛出异常<br>Error: write <EM>rsNameOfConnectionMode</EM><br>其中的rsNameOfConnectionMode是由具体的联网模式在记录存储中的记录的名字确定的。<br>
	*	当读取失败的时候会抛出异常<br>Error: read <EM>rsNameOfConnectionMode</EM><br>其中的rsNameOfConnectionMode是由具体的联网模式在记录存储中的记录的名字确定的。
	*	@param <b>operateID</b> 操作ID,即那种操作类型,总共有三种:0 代表读取操作,1 代表写入的联网模式。
	*/
	private final static void connectionModeRMSOperate(int operateID){
		if(rsNameOfConnectionMode != null){
			RecordStore rs = null;
			try{
				rs = RecordStore.openRecordStore(rsNameOfConnectionMode, true);
				if(operateID == 0){
					if(rs.getNumRecords() > 0){//有记录
						renovateConnectionMode = rs.getRecord(1)[0];
					}
				}else{
					byte[] cMode = new byte[]{(byte)renovateConnectionMode,};
					if(rs.getNumRecords() > 0){//有记录
						rs.setRecord(1, cMode, 0, 1);
					}else{
						rs.addRecord(cMode, 0, 1);
					}
				}
			}catch(Exception e){
				throw new Error((operateID == 0 ? "read" : "write") + " " + rsNameOfConnectionMode);
			}finally{
				if(rs != null){
					try{
						rs.closeRecordStore();
					}catch(Exception e){
						EngineManager.debugEngine(e, null);
					}
					rs = null;
					System.gc();
				}
			}
		}
	}
	/**
	*	获取联网地址。<br>
	*	@return 联网地址。<br>
	*	如果网络引擎还没有启动,调用此方法会返回null。<br>
	*	如果网络引擎已经关闭,调用此方法会返回null。<br>
	*/
	public final static String getURL(){
		return (NetworkConnector.checkIsStartup() && isStartup ? url : null);
	}
	/**
	*	修改联网地址。<br>
	*	如果网络引擎还没有启动,调用此方法会被忽略。
	*	@param <b>_url</b> 新的联网地址,如果为null,会抛出异常<br>NullPointerException<br><br>
	*	本引擎的url并不是RFC 2396中规定的完全意义的url,在这个规定中url组成如下:<br>
	*	<b>{scheme}:[{target}][{params}]</b><br>
	*	{scheme}表示的采用的是什么协议,比如http或者socket。<br>
	*	{target}表示的是某种类新的网络地址,比如www.sina.com.cn,www.163.com:80,127.0.0.1,127.0.0.1:80,等等。<br>
	*	{params}表示一系列的“;x=y”组成形式的参数,比如“;type=1”。<br>
	*	本引擎的url实际仅仅是<b>[{target}][{params}]</b>部分。<br>
	*	<b>请注意:由于以上的原因,所以,本引擎的联网协议并不能够通过url的协议头来确定。真正确定联网的协议的是renovateConnectionMode这个参数,这个参数的默认方式所采用的协议是HTTP协议,而这个参数是通过方法public final static void setConnectionMode(byte _renovateConnectionMode)来设置的。</b>
	*/
	public final static void setURL(String _url){
		if(isStartup){
			if(NetworkConnector.checkIsStartup()){
				updateURL(_url);
			}
		}
	}
	/**
	*	修改联网地址。
	*	@param <b>_url</b> 新的联网地址,如果为null,会抛出异常<br>NullPointerException
	*/
	private final static void updateURL(String _url){
		if(_url.substring(0, 7).toLowerCase().equals("http://")){
			_url = _url.substring(7);
		}else if(_url.substring(0, 9).toLowerCase().equals("socket://")){
			_url = _url.substring(9);
		}
		url = null;
		System.gc();
		url = _url;
	}
	/**
	*	关闭流。
	*/
	final static void closeAllIO(){
		//响应流
		if(response != null){
			try{
				response.close();
			}catch(Exception e){
				EngineManager.debugEngine(e, null);
			}
			response = null;
		}
		//请求流
		if(request != null){
			try{
				request.close();
			}catch(Exception e){
				EngineManager.debugEngine(e, null);
			}
			request = null;
		}
		//连接流
		if(streamConnection != null){
			try{
				streamConnection.close();
			}catch(Exception e){
				EngineManager.debugEngine(e, null);
			}
			streamConnection = null;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -