java语言利用Socket实现对操作系统的命令调用和文件传输
1、我们需要什么?
(1)、执行系统命令
(2)、执行远程拷贝文件
(3)、执行远程发送文件
2、针对STAF的本身限制,需要找到一个简单、轻便的来替代
3、C语言实现的Socket也会受到限制
本身的不同的操作系统对C语言库函数的支持不同,所以,应用C语言实现的Socket会受到跨平台的限制。
4、java语言的优势,可以借鉴SUN公司给出的解释
-1、简单
-2、面向对象
-3、分布式
-4、解释性
-5、健壮
-6、安全
-7、系统无关
-8、可移植
-9、高性能
-10、多线程和动态的语言
5、实现流程图如下:
6、环境搭建
1、服务端和客户端安装jdk
2、服务端端口号信息放置于C盘(windows系统)或/home/(linux系统)目录的port.ini文件中(端口号是4位数字,没有被占用)
3、将已经打好jar包的两个文件分别放到服务端和客户端
7、执行
双击放置到服务端和客户端的两个jar包
在命令行窗口输入java -jar path/*.jar
8、图形如下:
传文件时显示如下:
9、实现的命令模型:
从客户端图形界面接收到的命令为:
TIME@OS_TYPE#IP#PORT#COMMAND#CONDITION
从客户端传给服务端命令为:
OS_TYPE#IP#PORT#COMMAND#CONDITION
中间需要考虑传输井号时的特别情况,可加 { } 进行区分
10、ZA-SOCKET有未来
-1、应用于自动化
-2、继续完善其余功能
(1)实现命令行输入
(2)读取文件,分析执行,完成日志功能
(3)其余需求的编码
-3、广阔天地大有作为
/**
* 执行系统命令
*
* @param cmd
* @return 返回值为0说明系统命令执行成功,其他值都是失败。
*/
private int systemCMD(String cmd) {
Runtime rt = Runtime.getRuntime();
int value = 1;
String[] excuteCMD = cmd.split("#");
String os_type = excuteCMD[0];
String four = excuteCMD[4];
String[] count = four.split("\\s");
String needCMD = null;
try {
Process proc = null;
if("windows".equals(os_type)){
if (four.substring(four.length() - 4, four.length())
.toUpperCase().equalsIgnoreCase(".BAT")) {
if (count.length >= 2) {
needCMD = "cmd.exe /c " + four;
} else {
needCMD = four;
}
} else {
needCMD = "cmd.exe /c " + four;
}
proc = rt.exec(needCMD);
}
if("linux".equals(os_type)){
String[] linuxCMD = {"/bin/sh","-c",four};
proc = rt.exec(linuxCMD);
}
proc.waitFor();
value = proc.exitValue();
} catch (Exception e) {
e.printStackTrace();
serverJta.append("执行的命令不是系统命令!\n\n");
}
return value;
}
int value = this.systemCMD(msg);
if (value == 0) {
serverJta.append("执行系统命令成功!\n");
pw.println("success");
pw.flush();
} else {
serverJta.append("执行系统命令失败!\n");
pw.println("fail");
pw.flush();
}