当前位置: 代码迷 >> 综合 >> 蓝牙休闲娱乐平台(毕业设计)第三部份
  详细解决方案

蓝牙休闲娱乐平台(毕业设计)第三部份

热度:67   发布时间:2024-01-10 00:36:56.0

 

/**
 * Copyright@scholar_ii 
 * 
@author 梧州学院 04计本2班 罗功武
 * date 08/02/27
 
*/

package  flat;

import  javax.microedition.lcdui.Alert;
import  javax.microedition.lcdui.AlertType;
/**
 * HelpWindow 类
 * 简单的介绍平台的功能与游戏帮助
 
*/

public   class  HelpWindow  extends  Alert  {
    
    
public HelpWindow( ){
        
super("平台介绍与帮助 "null,null,AlertType.INFO);
        setString(
"平台的娱乐功能 " +
                
"进行聊天与游戏 " + 
                
"游戏规则介绍 " + 
                
"五子棋的变种 " + 
                
"玩家只能在棋盘的下方左右移动,且所下的棋于向上填充空的棋格为原则" +
                
"当玩家所填的棋在四个方向为四个的时候方为输 " +
                
"本娱乐平台有很多不足之处,请见谅 " + 
                
"编者:罗功武  " +
                
"联系方式:scholar_ii@163.com");
        setTimeout(Alert.FOREVER);
        
    }

}

 

 一下步我将在介绍的是common包中的类,里边的两个类对于整个系统来说是非常重要的。
同时它俩所涉及到JSR82API的应用。所以这个包的这两个类功能实现是一个技术点。先介绍ServiceSearcher类,这个类我是这样设计的。ServiceSearcher类实现两个接口,第一个接口是Runnable,这样做的目的是使其成为一个线程类,其它类调用它的时候就是会再后台产生一个任务线程。第二个接口就是DiscoveryListener,这个目的当然是为要利用JSR82中的API,有关与蓝牙收搜设备与服务的模式与方法并是不很难理解的,具体的实现大家可以看代码的,我想提的是代码里边我利用到了线程同步的机制,还有就是如何获取用户服务记录属性的值方法,(如何设置用户服务记录属性的值,大家可能****Server这些类中看到)
代码如下

 

 

/**
 * Copyright@scholar_ii 
 * 
@author 梧州学院 04计本2班 罗功武
 * date 08/02/27
 
*/

package  common;

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;
/**
 * ServiceSearcher类
 * 用于搜索三种服务
 * UUID-11111111111111111111111111111111
 * 两个聊天室
 * UUID-22222222222222222222222222222222
 * 多个聊天室
 * UUID-33333333333333333333333333333333
 * 双人互动游戏
 
*/

public   class  ServiceSearcher  implements  Runnable, DiscoveryListener  {
    
/*服务类型名*/
    
private String serviceName = null;
    
/*聊天室列表类*/
    
private RoomList chatRoomList = null;
    
/*本地设备*/
    
private LocalDevice localDevice = null;
    
/*服务代理*/
    
private DiscoveryAgent agent = null;
    
/*发现的设备*/
    
private Vector deviceFound = null;
    
/*发现的服务*/
    
private Vector serviceFound  = null;
    
    
public ServiceSearcher(String serviceName,RoomList roomList)
    
{
        
this.serviceName = serviceName;
        
this.chatRoomList = roomList;
        
/*开始搜索线程*/
        
new Thread(this).start();
    }

    
/**
     * 开始搜索
     
*/

    
public void run() {
        
        doSearchDevices();

    }

    
/**
     * 服务记录搜索的方法
     
*/

    
public void doSearchDevices(){
        
        
try {
            localDevice 
= LocalDevice.getLocalDevice();
        }
 catch (BluetoothStateException e) {
            
            e.printStackTrace();
        }

        agent 
= localDevice.getDiscoveryAgent();
        deviceFound 
= new Vector();
        serviceFound 
= new Vector();
        
try {
            
if(!agent.startInquiry(DiscoveryAgent.GIAC, this))
            
{
                
return;
            }

        }
 catch (BluetoothStateException e) {
            
            
        }

    }

    
/**
     * 服务搜索的方法
     * 
@param remoteDevice
     * 
@return void 
     
*/

    
public void doServiceSearch(RemoteDevice remoteDevice){
    
        
/*服务记录属性值的ID,用户自定义的属性值*/
        
int attributes[] = { 0x1234,0x1235};
        
/*服务记录的UUID*/
        UUID uuids[] 
= new UUID[2];
        uuids[
0= new UUID(serviceName, false);
        uuids[
1= new UUID(0x1101);
    
        
try {
            agent.searchServices(attributes, uuids, remoteDevice, 
this);
        }
catch (BluetoothStateException e) {
        
/*服务搜索失败的处理*/
        
return;
    }

}
   /**
     * 服务器设备发现的处理
     * 
@param remoteDevice, deviceClasss
     * 
@return void 
     
*/

    
public void deviceDiscovered(RemoteDevice remoteDevice, DeviceClass deviceClass) {
        
/*加入搜索到的服务器设备*/
        deviceFound.addElement(remoteDevice);

    }

    
/**
     * 服务器设备搜索到服务设备的处理
     * 
@param disType
     * 
@return void
     
*/

    
public void inquiryCompleted(int disType) {
        
        
switch(disType)
        
{   
            
/*成功完成搜索的处理*/
            
case DiscoveryListener.INQUIRY_COMPLETED:
                
for(int i= 0; i<deviceFound.size(); i++){
                    doServiceSearch((RemoteDevice)deviceFound.elementAt(i));
                    
/*实现一次搜一个服务器设备的服务记录的同步*/
                    
synchronized(this){
                        
try {
                            
this.wait();
                        }
 catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                    }

                addRoomMessage();    
                }
    
                
break;
            
case DiscoveryListener.INQUIRY_TERMINATED:
                
break;
            
case DiscoveryListener.INQUIRY_ERROR:
                
break;
        }


    }

    
/*不利用服务搜索完成方法*/
    
public void serviceSearchCompleted(int transID, int respCode) {
        

    }

    
/**
     * 搜索到服务的处理
     * 
@param tarnsID, serviceRecord
     * 
@return void 
     
*/

    
public void servicesDiscovered(int transID, ServiceRecord[] serviceRecord) {
        
/*加入搜索到的服务记录*/
        serviceFound.addElement(serviceRecord[
0]);
        
/*实现一次搜一个服务器设备的服务记录的同步*/
        
synchronized(this){
            
this.notifyAll();
        }

        
    }

    
/**
     * 增加搜到的聊天室列表
     * 
@param 无
     * 
@return 无
     
*/

    
private void addRoomMessage()
    
{
        
        ServiceRecord tempRecord
= null;
        chatRoomList.roomURLList 
= new String[serviceFound.size()];
        chatRoomList.roomNameList 
= new String[serviceFound.size()];
        
/*删除原先的String*/
        chatRoomList.deleteAll();
        
for(int i=0; i<serviceFound.size(); i++)
        
{
            
/*获得服务器端的服务记录*/
            tempRecord 
= (ServiceRecord)serviceFound.elementAt(i);
            
/*获得服务器端的服务记录的链接字符串并加入到聊天室的链接列表*/
            chatRoomList.roomURLList[i]
= tempRecord.getConnectionURL(
                    ServiceRecord.NOAUTHENTICATE_NOENCRYPT, 
false);
            
/*获得服务记录的用户自定义的服务属性并加入到聊天室名的列表*/
            String str 
=(String)(tempRecord.getAttributeValue(0x1234).getValue()); 
            chatRoomList.append(str, 
null);
            chatRoomList.roomNameList[i] 
= str; 
        }

            
    }


}
// ServiceSercher.java结束

 

 

 

/**
 * Copyright@scholar_ii 
 * 
@author 梧州学院 04计本2班 罗功武
 * date 08/02/27
 
*/

package  common;

import  javax.microedition.lcdui.Command;
import  javax.microedition.lcdui.CommandListener;
import  javax.microedition.lcdui.Displayable;
import  javax.microedition.lcdui.List;

import  chat.MultiChatRoomClient;
import  chat.PairChatRoomClient;
import  flat.FlatMainMIDlet;
import  game.GameClient;
/**
 * RoomList 类
 * 显示蓝牙网络中开放的如娱乐房间的列表。
 * 提供给用户选择进入感趣兴的娱乐房间。
 
*/

public   class  RoomList  extends  List  implements  CommandListener  {
    
    
/*聊天室类型*/
    
private int roomStyle ;
    
/*用户名*/
    
private String userName = null;
    
/*娱乐平始的主类*/
    
private FlatMainMIDlet flatMainMIDlet = null;
    
/*聊天室链接列表*/
    
public String[] roomURLList = null;
    
/*聊天室名称列表,创建聊天室的用户妮称*/
    
public String[] roomNameList = null;
    
    
private static final Command cmdBack = new Command("返出",Command.BACK,1);
    
private static final Command cmdOK = new Command("进入", Command.OK,1);
    
/**
     * 构造方法
     * 完成聊天室窗口的初使化
     * 
@param title
     * 
@param flatMainMIDlet
     * 
@param userName
     
*/

    
public RoomList(String title, FlatMainMIDlet flatMainMIDlet,
            String userName ,String uuidString, 
int roomStyle){
        
super(title, List.EXCLUSIVE);
        
this.flatMainMIDlet = flatMainMIDlet;
        
this.userName = userName;
        
this.roomStyle = roomStyle;
        append(
"搜索房间中.....",null);
        addCommand(cmdBack);
        addCommand(cmdOK);
        setCommandListener(
this);
        
new ServiceSearcher(uuidString,this);
    }

    
    
private void showRoomClinet(int index)
    
{
        
switch(roomStyle)
        
{
            
case 1:
                
/*双人个聊天室*/
                flatMainMIDlet.display.setCurrent(
                        
new PairChatRoomClient(roomURLList[index],
                                flatMainMIDlet,userName,roomNameList[index]));
                
break;
            
case 2:
                
/*多人聊天室*/
                flatMainMIDlet.display.setCurrent(
                        
new MultiChatRoomClient(roomURLList[index],
                                flatMainMIDlet,userName,roomNameList[index]));
                
break;
            
case 3:
                
/*游戏聊天室*/
                flatMainMIDlet.display.setCurrent(
                        
new GameClient(roomURLList[index],
                                flatMainMIDlet));
                
break;
            
        }

    }

    
    
public void commandAction(Command command, Displayable displayable) {
         
/*进入聊天室*/
        
if(command==cmdOK)
        
{
            
if(roomURLList!=null)
            
{
                
/*选择的聊天室的序号*/
                
int index = getSelectedIndex();
                showRoomClinet( index);
                    
            }

        }

        
/*返回主菜单*/
        
else if(command==cmdBack)
        
{
            flatMainMIDlet.showFlatMenu();
        }


    }

    
}
// ChatRoomList.java文件结束

 

RoomList类是ServiceSearcher类的使用者。RoomList类主要是利用ServceSearcher类来收某种服务,并将结果显示出来。简单来说就是你叫你小弟去买东西,然后你就忙你的事去,当你小弟买回你所需要的东西时就交给你。RoomList类与ServiceSerarcher类的关系可以这样形象的理解吧。