[英]Problem with Sending and Receiving Files with SPP over Bluetooth
我正在尝试使用SPP over Bluetooth(在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来实现此功能?
它可能就像两个程序都阻塞接收呼叫一样简单,等待另一端说些什么...尝试添加大量的日志语句,这样你就可以看到每个程序所处的“状态”(即,它给出了你正在运行评论,如“试图收到”,“得到xxx数据”,“试图回复”等,或设置调试,等到它卡住,然后停止其中一个并单步执行。
您当然可以使用SPP在您的应用程序之间传输文件(假设您使用您的应用程序在两端发送和接收)。 从代码片段中很难说出您的程序出了什么问题。 我猜你必须关闭流,作为对方发送数据的指示。注意即使你把整个文件写在一个块中,SPP /蓝牙协议层可能会碎片化它另一端可以分段接收,因此您需要一些协议来指示传输完成。
很难说没有查看客户端代码,但我的猜测,如果两者运行相同的代码(即先写入然后再读取),则需要在读取发生之前关闭outputStream
(否则,两个都将等待另一方关闭他们的一方以便退出读取循环,因为read()
仅在另一方关闭时返回-1
)。
如果不应该关闭流,则停止读取的条件不能等于-1
。 (因此,要么先将其更改为传输文件大小,要么是其他机制)。
你为什么决定使用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();
}
要转换outputStream,您可以执行以下操作:
byte currentMP3Bytes[] = outputStream.toString().getBytes();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(currentMP3Bytes);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.