据我了解,你问了三个问题。
如何在服务器返回数据时发送文件:您基本上打开了与服务器的连接(例如http
,但也可能是任何其他基于 TCP 或 UDP 的协议)。然后你监听传入的数据;一旦你收到数据,你就会触发你想要的任何动作。当您的服务器未使用时,这些是作为起点的一些相关调用http
(未经测试,请参阅文档以获取详细信息和替代方案):
Socket s = new Socket('your.server.com', 47000);
s.connect();
SocketChannel c = s.getChannel();
ByteBuffer buffer = new ByteBuffer(1);
c.read(buffer); // blocks until bytes are available
如何自动启动蓝牙连接:获取目标设备的BluetoothDevice
对象,然后连接到它 - 就像在 BluetoothChat 演示中一样。
如何通过蓝牙发送文件/超过 1024 字节:是的,您必须在发送端将数据拆分为块并在接收端重新组合它们(注意在实际数据之前发送文件大小,以便接收器知道何时文件完整)。您还可以使用相当大的字节缓冲区。我建议使用 64 Kb 的最大块大小:这允许您重新发送块而不会花费太多(时间)成本并且不会消耗太多内存。
作为关于 3. 的初学者,这样的东西可能是发送方的核心(未经测试且没有错误处理,只是为了给出想法):
// Send the file size
OutputStream out = socket.getOutputStream();
ByteBuffer header = ByteBuffer.allocate(8);
header.putLong(file.length();
out.write(header.array());
// Send the file in chunks
byte buffer[1024];
InputStream in = new BufferedInputStream(new FileInputStream(file));
int length = in.read(buffer);
while (length > 0) {
out.write(buffer, 0, length);
if (length < 1024) break;
length = in.read(buffer, 0, sizeof(buffer));
};
...和接收方:
// Receive and unmarshal the file size
InputStream in = socket.getInputStream();
ByteBuffer header = ByteBuffer.allocate(8);
byte buffer[1024];
in.read(buffer, 0, 8);
header.put(buffer);
long filesize = header.getLong();
long receivedBytes = 0;
// Receive the file
OutputStream out = new BufferedOutputStream(new FileOutputStream(file));
int length = in.read(buffer);
while ((receivedBytes < filesize) && (length > 0)){
out.write(buffer, 0, length);
receivedBytes += length;
length = in.read(buffer);
}
if (receivedBytes != filesize) ... // Assure the transfer was successful