保持Java蓝牙连接活跃

时间:2013-02-11 20:02:43

标签: java bluetooth inputstream bluecove jsr82

我正在使用Bluecove API为我的计算机构建一个简单的Java蓝牙服务器。我正在构建一个Android客户端应用程序,但问题似乎源于服务器端应用程序。

我确定有人已经在某处发布了任何答案,过去几天我已经严格尝试了不同的解决方案并查看了每个可能的论坛,但我似乎无法保持套接字线程上的连接。

我可以在从android到计算机建立连接之后交换消息,反之亦然,从计算机到android,但是在交换字节后,Bluecove堆栈会立即关闭并关闭套接字连接,即使我没有明确说明告诉它connection.close()。

我尝试使用一段时间(某些陈述是真的)循环以保持连接活动,并且在收到第一条消息后它不再关闭套接字但它无法接收我从智能手机发送的任何后续消息到我的电脑。虽然它基本上是活着的,但当我尝试从智能手机发送它们时,它无法接收任何新消息。不知道为什么。

对不起,这是我第一次发帖,我不确定为什么代码的第一部分无法在页面上正确显示。

代码连接:

public BluetoothServer()
{
    try 
    {
        service = (StreamConnectionNotifier) 
             Connector.open("btspp://localhost:" + new UUID(0x1101).toString() + 
                                ";name=SampleServer");

            System.out.println("open connection");



            while(runState == true){

                connection = (StreamConnection) service.acceptAndOpen();

//send a greeting across to android
                    outputStream = connection.openOutputStream();
                    String greeting = "JSR-82 RFCOMM server says hello";
                    outputStream.write(greeting.getBytes());

//run thread that listens for incoming bytes through socket connection
                Thread t = new Thread(new ConnectedThread(connection));
                t.start();

            }

    } catch(IOException e) {}
}

聆听收集数据的线程代码

public void run()
{
    try
    {    
            //open input stream to listen to data
            inputStream = connection.openInputStream();              

            byte buffer[] = new byte[1024];
            int bytes_read = inputStream.read(buffer);

            String received = new String(buffer, 0, bytes_read);
            System.out.println("received: " + received);

    } 
        catch(IOException e){}
}

1 个答案:

答案 0 :(得分:0)

不幸的是我无法在我的机器上真实地尝试你的代码,但我想我看到了你的错误:在你的run()中 - 你从输入流中读取的方法,将它打印到控制台然后它结束了。在你的最后一行之后

        System.out.println("received: " + received);

你的run() - 方法结束,运行时丢弃该线程。 您需要将接收放入while(true)或while(running)循环。

我修改了你的代码,但是请注意我之前所说的内容:我无法测试它,所以它完全未经测试!

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.bluetooth.UUID;
import javax.microedition.io.Connector;
import javax.microedition.io.StreamConnection;
import javax.microedition.io.StreamConnectionNotifier;


public class BluetoothServer {

    private boolean runState = true;

    public BluetoothServer(){

        try {
            StreamConnectionNotifier service = (StreamConnectionNotifier) Connector.open("btspp://localhost:" + new UUID(0x1101).toString() + ";name=SampleServer");
            System.out.println("open connection");

            while(runState == true){
                StreamConnection connection = (StreamConnection) service.acceptAndOpen();
                new Listener(connection).start();
            }

        } catch(IOException e) {
            e.printStackTrace();
        }
    }

    private class Listener extends Thread{

        private OutputStream os;
        private InputStream is;

        public Listener(StreamConnection connection){
            try {
                this.os = connection.openOutputStream();
                os.flush();
                this.is = connection.openInputStream();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public void run(){
            StringBuilder builder;
            try{
                String greeting = "JSR-82 RFCOMM server says hello";
                os.write(greeting.getBytes());

                while(true){
                    builder = new StringBuilder();
                    int tmp = 0;
                    while((tmp = is.read()) != -1){
                        builder.append((char) tmp);
                    }
                    System.out.println("received: " + builder.toString());
                }
            } 
            catch(IOException e){
                e.printStackTrace();
            }
        }
    }
}

这里有一些关于我和你的代码的一般观点和想法:

  • 如您所见,在主线程中我只接受新连接。一旦客户端连接,我就将连接对象提供给线程。然后它开始与客户端进行通信
  • 在Java中,我们通常将开括号放在与要求它的语句相同的行上,但这只是一个细节而不是必须。
  • 总是做有异常的事情或者不抓住它们。所以最小的是printStacktrace()或用“throws xException”声明你的方法,但是不要捕获并忽略它们。

下次您在这里发布内容时,我建议您包含所有导入语句等,它可以帮助那些试图帮助您的人。 (有时,导入可能是导致所有问题的原因,例如当有人导入java.awt.List而不是java.util.List时)

我希望我能帮到你!