📄 networkconnector.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
*/
final class NetworkConnector implements NetworkListener{
/**
* 网络部分的事件队列。
*/
private Vector events;
/**
* 队列中存储的事件正常数量。
*/
private int eventNormalCapacity;
/**
* 当前网络连接器。
*/
private NetworkListener currentConnector;
/**
* 网络连接器是否启动,true:启动,false:不启动。
*/
private static boolean isStartup;
/**
* 是否清除剩余的网络事件,true:清除,false:保留。
*/
static boolean removeEvents;
/**
* 网络连接器是否处于连接状态,true:处于连接状态,false:空闲状态。
*/
private boolean isConnecting;
/**
* constructor。
* @param <b>_maxEvent</b> 联网事件队列的最大长度。
*/
NetworkConnector(int _maxEvent){
if(NetworkManager.connectionMode == NetworkManager.SOCKET_CONNECTION_MODE){//获取Socket连接器
currentConnector = new SocketConnector();
}else{//获取HTTP连接器
currentConnector = new HttpConnector();
}
events = new Vector((eventNormalCapacity = _maxEvent), 1);
isStartup = true;
removeEvents = false;
new Thread(currentConnector).start();
}
/**
* 唤醒网络连接器。
*/
synchronized final void wakeUp(){
isConnecting = false;
notify();
}
/**
* 检查连接器是否启动。
* @return 是否启动,true:启动,flase:没有启动。
*/
static boolean checkIsStartup(){
return isStartup;
}
/**
* 加入网络事件。
* @param <b>_eventBody</b> 加入的网络事件的事件主体,具体由使用者自己写入。
*/
public synchronized final void addEvent(byte[] _eventBody){
events.addElement(_eventBody);
notify();
}
/**
* 关闭监听。
*/
public synchronized final void terminate(){
isStartup = false;
notify();
}
/**
* 网络连接器主体。<br>
* 如果网络引擎还没有启动,运行到此会被忽略。
*/
public final void run(){
if(NetworkManager.isStartup){
try{
while(isStartup){
//如果没有事件并且没有得到退出指令或者还在前一事件的处理过程,就需要等待
while(isConnecting || (events.isEmpty() && isStartup)){
if(!isConnecting && removeEvents){//非连接状态进入,说明没有新的事件,但是要求清除剩余的网络事件,因此不必清除,但是,需要修改标志位
removeEvents = false;
}
synchronized(this){
wait();
}
}
if(removeEvents){//需要清除剩余的网络事件,清除之后修改标志位,循环从开始继续,不必执行下面的操作
events.removeAllElements();
removeEvents = false;
continue;
}
if(!isStartup){
break;
}
try{
//检测当前的网络连接模式,如果有本质的变化,就需要调整了
//这个时候的网络连接应该是都已经完成的
if(NetworkManager.connectionMode != NetworkManager.renovateConnectionMode){
//首先是要保留刷新联网模式
int currentRenovateConnectionMode = NetworkManager.renovateConnectionMode;
if(currentRenovateConnectionMode == NetworkManager.SOCKET_CONNECTION_MODE || NetworkManager.connectionMode == NetworkManager.SOCKET_CONNECTION_MODE){
//关闭当前的连接器
if(currentConnector != null){
currentConnector.terminate();
currentConnector = null;
System.gc();
}
if(currentRenovateConnectionMode == NetworkManager.SOCKET_CONNECTION_MODE){//刷新的联网模式是socket模式,旧的联网模式是http模式,需要关闭旧的联网模式下面的流,并且,与主机建立socket连接
currentConnector = new SocketConnector();
}else if(NetworkManager.connectionMode == NetworkManager.SOCKET_CONNECTION_MODE){//旧的联网模式是socket模式,刷新的联网模式是http模式,需要关闭旧的联网模式下面的流
currentConnector = new HttpConnector();
}
//重新启动
new Thread(currentConnector).start();
}
//做完需要的调整之后,最后的调整就是统一两个联网模式
NetworkManager.connectionMode = currentRenovateConnectionMode;
}
//确定是在网络连接状态
isConnecting = true;
//加入网络事件
currentConnector.addEvent((byte[])(events.elementAt(0)));
}catch(Throwable t){
EngineManager.debugEngine(t, null);
//连接过程中发生了异常,需要用错误数据处理方法分析原因
try{
NetworkConnector.removeEvents = NetworkManager.networkRequestHandle.errorDataHandle(NetworkManager.LOCAL_DATA_ERROR, ++NetworkManager.failedTimes);
}catch(Throwable tt){
EngineManager.debugEngine(tt, null);
}
}finally{
//清除队列
events.removeElementAt(0);
//需要确保队列的容量保持在希望的数字之内
if(events.capacity() > eventNormalCapacity){
events.trimToSize();
}
System.gc();
}
}
}catch(Exception e){
EngineManager.debugEngine(e, null);
}finally{
//结束网络管理器之前做的收尾动作
//关闭当前的连接器&关闭所有的流
if(currentConnector != null){
currentConnector.terminate();
currentConnector = null;
}
//清除网络事件队列
if(events != null){
events.removeAllElements();
events = null;
}
//清除处理类实例
NetworkManager.networkRequestHandle = null;
//清除网络连接的url
NetworkManager.url = null;
//清理网络连接实例
NetworkManager.networkConnector = null;
//一切终止之后,标记结束
NetworkManager.isStartup = false;
System.gc();
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -