有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

通过蓝牙发送和接收SPP文件时出现java问题

我正在尝试使用蓝牙SPP(在Java中,使用BlueCove API)在两台PC之间传输文件(大约6兆字节大小的MP3)。我可以使文件传输在一个方向(例如,从客户端到服务器的一个文件)上正常工作,但当我在同一会话期间尝试以相反方向发送任何数据(即,从服务器向客户端发送文件)时,程序会冻结并且不会前进

例如,如果我只是:

StreamConnection conn;
OutputStream outputStream;

outputStream = conn.openOutputStream();

....

outputStream.write(data);  //Data here is an MP3 file converted to byte array

outputStream.flush();

转移工作正常。但如果我尝试:

StreamConnection conn;
OutputStream outputStream;
InputStream inputStream;
ByteArrayOutputStream out = new ByteArrayOutputStream();

outputStream = conn.openOutputStream();
inputStream = conn.openInputStream();

....

outputStream.write(data);
outputStream.flush();


int receiveData;
while ((receiveData = inputStream.read()) != -1) {
   out.write(receiveData);
}

客户端和服务器都冻结,并且不会前进。我可以看到文件传输实际上是在某个时刻发生的,因为如果我杀死客户端,服务器仍然会将文件写入硬盘,而不会出现任何问题。我可以尝试使用另一个文件或仅使用一个整数来响应,但它仍然无法工作

有人知道问题出在哪里吗?我知道OBEX通常用于通过蓝牙进行文件传输,但对于我需要做的事情来说,这似乎有些过分了。我是否必须使用OBEX来实现此功能


共 (4) 个答案

  1. # 1 楼答案

    不看客户端代码很难说,但我猜,如果两者运行相同的代码(即先写,然后读),在读取发生之前outputStream需要关闭(否则,双方都将等待另一方关闭其一侧以退出读取循环,因为read()仅在另一方关闭时返回-1

    如果不应关闭流,则停止读取的条件不能是等待-1。(因此,要么将其更改为先传输文件大小,要么使用其他机制)

  2. # 2 楼答案

    您当然可以使用SPP在应用程序之间传输文件(假设您使用应用程序在两端发送和接收文件)。从代码片段很难判断程序的错误。 我猜您将不得不关闭流,作为向另一端发送数据的指示。。注意:即使您将整个文件写入一个块中,SPP/Bluetooth协议层可能会将其分割,而另一端可能会以片段形式接收,因此您需要一些协议来指示传输完成

  3. # 3 楼答案

    为什么您决定使用ByteArrayOutputStream?请尝试以下代码:

        try {
            try {
    
                byte[] buf = new byte[1024];
    
                outputstream = conn.openOutputStream();
                inputStream = conn.openInputStream();
    
                while ((n = inputstream.read(buf, 0, 1024)) > -1)
                    outputstream.write(buf, 0, n);                
    
            } finally {
                outputstream.close();
                inputstream.close();
                log.debug("Closed input streams!");
            }
        } catch (Exception e) {
        log.error(e);
            e.printStackTrace();
        }
    

    要转换输出流,可以执行以下操作:

    byte currentMP3Bytes[] = outputStream.toString().getBytes();
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(currentMP3Bytes);
    
  4. # 4 楼答案

    这可能很简单,因为两个程序都陷入了阻止接听电话的状态,等待另一端说些什么。。。尝试添加大量日志语句,以便查看每个程序所处的“状态”(即,它会向您提供运行注释,如“尝试接收”、“获取xxx数据”、“尝试回复”等),或者设置调试,等待它卡住,然后停止其中一个并单步执行