保持Java蓝牙连接活动

保持Java蓝牙连接活动,java,bluetooth,inputstream,bluecove,jsr82,Java,Bluetooth,Inputstream,Bluecove,Jsr82,我正在使用Bluecove API为我的计算机构建一个简单的Java蓝牙服务器。我也在构建一个Android客户端应用程序,但问题似乎源于服务器端应用程序 我确信有人已经在某处发布了任何答案,在过去几天里,我严格地尝试了不同的解决方案,并查看了每个可能的论坛,但我似乎无法保持套接字线程上的连接 我可以在android与计算机建立连接后交换消息,反之亦然,但在交换字节后,Bluecove堆栈立即关闭并关闭套接字连接,即使我没有明确告诉它连接。close() 我尝试使用一个while(有些说法是正确

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

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

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

我尝试使用一个while(有些说法是正确的)循环来保持连接处于活动状态,它在收到第一条消息后不再关闭套接字,但它也无法接收我从智能手机发送到计算机的任何后续消息。虽然它基本上是活动的,但当我尝试从智能手机发送新消息时,它无法接收任何新消息。不知道为什么

很抱歉,这是我第一次发布,我不知道为什么代码的第一部分不能正确显示在页面上

代码生成连接:

公共蓝牙服务器(){ 试一试{ 服务=(StreamConnectionNotifier) 连接器。打开(“btspp://localhost:“+新UUID(0x1101).toString()+ “名称=样本服务器”); System.out.println(“开放连接”); while(runState==true){ connection=(StreamConnection)service.acceptAndOpen(); //向android发送问候语 outputStream=connection.openOutputStream(); String greeting=“JSR-82 RFCOMM服务器打招呼”; write(greeting.getBytes()); //运行通过套接字连接侦听传入字节的线程 线程t=新线程(新连接的线程(连接)); t、 start(); } }捕获(IOE){} } 用于侦听传入数据的线程代码

public void run(){
试试{
//打开输入流以侦听数据
inputStream=connection.openInputStream();
字节缓冲区[]=新字节[1024];
int bytes\u read=inputStream.read(缓冲区);
接收到的字符串=新字符串(缓冲区,0,字节\读取);
系统输出打印项次(“已接收:+已接收”);
}捕获(IOE){}
}

不幸的是,我无法在我的机器上真正尝试您的代码,但我想我看到了您的错误:在您的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 xexexception”声明方法,但不要捕获并忽略它们
下次你在这里发帖时,我建议把你所有的进口声明都包括在内,这样可以帮助那些试图帮助你的人。(有时,导入可能会导致所有问题,例如,当有人导入java.awt.List而不是java.util.List时)


我希望我能帮助你

您不能从客户端向服务器发送多条消息,但可以从服务器向客户端发送多条消息吗?哪个循环调用您的run()方法?您能提供调用run()的代码吗?在过去,我面临着非常类似的问题。但在我的例子中,连接并没有关闭,只有IO速度在减慢(在Android端)。调试后,我们发现,经过一段时间的不活动后,在特定超时(Android切换电源安全模式)后,它会发生在Android端,并且该超时无法更改。为了保持连接的活跃性,我们只是周期性地发送空数据包(一个字节)。希望它能有所帮助。不要只使用空白的try/catch块。在抛出异常时记录它,这将帮助您了解真正的原因。否则你就是在猜测。