java - Android 蓝牙多个客户端连接一台主机

标签 java android mobile bluetooth

情况是这样的。我正在创建一个 Android,它利用蓝牙来更新连接的客户端彼此的状态。这个想法是让蓝牙连接的主机保存一个包含所有这些统计数据的多维数组。每次客户端更新主机的新状态时,主机都会更新数组中的数据,然后将其发送给所有客户端。

当然,这对我来说听起来就像牛奶和 cookies ,但不幸的是事实并非如此。我知道我需要在每一端都有一个蓝牙套接字,其中一个必须是主机套接字。因此,完成一个连接似乎非常简单。但是如果我想接受更多连接怎么办?我一直在阅读,显然我必须为每个连接创建一个新线程。我不明白这是如何工作的,有人可以解释一下吗?

最佳答案

每个连接都需要一个线程的原因是:

假设您有两个打开的套接字,sock1 和 sock2。要从这些套接字读取数据,您可以调用类似的内容

InputStream in1 = sock1.getInputStream();
InputStream in2 = sock2.getInputStream();

现在,要从 sock1 读取数据,您可以调用

in1.read(buffer);

其中“buffer”是一个字节数组,您在其中存储读取的字节。

但是,read() 是一个阻塞调用 - 换句话说,它不会返回,并且您无法执行下一行,直到有一些字节需要 read() 为止。因此,如果您尝试读取 sock1,您将永远无法读取 sock2,反之亦然,如果它们位于同一线程中。

因此,如果每个连接有一个线程,则每个线程都可以调用 read() 并等待输入。如果在其他线程之一正在执行时出现输入,它将等待直到轮到该线程,然后继续。

要真正实现这一点,您所需要做的就是将处理一个连接的代码粘贴到扩展 Thread 的类中。

涉及很多细节 - 我建议 Android BluetoothChat sample作为一个很好的教程。

关于java - Android 蓝牙多个客户端连接一台主机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9694840/

相关文章:

android - 自定义 Firebase-ui 身份验证 Android

java - 使用 Selenium JAVA 的 IE 和 Chrome 的整页截图

java - 不接受错误的SDK许可证

java - Sipdroid 构建错误

javascript - 如何在 Firefox OS 手机上按 Enter 时阻止换行

android - 如何在命令行中使用 Android Test Orchestrator?

html - 网站在手机上显示空白

java - 使用 ehcache 进行多层缓存

java - 如何从带有基本适配器的 GridView 中选择单个编辑文本框?

java - 使用输出流发送文件长度并使用输入流接收长度和字节 [] 以将帧从一个设备流式传输到另一个 Android/Java