当前位置:文档之家› Java实现的cmd远程控制程序

Java实现的cmd远程控制程序

java不能调用Win_Api,所以直接用Win_Api就行不通了。

但是我们可以借助DLL 来实现。

以下就是cmdDLL的实现过程:首先,用在cmd命令提示符下执行javac Server.java (接下来它将调用cmdDLL.dll的函数 CMD)生成一个Server.class文件,接下来就是用这个Server.class文件生成Server.h文件(执行javah Server.h)。

其次,先写一个.cpp文件,在这个.cpp程序中我们将先前已经弄好的Server.h 要包含在这个cmdDLL.cpp文件中,因为Server.h文件是接下来Server.java中要调用的CMD者个函数的声明。

cmdDLL.cpp文件如下://begin#include "Server.h"#include <stdlib.h>#include <string.h>JNIEXPORT void JNICALL Java_Server_CMD (JNIEnv * env, jclass,jstring a ){const char* str = env->GetStringUTFChars(a,0);char str_1[100] = {0};strncpy(str_1,str,strlen(str)-1);char str_2[100] = " > out.txt";strcat(str_1,str_2);system(str_1);}//end执行以下命令(需要vc环境):cl/c cmdDLL.cpplink cmdDLL.obj /dll以生成一个cmdDLL.Dll文件。

cmdDLL.Dll中的void CMD(String args)这个函数的功能:(1)接受上层的一个string args 然后将其类型转换后得到一个const char* str。

const char* str = env->GetStringUTFChars(a,0);(2)由于我们需要向Client回显cmd中的内容所以这里我们就需要将回显先转移到out.txt中char str_1[100] = {0};strncpy(str_1,str,strlen(str)-1);char str_2[100] = " > out.txt";strcat(str_1,str_2);然后将数据以文本的形式存到out.txt(准备给Client回显)中。

最后就是要实现str_1这个指令了(在cmd之下),我所使用的方法是int system(const char* args)。

比如现在位置是D:\,然后str_1 = “dir > out.txt”,那么其将在Server端显示cmdDLL的DLL文件。

二:实现了Java在Server端使用cmd命令的功能,接下来要实现的就是TCP 链接了。

首先,比如Client端向Server端发送一条命令比如说dir ,那么在客户端会显示现在Server.class所在的文件夹。

图二显示其它文件夹则必须加上其绝对路径如dir E:E-book。

图三还可以是执行别的指令如shutdown,type……等待。

bug:欲对Server上的Java文件和C文件进行编译或链接必须将其放在Server.class所在的本文件夹。

程序代码://=================================================================== ===================//************服务端代码****************************************************************//=================================================================== ===================Server:/** 文件名:Server.java* 环境:Eclipse 3.2 + VS 2005* 功能:远程控制程序Client端(受控端)* 作者:lwm1986* 日期:2007.5.17* E-mail : Lauvenman@* QQ:271096597*/import java.io.*;import .*;class Server{static{System.loadLibrary("cmdDLL");//加载DLL。

}public native static void CMD(String b);public static void main(String argv[]) throws Exception{String ClientSentence;//接收Client传来的命令Server callDll = new Server();ServerSocket welcomeSocket = new ServerSocket(2000);//在Port:1033端口处等Clientwhile (true){Socket conncetionSocket = welcomeSocket.accept(); //等.......BufferedReader inFromClient = new BufferedReader(newInputStreamReader(conncetionSocket.getInputStream()));DataOutputStream outToClient = new DataOutputStream(conncetionSocket.getOutputStream());ClientSentence = inFromClient.readLine();//收到Client的命令callDll.CMD(ClientSentence + ' ');//调用dll中的函数执行命令/*打开文件统计Server回显信息的字节数*/String filename = "out.txt";FileInputStream fis = newFileInputStream(filename);int i = 0;while ((fis.read()) != -1){i++;}fis.close();if (i != 0) //当文件长不为0时{outToClient.writeBytes("YES_TEXT" + ' ');//向Client的flag发送接收信号/*将字节流读到byte[] B中*/FileInputStream fis_1 = new FileInputStream(filename);BufferedInputStream buff = newBufferedInputStream(fis_1);byte[] B = new byte[i];while ((buff.read(B, 0, i)) != -1){}String S = new String(B);//将byte[] B 中的信息复制到String S中String[] s_1 = S.split(" ");//将String B的信息按' '剪切后放到String[] s_1中/*向Client端发送回显信息*/Integer Int = s_1.length;outToClient.writeBytes(Int.toString() + ' ');for(int j = 0; j < s_1.length; j++){byte[] s_2 = (s_1[j] + " ").getBytes();outToClient.write(s_2);}} else//如果此命令无回显信息则向Client端flag发送信息告诉Client没有回显信息outToClient.writeBytes("NO_TEXT" + ' ');}}}//=================================================================== ===================//************客户端代码****************************************************************//=================================================================== ===================Client:/** 文件名:Client.java* 环境:Eclipse 3.2 + VS 2005* 功能:远程控制程序Client端(控制端)* 作者:lwm1986* 日期:2007.5.17* E-mail : Lauvenman@* QQ:271096597*/import java.io.*;import .*;class Client {public static void main(String argv[]) throws Exception {while (true) {Socket ClientSocket = new Socket("127.0.0.1", 2000);//确定Server的IP和Port,这里我是用了自己机子的IPString sentence;//向Server发送的命令BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));DataOutputStream OutToServer = newDataOutputStream(ClientSocket.getOutputStream());BufferedReader inFromServer = new BufferedReader(newInputStreamReader(ClientSocket.getInputStream()));System.out.print(">");sentence = inFromUser.readLine();//输入命令OutToServer.writeBytes(sentence + ' ');//发送命令String flag = "YES_TEXT";//建立一个flag用于判断是否会接收到Server发回的回显信息if (flag.equals(inFromServer.readLine())) {int cmdLineNum =Integer.parseInt(inFromServer.readLine());//确定Server发回信息的行数for (int i = 0; i < cmdLineNum; i++) {byte[] fromCMD =inFromServer.readLine().getBytes();//以字节数组的方式接收Server发回的信息String stringFromCMD = new String(fromCMD); //将信息转换为StringSystem.out.println(stringFromCMD);//在Client端输出信息}} else;ClientSocket.close();}}}。

相关主题