现在已经解决了在Server端使用cmd命令的难点,接下来要实现的就是TCP链接了
首先,Client端向Server端发送一条命令比如说dir ,那么在客户端会显示现在Server.class所在的文件夹。
如果要想显示其它文件夹则必须加上其绝对路径如dir e:e-book。
这个程序当然不光是用来浏览文件夹的啦。你还可以是一下别的指令如shutdown,type……。
(但是同时也有bug,就是如果我要是想对Server上的Java文件和C文件进行编译或链接的话必须将它复制到Server.class所在的本文件夹)。
以下是Client和Server的实现代码:
Client:
/*
* 文件名:Client.java
* 环境:Eclipse 3.2 + VS 2005
* 功能:远程控制程序Client端(控制端)
* 作者:lwm1986
* 日期:2007.5.17
* E-mail : Lauvenman@gmail.com
* QQ:271096597
*/
* 文件名:Client.java
* 环境:Eclipse 3.2 + VS 2005
* 功能:远程控制程序Client端(控制端)
* 作者:lwm1986
* 日期:2007.5.17
* E-mail : Lauvenman@gmail.com
* QQ:271096597
*/
import java.io.
*
;
import java.net. * ;
class Client {
public static void main(String argv[]) throws Exception {
while ( true ) {
Socket ClientSocket = new Socket( " 127.0.0.1 " , 1033 ); // 确定Server的IP和Port,这里我是用了自己机子的IP
String sentence; // 向Server发送的命令
BufferedReader inFromUser = new BufferedReader(
new InputStreamReader(System. in ));
DataOutputStream OutToServer = new DataOutputStream(ClientSocket
.getOutputStream());
BufferedReader inFromServer = new BufferedReader(
new InputStreamReader(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); // 将信息转换为String
System. out .println(stringFromCMD); // 在Client端输出信息
}
} else
;
ClientSocket.close();
}
}
}
import java.net. * ;
class Client {
public static void main(String argv[]) throws Exception {
while ( true ) {
Socket ClientSocket = new Socket( " 127.0.0.1 " , 1033 ); // 确定Server的IP和Port,这里我是用了自己机子的IP
String sentence; // 向Server发送的命令
BufferedReader inFromUser = new BufferedReader(
new InputStreamReader(System. in ));
DataOutputStream OutToServer = new DataOutputStream(ClientSocket
.getOutputStream());
BufferedReader inFromServer = new BufferedReader(
new InputStreamReader(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); // 将信息转换为String
System. out .println(stringFromCMD); // 在Client端输出信息
}
} else
;
ClientSocket.close();
}
}
}
Server:
/*
* 文件名:Server.java
* 环境:Eclipse 3.2 + VS 2005
* 功能:远程控制程序Client端(受控端)
* 作者:lwm1986
* 日期:2007.5.17
* E-mail : Lauvenman@gmail.com
* QQ:271096597
*/
import java.io. * ;
import java.net. * ;
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( 1033 ); // 在Port:1033端口处等Client
while ( true )
{
Socket conncetionSocket = welcomeSocket.accept(); // 等.......
BufferedReader inFromClient = new BufferedReader(
new InputStreamReader(conncetionSocket.getInputStream()));
DataOutputStream outToClient = new DataOutputStream(
conncetionSocket.getOutputStream());
ClientSentence = inFromClient.readLine(); // 收到Client的命令
callDll.CMD(ClientSentence + ' ' ); // 调用dll中的函数执行命令
/* 打开文件统计Server回显信息的字节数 */
String filename = " out.txt " ;
FileInputStream fis = new FileInputStream(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 = new BufferedInputStream(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 " + ' ' );
}
}
}
* 文件名:Server.java
* 环境:Eclipse 3.2 + VS 2005
* 功能:远程控制程序Client端(受控端)
* 作者:lwm1986
* 日期:2007.5.17
* E-mail : Lauvenman@gmail.com
* QQ:271096597
*/
import java.io. * ;
import java.net. * ;
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( 1033 ); // 在Port:1033端口处等Client
while ( true )
{
Socket conncetionSocket = welcomeSocket.accept(); // 等.......
BufferedReader inFromClient = new BufferedReader(
new InputStreamReader(conncetionSocket.getInputStream()));
DataOutputStream outToClient = new DataOutputStream(
conncetionSocket.getOutputStream());
ClientSentence = inFromClient.readLine(); // 收到Client的命令
callDll.CMD(ClientSentence + ' ' ); // 调用dll中的函数执行命令
/* 打开文件统计Server回显信息的字节数 */
String filename = " out.txt " ;
FileInputStream fis = new FileInputStream(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 = new BufferedInputStream(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 " + ' ' );
}
}
}