项目需求java实现一个功能:1:在网页某个下拉框中选择一个字段Str2:选择完成后连到另一台机子上,然后在那台机子上把Str当做一个参数在cmd里跑一条build的命令3:跑完以后会在那台机子上生成build的log文件4:把log文件返回给原先那台机子,并在网页的某一块区域显示出来现在的想法是建立一个一对多的通讯,比如qq那样的传输 把参数str发给build所在的机子 然后把log放到一个共享目录下 原先的机子去共享下拿到log文件并在网页上建立一个Log的link.感觉自己的思路很混乱,也不知具体该如何实现,现在网页和数据库都已经好了,剩下连接到远程机子build的功能不知如何去设计, 求助论坛里的大神们,还要五天项目就deadLine了,求帮忙 感激不尽!!java 通讯 远程buildcmd
解决方案 »
- 怎么利用土豆提供的API获取它的视频信息
- axis2编写web服务端连接数据库问题
- NoClassDefFoundError: org/springframework/beans/factory/xml/NamespaceHandlerSupp
- 关于Hibernate的外键问题
- struts2标签相关问题,100分
- webservice添加安全机制
- JSTL标签的新手问题.
- 搞JSF的进来帮个忙啊....
- 第一个corba程序运行出错,请指教
- SQLServer 2000 Driver for JDBC]ResultSet can not re-read row data for column 3.
- AJAX惨案!!
- spirng声明式事务,官方文档例子 不回滚
不过,连接到远程机子build的功能这个就比较麻烦了,本地程序打开远程注解的cmd窗口不好实现,不过你可以传输一个bat文件到远程主机,传输完成就启动bat文件,让bat文件打开cmd窗口,执行build命令
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);
}
} 望指教 感激不尽~~~
你好 上面这个问题小弟解决了 剩下一个问题是如何把server上build生成的log文件传回client 谢谢~~
你这里client指你的http服务器还是最终客户?如果是http服务器想得到这个文件原体,可以用scp将文件拷贝到本地,如果只是需要其中的内容也可以用个ssh+cat之类的指令来获取其内容
如果你的client指的是终端客户,而上面的的你已经做了,那只要将log中有用的信息存入你的数据库,然后客户端查询时看看数据库有没有新纪录而决定如何返回给客户就行了,先用简单的办法是ajax每隔10秒访问一次如果这个build的时间很短,比如小于30秒。也可以用同步的方式即http服务端等待这一系列操作结束后直接将log中有用信息直接返回给client
你可以在build机子上做一个webservice服务,开放两个接口:
一个buildByCmd(String str){},另一个叫getLog(){}。
客户端调用webservice的buildByCmd(String str),把str传进去,然后调用webservice的getLog()方法,打开日志文件,将内容回传显示到页面上,而不用将文件传过来,就算是本地要有这个文件,用回传的内容在本地生成也比回传文件好处理,而且高效。