Java me javax.bluetooth.BluetoothExeption:无法切换主控

Java me javax.bluetooth.BluetoothExeption:无法切换主控,java-me,bluetooth,Java Me,Bluetooth,我想为两台设备之间的发送和接收字符串编写蓝牙基础应用程序。我有问题。我从设备A发送字符串,设备B接收字符串,但当我尝试从设备B向A发送应答时,我收到以下通知: javax.bluetooth.BluetoothExeption:无法切换主控 这是因为这部分代码: StreamConnection conn =(StreamConnection) Connector.open(connString); 现在我该怎么解决这个问题呢 感谢客户端类: import java.io.*; import

我想为两台设备之间的发送和接收字符串编写蓝牙基础应用程序。我有问题。我从设备A发送字符串,设备B接收字符串,但当我尝试从设备B向A发送应答时,我收到以下通知:

javax.bluetooth.BluetoothExeption:无法切换主控

这是因为这部分代码:

 StreamConnection conn =(StreamConnection) Connector.open(connString);
现在我该怎么解决这个问题呢

感谢

客户端类:

import java.io.*;
import javax.bluetooth.*;
import javax.microedition.io.Connector;
import javax.microedition.io.StreamConnection;
import javax.microedition.lcdui.*;


class Client implements CommandListener, Runnable {

Display display;
String msg;
Midlet midlet;
Form frm;
Command cmdBack = new Command("Back", Command.BACK, 1);
LocalDevice local = null;
DiscoveryAgent agent = null;
Thread thread;
StreamConnection conn = null;
OutputStream out = null;

public Client(String string, Midlet midlet, Display display) {

    this.display = display;
    this.midlet = midlet;
    this.msg = string;
    frm = new Form("Send Form");
    frm.addCommand(cmdBack);
    frm.setCommandListener(this);
    thread = new Thread(this);
    thread.start();

    display.setCurrent(frm);
}

private void doDiscovery() {
    try {
        local = LocalDevice.getLocalDevice();
        agent = local.getDiscoveryAgent();

        String connString = agent.selectService(new UUID("86b4d249fb8844d6a756ec265dd1f6a3", false), ServiceRecord.NOAUTHENTICATE_NOENCRYPT, true);
        if (connString != null) {


            try {
                conn = (StreamConnection) Connector.open(connString);
            } catch (IOException ex) {
                frm.append(ex.toString() + "1");
            }

            try {
                out = conn.openOutputStream();
            } catch (IOException ex) {
                frm.append(ex.toString() + "2");
            }
            try {
                out.write(msg.getBytes());
            } catch (IOException ex) {
                frm.append(ex.toString() + "3");
            }
            try {
                out.close();
            } catch (IOException ex) {
                frm.append(ex.toString() + "4");
            }
            try {
                conn.close();
            } catch (IOException ex) {
                frm.append(ex.toString() + "5");
            }
            System.out.println("Message sent currectly");

        } else {
            frm.append("connString == null");
        }
    } catch (BluetoothStateException ex) {
        frm.append(ex.toString() + "6");
    }
}

public void commandAction(Command c, Displayable d) {
    if (c == cmdBack) {
        display.setCurrent(midlet.tb);
    }
}

public void run() {
    doDiscovery();
}
}

服务器类:

import java.io.*;
import javax.bluetooth.*;
import javax.microedition.io.Connector;
import javax.microedition.io.StreamConnection;
import javax.microedition.io.StreamConnectionNotifier;
import javax.microedition.lcdui.*;


class Server implements  Runnable {

Display display;
String msg;
Midlet midlet;
Thread thread;
private boolean endRecive = false;

public Server(Midlet midlet, Display display) {
    this.display = display;
    this.midlet = midlet;
    thread = new Thread(this);
    thread.start();
}



private void recive() {
    try {
        LocalDevice local = LocalDevice.getLocalDevice();
        if (!local.setDiscoverable(DiscoveryAgent.GIAC)) {
            midlet.tb.setString("Failed to change to the discoverable mode");
            return;
        }
        StreamConnectionNotifier notifier = (StreamConnectionNotifier) Connector.open("btspp://localhost:" + "86b4d249fb8844d6a756ec265dd1f6a3");
        StreamConnection conn = notifier.acceptAndOpen();
        InputStream in = conn.openInputStream();
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        int data;
        while ((data = in.read()) != -1) {
            out.write(data);
        }
        midlet.tb.delete(0, midlet.tb.size());
        midlet.tb.setString(out.toString());
        in.close();
        conn.close();
        notifier.close();
        endRecive = true;
        thread.interrupt();


    } catch (Exception ex) {
        System.out.println(ex.toString());
    }
}

public void run() {
    while (endRecive != true) {
        try {
            Thread.sleep(100);
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
        recive();
    }
}
}

和midlet:

import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.TextBox;
import javax.microedition.lcdui.TextField;
import javax.microedition.midlet.*;


public class Midlet extends MIDlet implements CommandListener {

Display display = Display.getDisplay(this);
TextBox tb = new TextBox("Chat", null, 100, TextField.ANY);
Command cmdSend = new Command("Send", Command.OK, 1);
Command cmdRecive = new Command("Recive", Command.OK, 2);
Command cmdClear = new Command("Clear...", Command.OK, 3);
Command cmdExit = new Command("Exit", Command.EXIT, 4);

public void startApp() {
    tb.addCommand(cmdSend);
    tb.addCommand(cmdRecive);
    tb.addCommand(cmdClear);
    tb.addCommand(cmdExit);
    tb.setCommandListener(this);
    display.setCurrent(tb);
}

public void pauseApp() {
}

public void destroyApp(boolean unconditional) {
    notifyDestroyed();
}

public void commandAction(Command c, Displayable d) {
    if (c == cmdExit) {
        destroyApp(true);
    } else if (c == cmdClear) {
        tb.delete(0, tb.size());
    } else if (c == cmdSend && tb.getString().length() > 0) {
        new Client(tb.getString(), this, display);

    } else if (c == cmdRecive) {
        tb.setString("Wait ...");
        new Server(this, display);

    }
}
}