上一节说过我无法解决监听主机的问题,所以我决定采用另外的办法,首先我考虑了ssh或是telnet,但是win7对ssh不能够直接支持,telnet倒是支持,不过一来是明文通讯,二来用起来还是不放便,需要先登录才能控制。然后我又想到了win7上弄个http服务器,然后通过cgi脚本或php脚本的方式来执行命令,不过弄了半天还是没搞定,感觉这种http程序想要执行本地文件还是比较麻烦。
最后还回到了nc这个命令行程序上,我发现这个程序可以实现接收消息的功能,采用命令 nc -l -p 60000 即可,这个命令执行后,会监听任何电脑发往60000端口的消息并显示在标准输出上(我测试了在苹果上使用 echo message | nc destination_host_ip port 来给win7上的nc发送消息),为了根据消息来执行不同的操作,可以将消息转发给autohotkey程序,命令如下:
for /F "tokens=*" %i in ('nc -l -p 60000') do AutoHotkey.exe yourscript.ahk %i
注意,如果将这个命令放在bat文件里面执行的话,需将 %i 替换成 %%i,就像下面这样:
for /F "tokens=*" %%i in ('nc -l -p 60000') do AutoHotkey.exe yourscript.ahk %%i
顺带说一句,nc -l -p 60000 这个命令接收一次消息之后nc就会退出,如果想要再次接收消息就要重新运行这个命令。如果换成 nc -L -p 60000 ,那么就可以持续的接收消息。具体可以运行 nc -h 查看其帮助。另外要注意,苹果自带的nc貌似和win7的nc(win7不自带nc,需从网上自己下)不太一样,这里所说的命令如果没有特别说明的话都是用win7的nc执行的。
另外,如果nc一次接收到的消息有好几行的话,那么上面的for命令会忽略空行,然后会重复执行do后面的命令,每次执行会将一行消息作为参数传给autohotkey脚本。
现在还有一个问题,因为 nc -l -p 60000 执行一次之后就会退出,所以应该在yourscript.ahk脚本中的起始部分执行一次上面的for命令,这样就可以再次使用nc接收新消息了。不过因为老的nc程序结束后需要一定的时间新的nc程序才能启动,所以如果在这段时间内有新消息传过来,这条消息就会丢失。那么如何避免这种情况出现呢?其实也很简单,可以在初始的时候执行多次for命令,具体执行多少次看短时间内会有多少消息接收。执行多次for命令就会有多个nc程序同时运行,这些nc程序监控同一个端口,如果有多条消息发送过来,这些nc程序会自动被配置为每个nc程序接收一条消息(感觉类似于ruby的多线程socket程序,不过这里是多进程模型),这样就不会有消息丢失了。