Monthly Archives: November 2009

Write a console plug-in for eclipse3.5

我第一个JAVA程序终于完成了,是一个eclipse的控制台插件。本插件的目的是,实现一个通用的控制台,当启动一个进程时,将进程的输入输出显示在Console View中。

Console的使用,通过接口来完成。主要的方法是open和close。当然可以继续增加其它一些方法,如改变尺寸等

public interface IMyConsole {
    void open();
    void close();
    ...
}

希望使用时能够尽量简便,例如希望在eclipse中开启一个cmd控制台:

    IMyConsole console;
    ...
    ProcessBuilder builder = new ProcessBuilder("cmd.exe");
    try {
        Process proc = builder.start();
        console = new ConsoleFactory("Windows cmd", null,
            proc.getOutputStream(),
            proc.getInputStream(),
            proc.getErrorStream());
        console.open();
    } catch (IOException e) {
        e.printStackTrace();
    }
    ...

实例化console时候,需要指明控制台的stdin,stdout和stderr。这样就可以灵活用于各种情况,如执行一个进程、socket流、文件流等。同时,也可以指定只使用stdout和stderr,作为纯粹的输出控制台。当然,如果将这些用法再封装一层就好了。实例创建出来后,调用open()方法即可打开控制台。
类的框架如下:

ConsolePlugin

(研究了几个小时UML,结果发现这东西不是一会就能玩明白的,干脆用土办法画图了) Continue reading

Posted in eclispe | Tagged , , , | Leave a comment

My First ChromeOS Exp.

电驴上拖下来,用VMWare6.5跑起来
启动速度一流,简直比resume一个RedHat还快
发布视频中的7秒,果然名不虚传
可这来的快去的也快
本想在ChromeOS里面发一个贴
结果在开网页的时候突然失去控制
只有鼠标能动,其余一概不动
看了一下时间,不到两分钟
看来Demo的时候能撑那么久,实在是个奇迹啊!

Posted in Uncategorized | Tagged , | 1 Comment

“adb forward”端口映射

曾经以为adb forward是个好东东,因为通过这个映射之后,在PC和设备之间就可以直接socket通信了。可现在终于发现,世界不是完美的。

Android Debug Bridge设计的目的,一是用来管理所有连接的设备;二是提供各种服务,供PC端有效的控制设备。主要包括三个部分:

1) ADB-server

运行在PC端,是一个始终在后台运行的进程,作为与手机端交互的唯一接口。ADB-server处理ADB-client的请求,一部分请求无须与设备交互,直接在PC本地完成;剩下的请求需要与设备端的adbd交互,ADB-server起到了一个switcher的作用。

2) ADB-client

运行在PC端,可以同时存在多个。每个ADB-client由用户启动,完成多种功能。其作用是与ADB-server交互,实现用户请求的功能。

3) adbd

运行在设备端的常驻进程,同时只存在一个。作用是接收PC端的ADB-server发来的请求,并作出对应操作。

这三个可执行程序都是同一套代码编译出来的,位于<Android Source Dir>/system/core/adb/

ADB-client和ADB-server对应同一个可执行文件“adb(.exe)”,编译时有-DADB_HOST=1宏。而adbd对应目标设备上的可执行文件”adbd”,编译时的参数是-DADB_HOST=0。

.              P  C                                                                                    Device
————————————–                                        ————————————-
[ADB-client]<—–>[Port A:]                                         [:Port A’]<——>[Program A]
[ADB-client]<—–>[Port B:]ADB-server<—–>adbd[:Port B’]<——>[Program B]
[ADB-client]<—–>[Port C:]                                         [:Port C’]———(empty)
.                               |<——–Android Debug Bridge———->|

(这个图实在是调不好了,不管了)

ADB提供了PC与设备交互的桥梁,结构上清晰明了。其中adb forward功能提供了端口映射,希望给用户提供透明的socket通信。但可惜,这与真实的网络socket有点区别。

在TCP网络编程中,Client的Socket(C)如果调用Connect()成功,就说明已经和Server端的Socket(S)连接上,可以通讯了。但是如果使用adb forward做端口映射,就不一样了。端口映射的实质是,让ADB-server作为一个switcher转发ADB-client的数据包,送给adbd,adbd再发给设备端的对应端口。因此一旦建立了映射,就相当于ADB-server开始监听这个目标端口。而此时如果有C去尝试Connect这个端口,是一定会成功的,因为与C连接的是ADB-server,而非真正的设备上的目标程序。这就出现了,即使Connect()成功,却完全无法知道究竟是否成功连接到S。

因此,判断真正连接成功的方法,只有轮询收发握手数据包。程序中约定好事先做个交互:C发送一个数据包,等待S回复;C如果收到了S的回复包,说明连通;如果接收超时,则认为没有连通。在没有连通的情况下,需要重新建立Socket,并Connect(),然后再尝试握手。

Posted in Android | Tagged , | Leave a comment

Hello world!

感谢曾经的zhourenjian老大给了我这一亩三分地,终于有了个域名了,可是这名字感觉好别扭啊!!

http://mandapeng.vip.zhourenjian.com/

那到底mandapeng是vip,还是zhourenjian是vip呢?这是个问题。

Posted in Uncategorized | 2 Comments