📄 networkmanager.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 + -