?? serverbox.java
字號:
/* * To change this template, choose Tools | Templates * and open the template in the editor. */package com.mir.bluetooth;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.util.Vector;import javax.bluetooth.DiscoveryAgent;import javax.bluetooth.LocalDevice;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.Command;import javax.microedition.lcdui.CommandListener;import javax.microedition.lcdui.Displayable;import javax.microedition.lcdui.TextBox;import javax.microedition.lcdui.TextField;/** * 服務端GUI * @author Jagie * * TODO To change the template for this generated type comment go to * Window - Preferences - Java - Code Style - Code Templates */public class ServerBox extends TextBox implements Runnable, CommandListener { Command com_pub = new Command("開啟服務", Command.OK, 0); Command com_cancel = new Command("終止服務", Command.CANCEL, 0); Command com_back = new Command("返回", Command.BACK, 1); LocalDevice localDevice; StreamConnectionNotifier notifier; ServiceRecord record; boolean isClosed; ClientProcessor processor; StupidBTMIDlet midlet; //響應服務的uuid private static final UUID ECHO_SERVER_UUID = new UUID( "F0E0D0C0B0A000908070605040302010", false); public ServerBox(StupidBTMIDlet midlet) { super(null, "", 500, TextField.ANY); this.midlet = midlet; this.addCommand(com_pub); this.addCommand(com_back); this.setCommandListener(this); } public void run() { boolean isBTReady = false; try { localDevice = LocalDevice.getLocalDevice(); if (!localDevice.setDiscoverable(DiscoveryAgent.GIAC)) { showInfo("無法設置設備發現模式"); return; } // prepare a URL to create a notifier StringBuffer url = new StringBuffer("btspp://"); // indicate this is a server url.append("localhost").append(':'); // add the UUID to identify this service url.append(ECHO_SERVER_UUID.toString()); // add the name for our service url.append(";name=Echo Server"); // request all of the client not to be authorized // some devices fail on authorize=true url.append(";authorize=false"); // create notifier now notifier = (StreamConnectionNotifier) Connector .open(url.toString()); record = localDevice.getRecord(notifier); // remember we've reached this point. isBTReady = true; } catch (Exception e) { e.printStackTrace(); } // nothing to do if no bluetooth available if (isBTReady) { showInfo("初始化成功,等待連接"); this.removeCommand(com_pub); this.addCommand(com_cancel); } else { showInfo("初始化失敗,退出"); return; } // 生成服務端服務線程對象 processor = new ClientProcessor(); // ok, start accepting connections then while (!isClosed) { StreamConnection conn = null; try { conn = notifier.acceptAndOpen(); } catch (IOException e) { // wrong client or interrupted - continue anyway continue; } processor.addConnection(conn); } } public void publish() { isClosed = false; this.setString(null); new Thread(this).start(); } public void cancelService() { isClosed = true; showInfo("服務終止"); this.removeCommand(com_cancel); this.addCommand(com_pub); } /* * (non-Javadoc) * * @see javax.microedition.lcdui.CommandListener#commandAction(javax.microedition.lcdui.Command, * javax.microedition.lcdui.Displayable) */ public void commandAction(Command arg0, Displayable arg1) { if (arg0 == com_pub) { //發布service publish(); } else if (arg0 == com_cancel) { cancelService(); } else { cancelService(); midlet.showMainMenu(); } } /** * 內部類,服務端服務線程。 * @author Jagie * * TODO To change the template for this generated type comment go to * Window - Preferences - Java - Code Style - Code Templates */ private class ClientProcessor implements Runnable { private Thread processorThread; private Vector queue = new Vector(); private boolean isOk = true; ClientProcessor() { processorThread = new Thread(this); processorThread.start(); } public void run() { while (!isClosed) { synchronized (this) { if (queue.size() == 0) { try { //阻塞,直到有新客戶連接 wait(); } catch (InterruptedException e) { } } } //處理連接隊列 StreamConnection conn; synchronized (this) { if (isClosed) { return; } conn = (StreamConnection) queue.firstElement(); queue.removeElementAt(0); processConnection(conn); } } } /** * 往連接隊列添加新連接,同時喚醒處理線程 * @param conn */ void addConnection(StreamConnection conn) { synchronized (this) { queue.addElement(conn); notify(); } } } /** * 從StreamConnection讀取輸入 * @param conn * @return */ private String readInputString(StreamConnection conn) { String inputString = null; try { DataInputStream dis = conn.openDataInputStream(); inputString = dis.readUTF(); dis.close(); } catch (Exception e) { e.printStackTrace(); } return inputString; } /** * debug * @param s */ private void showInfo(String s) { StringBuffer sb = new StringBuffer(this.getString()); if (sb.length() > 0) { sb.append("\n"); } sb.append(s); this.setString(sb.toString()); } /** * 處理客戶端連接 * @param conn */ private void processConnection(StreamConnection conn) { // 讀取輸入 String inputString = readInputString(conn); //生成響應 String outputString = inputString.toUpperCase(); //輸出響應 sendOutputData(outputString, conn); try { conn.close(); } catch (IOException e) { } // ignore showInfo("客戶端輸入:" + inputString + ",已成功響應!"); } /** * 輸出響應 * @param outputData * @param conn */ private void sendOutputData(String outputData, StreamConnection conn) { try { DataOutputStream dos = conn.openDataOutputStream(); dos.writeUTF(outputData); dos.close(); } catch (IOException e) { } }}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -