android - 为什么连接到由 createRfcommSocket 创建的套接字比 createInsecureRfcommSocketToServiceRecord 更快?

标签 android sockets reflection bluetooth

为什么使用反射连接到 createRfcommSocket 创建的蓝牙套接字比 createInsecureRfcommSocketToServiceRecord 创建的蓝牙套接字更快?

BluetoothSocket socket = device.createInsecureRfcommSocketToServiceRecord(uuid);
socket.connect();

对比

Class<?> cls = temp.getRemoteDevice().getClass();
Class<?>[] paramTypes = new Class<?>[]{ Integer.TYPE };
Method m = cls.getMethod("createRfcommSocket", paramTypes);
Object[] params = new Object[]{ Integer.valueOf(1) };
fallbackSocket = (BluetoothSocket) m.invoke(temp.getRemoteDevice(), params);

在长距离连接设备时,这种差异尤其明显。传统方法无法多次连接,更不用说连接调用需要明显更长的时间来处理。另一方面,通过反射方法创建的套接字的连接是第一次建立,并且调用 connect() 很快。

有没有比较简单的解释呢?

最佳答案

相对简单的解释是,前一种方法是连接到SDP服务记录。 SDP 将 UUID 映射到 channel ,因此前者必须查找要使用 SDP 连接的 channel 。

对于后者,您告诉它您想要直接连接到 channel 1,因此无需进行 SDP 发现即可确定 UUID 映射到哪个 channel 。没有 SDP 查找意味着连接时间更少。

关于android - 为什么连接到由 createRfcommSocket 创建的套接字比 createInsecureRfcommSocketToServiceRecord 更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25341996/

相关文章:

android - 如何设置弹出菜单的背景颜色?

java - Android:表示接口(interface)的所有字段都是@Nullable

java - 如何使用反射来识别java方法是否是通用的?

java - 使用未知参数长度调用未知构造函数

android - 用微调器替换操作栏的标题(下拉)

java - Eclipse 中的编译器合规性错误

c - Ubuntu Linux 使用 Unix 域套接字发送文件描述符

c - 套接字 TCP : Why do I lose messages with scanf

c - 如何模拟阻塞事件来测试非阻塞套接字

c# - 使用 Reflection Invoke 静态泛型方法将 Lamba 作为参数传递