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

📄 serverbox.java

📁 手机蓝牙通讯
💻 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 + -