项目需求java实现一个功能:1:在网页某个下拉框中选择一个字段Str2:选择完成后连到另一台机子上,然后在那台机子上把Str当做一个参数在cmd里跑一条build的命令3:跑完以后会在那台机子上生成build的log文件4:把log文件返回给原先那台机子,并在网页的某一块区域显示出来现在的想法是建立一个一对多的通讯,比如qq那样的传输  把参数str发给build所在的机子  然后把log放到一个共享目录下   原先的机子去共享下拿到log文件并在网页上建立一个Log的link.感觉自己的思路很混乱,也不知具体该如何实现,现在网页和数据库都已经好了,剩下连接到远程机子build的功能不知如何去设计, 求助论坛里的大神们,还要五天项目就deadLine了,求帮忙 感激不尽!!java 通讯 远程buildcmd

解决方案 »

  1.   

    说的已经很明白了,就按这个需求做就行了。
    不过,连接到远程机子build的功能这个就比较麻烦了,本地程序打开远程注解的cmd窗口不好实现,不过你可以传输一个bat文件到远程主机,传输完成就启动bat文件,让bat文件打开cmd窗口,执行build命令
      

  2.   

    http服务器端实现个ssh client,即web客户端传来指令参数后,你的http 服务端充当ssh客户用ssh协议访问并在目标机器上执行需要的指令然后获取目标机log的内容,之后将log内容展现给web client可以用ajax轮询或者long pollingPS: 如果服务端和目标机器是windobe可以装cygwin,或者用telnet协议也可以试试,不过telnet服务即使在现在的windows里好像默认被disable了
      

  3.   

    我觉得http的一个request response回合就可以完成的服务端收到参数后,执行build命令,待出结果后将log文件信息返回客户端,客户端解析并显示,这里有什么问题吗?
      

  4.   

    你好 谢谢你的回复 我现在用的方式就是用ssh加cydwin连接  在远程执行命令  但是遇到一个问题  远程server是windows的 我用的jsch的java库  用cygwin的窗口执行bash命令没问题 但是用代码执行却是识别执行不了任何cmd用的代码如下:
    package com.aliyun.utility.jsch;  
      
    import java.io.InputStream;  
    import java.util.Properties;  
    import com.jcraft.jsch.ChannelExec;  
    import com.jcraft.jsch.JSch;  
    import com.jcraft.jsch.Session;  
      
    public class JSCHUtil {  
        private static JSCHUtil instance;  
      
        public static JSCHUtil getInstance() {  
            if (instance == null) {  
                instance = new JSCHUtil();  
            }  
            return instance;  
        }  
      
        private JSCHUtil() {  
      
        }  
      
        private Session getSession(String host, int port, String ueseName)  
                throws Exception {  
            JSch jsch = new JSch();  
            Session session = jsch.getSession(ueseName, host, port);  
            return session;  
        }  
      
        public Session connect(String host, int port, String ueseName,  
                String password) throws Exception {  
            Session session = getSession(host, port, ueseName);  
            session.setPassword(password);  
            Properties config = new Properties();  
            config.setProperty("StrictHostKeyChecking", "no");  
            session.setConfig(config);  
            session.connect();  
            return session;  
        }  
      
        public String execCmd(Session session, String command) throws Exception {  
            if (session == null) {  
                throw new RuntimeException("Session is null!");  
            }  
            ChannelExec exec = (ChannelExec) session.openChannel("exec");  
            InputStream in = exec.getInputStream();  
            byte[] b = new byte[1024];  
      
            exec.setCommand(command);  
            exec.connect();  
            StringBuffer buffer = new StringBuffer();  
            while (in.read(b) > 0) {  
                buffer.append(new String(b));  
            }  
            exec.disconnect();  
      
            return buffer.toString();  
        }  
      
        public void clear(Session session) {  
            if (session != null && session.isConnected()) {  
                session.disconnect();  
                session = null;  
            }  
        }  
      
        public static void main(String[] args) throws Exception {  
            Session session = JSCHUtil.getInstance().connect("10.9.9.135", 22,  
                    "yy", "yy");  
            String cmd = "cd /" + ";" + "ls -al |grep home";  
            String result = JSCHUtil.getInstance().execCmd(session, cmd);// 多条命令之间以;分隔  
            System.out.println(result);  
            System.exit(0);  
        }  
    }  望指教 感激不尽~~~
      

  5.   


    你好 上面这个问题小弟解决了 剩下一个问题是如何把server上build生成的log文件传回client  谢谢~~
      

  6.   


    你这里client指你的http服务器还是最终客户?如果是http服务器想得到这个文件原体,可以用scp将文件拷贝到本地,如果只是需要其中的内容也可以用个ssh+cat之类的指令来获取其内容
    如果你的client指的是终端客户,而上面的的你已经做了,那只要将log中有用的信息存入你的数据库,然后客户端查询时看看数据库有没有新纪录而决定如何返回给客户就行了,先用简单的办法是ajax每隔10秒访问一次如果这个build的时间很短,比如小于30秒。也可以用同步的方式即http服务端等待这一系列操作结束后直接将log中有用信息直接返回给client
      

  7.   

    项目项目结了么?可能帮不上什么忙了。
    你可以在build机子上做一个webservice服务,开放两个接口:
    一个buildByCmd(String str){},另一个叫getLog(){}。
    客户端调用webservice的buildByCmd(String str),把str传进去,然后调用webservice的getLog()方法,打开日志文件,将内容回传显示到页面上,而不用将文件传过来,就算是本地要有这个文件,用回传的内容在本地生成也比回传文件好处理,而且高效。