那么现在我们已经获得ViewServer对应本地的转发端口号了,ViewServer也已经在实例化DeviceConnection的时候给连接好了,剩下的就差发命令了。我们继续看下”代码14-7-4 DeviceBridge - loadViewServerInfo获取ViewServer版本”的第2个重要部分:
connection.sendCommand("SERVER");
很明显就是往刚才DeviceConnection建立好的连接到ViewServer的SocketChannel发送”SERVER”这个命令了:
62 public void sendCommand(String command) throws IOException {
63 BufferedWriter out = getOutputStream();
64 out.write(command);
65 out.newLine();
66 out.flush();
67 }
代码14-7-7 DeviceConnection - sendCommand
到此为止我们就分析完如何发送”SERVER”命令到ViewServer以获得其版本号的,完了吗?还没有了,别忘了我们除了要获得ViewServer的版本号外,还需要获得ViewServer当前使用的协议版本了,”代码14-7-4 DeviceBridge - loadViewServerInfo获取ViewServer版本”只是loadViewServerInfo的一部分而已。现在我们往下分析第2部分,但它是怎么去获得协议版本的:
260 public static ViewServerInfo loadViewServerInfo(IDevice device) {
261 int server = -1;
262 int protocol = -1;
... //获得ViewServer版本号部分略
278 connection = null;
279 try {
280 connection = new DeviceConnection(device);
281 connection.sendCommand("PROTOCOL"); //$NON-NLS-1$
282 String line = connection.getInputStream().readLine();
283 if (line != null) {
284 protocol = Integer.parseInt(line);
285 }
286 }
...
}
代码14-7-8 DeviceBridge - loadViewServerInfo获取协议版本
可以看到,其实流程跟代码14-7-4一模一样,只是最终发送给ViewServer的命令是代表获取协议的”PROTOCOL”而非”SERVER”而已。
最后我们看在获得这些版本号之后loadViewServerInfo是如何处理的:
260 public static ViewServerInfo loadViewServerInfo(IDevice device) {
261 int server = -1;
262 int protocol = -1;
...
296 ViewServerInfo returnValue = new ViewServerInfo(server, protocol);
297 synchronized (sViewServerInfo) {
298 sViewServerInfo.put(device, returnValue);
299 }
300 return returnValue;
301 }
代码14-7-9 DeviceBridge - loadViewServerInfo收尾
最后收尾阶段做两个事情:
- 第一件:根据获得协议创建ViewServerInfo实例
- 第二件:把这个实例保存起来到sViewServerInfo这个HashMap里面,跟上面提到的sDevicePortMap一样,还是用代表设备的Device类的实例做为键,而值是刚创建的这个ViewServerInfo实例
这里我们先看看ViewServerInfo这个类,其实它是DeviceBridge的内部类:
59 public static class ViewServerInfo {
60 public final int protocolVersion;
61 public final int serverVersion;
62 ViewServerInfo(int serverVersion, int protocolVersion) {
63 this.protocolVersion = protocolVersion;
64 this.serverVersion = serverVersion;
65 }
66 }
代码14-7-10 DeviceBridge - ViewServerInfo
里面就两个成员变量一个构造函数完了,两个成员类变量分别保存的是我们刚才获得的ViewServer版本号和ViewServer协议版本号。