java - 保持 Java 蓝牙连接有效

标签 java bluetooth inputstream bluecove jsr82

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

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

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

我尝试使用 while(some statement is true) 循环来保持连接有效,它在收到第一条消息后不再关闭套接字,但它无法接收我从智能手机发送的任何后续消息到我的电脑。虽然它基本上是活的,但当我尝试从智能手机发送它们时,它无法接收任何新消息。不知道为什么。

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

代码制作连接:

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) {}
}

最佳答案

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

        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 时)

希望对您有所帮助!

关于java - 保持 Java 蓝牙连接有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14819875/

相关文章:

java - 将英寸转换为英尺和英寸

java - 具有双向关联的类的 equals() 方法

Android Bluetooth Low Energy 获取对特定请求的响应

c# - (Dis) 连接蓝牙设备与 Windows.Devices.Bluetooth.Rfcomm (WP8.1)

java - Android TCP套接字客户端/服务器实现

Java NIO : Why the method names "read" "write" sounds the opposite?

java - 使用 Spring Data 按不同日期属性对页面进行排序

android - 蓝牙权限丢失错误,而我不需要蓝牙

java - 如何从 InputStream 转换为 AudioInputStream

java - 达到指定文件大小后停止 HtmlUnit 下载