• 老李推荐:第14章7节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-获取版本号 3


    那么现在我们已经获得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协议版本号。

  • 相关阅读:
    一个 无私的 又不错的 博客
    byte[]与各种数据类型互相转换示例
    HttpClient之Get请求和Post请求示例
    jabberNet 发送出席信息
    jabberNet 修改花名册条目的昵称
    Openfire 配置连接SQL SERVER(非默认实例)
    WPF学习笔记——没有前途的WPF
    WPF学习笔记——设置ListBox选中项的背景颜色
    WPF学习笔记——为BUTTON添加背景图片
    EF + WCF学习笔记——EF实体类序列化
  • 原文地址:https://www.cnblogs.com/poptest/p/5103247.html
Copyright © 2020-2023  润新知