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

📄 network.java

📁 J2ME手机游戏50例
💻 JAVA
字号:
package demo;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Vector;

import javax.bluetooth.BluetoothStateException;
import javax.bluetooth.DeviceClass;
import javax.bluetooth.DiscoveryAgent;
import javax.bluetooth.DiscoveryListener;
import javax.bluetooth.LocalDevice;
import javax.bluetooth.RemoteDevice;
import javax.bluetooth.ServiceRecord;
import javax.bluetooth.UUID;
import javax.microedition.io.Connector;
import javax.microedition.io.StreamConnection;
import javax.microedition.io.StreamConnectionNotifier;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.Sprite;


public class NetWork implements DiscoveryListener {
	public static final int NETWORK_BUTTON			= 0;	//选择按钮
	//客户端状态
	public static final int NETWORK_FINDDEVICE		= 1;	//查找设备
	public static final int NETWORK_DEVICEFINDING		= 2;	//正在查找设备
	public static final int NETWORK_FINDSERVICE		= 3;	//查找服务
	public static final int NETWORK_SERVICEFINDING	= 4;	//正在查找服务
	public static final int NETWORK_NETSEL			= 5;	//选择网络
	//服务器端状态
	public static final int NETWORK_BUILDSERVER		= 6;	//建立服务
	public static final int NETWORK_LISTENCLIENT		= 7;	//监听客户
	//公共状态
	public static final int NETWORK_WRONG				= 8;	//没有网络
	public static final int NETWORK_GAME				= 9;	//游戏状态
	public static final int NETWORK_STATE_NUM			= 10;	//状态总数
	private int m_nState = NETWORK_BUTTON;
	
	private Sprite		m_NetButtonSp;							//联网按钮
	private int		m_nBnSel;								//当前选择的按钮
	private int		m_nCurNet;								//当前选择的网络
	public 	boolean	m_bServer;								//是否是服务器
	private DataInputStream m_InputDs;
	private DataOutputStream m_OutputDs;
	
	private StreamConnectionNotifier m_Notifier;
	private StreamConnection m_Conn;
	
	//响应服务的UUID 
	private static final UUID BTFIVE_UUID = new UUID( 
            "F0E0D0C0B0A000908476605040302015", false); 
	private DiscoveryAgent m_Agent; 
	
	private Vector m_Devices = new Vector(); 			//设备集合
	private Vector m_Records = new Vector();			//服务集合  
	     
	int[] m_TransIDs;									//服务搜索的事务id集合 
	
	public NetWork(){
		try{
			Image img = Image.createImage("/demo/conbutton.png");
			m_NetButtonSp = new Sprite(img, 53, 21);
		}
		catch (Exception ex){}
	}
	public void setState( int state ){
		if( state < 0 || state >= NETWORK_STATE_NUM )
			return;
		m_nState = state;
	}
	public int getState(){
		return m_nState;
	}
	/*****
	 * 联网界面中,处理按键的输入
	 * @参数 keyStates.....当前的按键状态
	 * @返回所选联网按钮的类型
	 */
	public int Input( int keyStates, Grids grid ){
		switch( m_nState ){
		case NETWORK_BUTTON:						//选择按钮
			{
				if( ( keyStates & GameCanvas.UP_PRESSED ) != 0 )
					m_nBnSel --;
				if( ( keyStates & GameCanvas.DOWN_PRESSED ) != 0 )
					m_nBnSel ++;
				if( m_nBnSel < 0 )
					m_nBnSel = 0;
				if( m_nBnSel >= m_NetButtonSp.getFrameSequenceLength() )
					m_nBnSel = m_NetButtonSp.getFrameSequenceLength() - 1;
				if( ( keyStates & GameCanvas.FIRE_PRESSED ) != 0 ){
					if( m_nBnSel == 0 ){
						m_bServer = true;
						setState(NETWORK_BUILDSERVER);
					}
					else{
						m_bServer = false;
						setState(NETWORK_FINDDEVICE);
					}
				}
			}
			break;
		case NETWORK_NETSEL:						//选择服务
			{
				if( ( keyStates & GameCanvas.UP_PRESSED ) != 0 )
					m_nCurNet --;
				if( ( keyStates & GameCanvas.UP_PRESSED ) != 0 )
					m_nCurNet ++;
				if( m_nCurNet < 0 )
					m_nCurNet = 0;
				if( m_nCurNet >= m_Records.size() )
					m_nCurNet = m_Records.size() - 1;
				if( ( keyStates & GameCanvas.FIRE_PRESSED ) != 0 ){
					ServiceRecord sr=(ServiceRecord)m_Records.elementAt(m_nCurNet);
					if( accessService(sr) ){
						setState(NETWORK_GAME);
						grid.m_nNetState = Grids.NET_WAIT;
					}
					else
						setState(NETWORK_WRONG);
				}
			}
			break;
		case NETWORK_GAME:							//进行游戏
			return grid.NetInput(keyStates, this);
		}
		return 0;
	}
	public void Logic(){
		switch( m_nState ){
		case NETWORK_FINDDEVICE:					//查找设备
			{
				try { 
		            LocalDevice localDevice = LocalDevice.getLocalDevice(); 
		            m_Agent = localDevice.getDiscoveryAgent(); 
		        } 
		        catch( BluetoothStateException e ){
		        	e.printStackTrace();
		        	setState(NETWORK_WRONG);
		        	return;
		        }
		        try { 
		        	m_Agent.startInquiry(DiscoveryAgent.GIAC, this); 
		        } 
		        catch (BluetoothStateException e) {
		        	e.printStackTrace();
		        	setState(NETWORK_WRONG);
		        	return;
		        }
		        setState(NETWORK_DEVICEFINDING);
			}
			break;
		case NETWORK_FINDSERVICE:					//查找服务
			{
				UUID[] uuidSet = new UUID[1];  
		        uuidSet[0] = BTFIVE_UUID; 
				m_TransIDs = new int[m_Devices.size()]; 
		        for (int i = 0; i < m_Devices.size(); i++) { 
		            RemoteDevice rd = (RemoteDevice) m_Devices.elementAt(i); 
		            try { 
		                //记录每一次服务搜索的事务id 
		            	m_TransIDs[i] = m_Agent.searchServices(null, uuidSet, 
		                        rd, this); 
		            } 
		            catch (BluetoothStateException e) { 
		                continue; 
		            } 
		        } 
		        setState(NETWORK_SERVICEFINDING);
			}
			break;
		case NETWORK_BUILDSERVER:					//建立服务
			{
				try { 
					LocalDevice localDevice = LocalDevice.getLocalDevice(); 

					if (!localDevice.setDiscoverable(DiscoveryAgent.GIAC)) { 
						setState(NETWORK_WRONG);
						return;
					} 
					StringBuffer url = new StringBuffer("btspp://"); 
					url.append("localhost").append(':'); 
					url.append(BTFIVE_UUID.toString()); 
					url.append(";name=BTFIVE Server"); 
					url.append(";authorize=false"); 
					m_Notifier = (StreamConnectionNotifier) Connector 
				           .open(url.toString());  
				} 
				catch (Exception e) { 
					e.printStackTrace(); 
					setState(NETWORK_WRONG);
					return;
				}
				setState(NETWORK_LISTENCLIENT);
			}
			break;
		case NETWORK_LISTENCLIENT:					//监听客户
			{
				try{ 
					m_Conn = m_Notifier.acceptAndOpen(); 
				} 
				catch (IOException e) {
					return;
				} 
				setState(NETWORK_GAME);
			}
			break;
		}
	}
	public void Paint(Graphics g, int scrWidth, int scrHeight){
		switch( m_nState ){
		case NETWORK_BUTTON:
			{
				int x = scrWidth/2 - m_NetButtonSp.getWidth()/2;
				int y = scrHeight/2 - m_NetButtonSp.getHeight();
				for( int n = 0; n < 2; n ++ ){
					if( n == m_nBnSel )
						m_NetButtonSp.setFrame(n);
					else
						m_NetButtonSp.setFrame(n+2);
					m_NetButtonSp.setPosition(x, y);
					m_NetButtonSp.paint(g);
					y = y + m_NetButtonSp.getHeight();						
				}
			}
			break;
		case NETWORK_FINDDEVICE:
		case NETWORK_DEVICEFINDING:
			g.drawString("正在查找设备...", scrWidth/2 - 20, scrHeight/2, 0);
			break;
		case NETWORK_FINDSERVICE:
		case NETWORK_SERVICEFINDING:
			g.drawString("正在查找服务...", scrWidth/2 - 20, scrHeight/2, 0);
			break;
		case NETWORK_NETSEL:
			int x = scrWidth/2 - 40;
			int y = 20;
			g.drawString("请选择网络...", scrWidth/2 - 20, scrHeight/2, 0);
			y = y + 30;
			for( int n = 0; n < m_Records.size() && n < 5; n ++ ){
				ServiceRecord sr = (ServiceRecord)m_Records.elementAt(n);
				g.drawString(sr.toString(), x, y, 0);
				if( n == m_nCurNet ){
					g.drawRect(x-1, y-1, scrWidth - (x * 2), g.getFont().getHeight() );
				}
				y = y + 20;
			}
			break;
		case NETWORK_BUILDSERVER:
			g.drawString("正在建立服务...", scrWidth/2 - 30, scrHeight/2-20, 0);
			break;
		case NETWORK_LISTENCLIENT:
			g.drawString("等待客户连接...", scrWidth/2 - 30, scrHeight/2-20, 0);
			break;
		case NETWORK_WRONG:
			g.drawString("网络出错...", scrWidth/2 - 30, scrHeight/2-20, 0);
			try {
				if( m_OutputDs != null ){
					m_OutputDs.close();
					m_OutputDs = null;
				}
				if( m_InputDs != null ){
					m_InputDs.close();
					m_InputDs = null;
				}
			} catch (IOException e) {
				e.printStackTrace();
			} 
			break;
		}
	}
	
	public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) { 
		
		if (m_Devices.indexOf(btDevice) == -1) { 
			m_Devices.addElement(btDevice); 
		} 
	} 
	/** 
	 * 回调方法,唤醒初始化线程 
	 */ 
	public void inquiryCompleted(int discType) { 
		setState(NETWORK_FINDSERVICE);
	} 
	/** 
	 * 回调方法 
	 */ 
	public void servicesDiscovered(int transID, ServiceRecord[] servRecord) { 
	    for (int i = 0; i < servRecord.length; i++) { 
	        m_Records.addElement(servRecord[i]); 
	    } 
	} 
	/** 
	 * 回调方法,唤醒初始化线程 
	 */ 
	public void serviceSearchCompleted(int transID, int respCode) { 
	     
	    for (int i = 0; i < m_TransIDs.length; i++) { 
	        if (m_TransIDs[i] == transID) { 
	        	m_TransIDs[i] = -1; 
	            break; 
	        } 
	    } 
	     
	    //如果所有的设备都已经搜索服务完毕,则唤醒初始化线程。 
	    boolean finished = true; 
	    for (int i = 0; i < m_TransIDs.length; i++) { 
	        if (m_TransIDs[i] != -1) { 
	            finished = false; 
	            break; 
	        } 
	    } 
	    if (finished) { 
	    	if( m_Records.size() > 0 )
	    		setState(NETWORK_NETSEL);
	    	else
	    		setState(NETWORK_WRONG);
	    } 
	} 
	//连接服务
	private boolean accessService(ServiceRecord sr){  
		boolean bResult = true;
		try { 
			String url = sr.getConnectionURL( 
                    ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false); 
            m_Conn = (StreamConnection) Connector.open(url);             
        } catch (IOException e) { 
             e.printStackTrace();
             bResult = false;
        } 
        return bResult;
    } 
	//发送数据
	public void SendData( byte[] data ){
		try {
			if( m_OutputDs == null )
				m_OutputDs = m_Conn.openDataOutputStream();
			m_OutputDs.write(data);
		} catch (IOException e) {
			e.printStackTrace();
			setState(NETWORK_WRONG);
		} 
	}
	//接收数据
	public void ReadData( byte[] data ){
		try {
			if( m_InputDs == null )
				m_InputDs = m_Conn.openDataInputStream();
			m_InputDs.read(data);
		} catch (IOException e) {
			e.printStackTrace();
			setState(NETWORK_WRONG);
		} 
	}
}

⌨️ 快捷键说明

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