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

📄 networkconnector.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
*/
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 + -