《基于java的远程控制程序》(2)

现在已经解决了在Server端使用cmd命令的难点,接下来要实现的就是TCP链接了

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

 

 

如果要想显示其它文件夹则必须加上其绝对路径如dir e:e-book

 

这个程序当然不光是用来浏览文件夹的啦。你还可以是一下别的指令如shutdowntype……。

(但是同时也有bug,就是如果我要是想对Server上的Java文件和C文件进行编译或链接的话必须将它复制到Server.class所在的本文件夹)。

 

以下是ClientServer的实现代码:

Client

 

 

/*
 * 文件名: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();

      }

  }

}

 

 

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 "   +   ' ' );

        }

    }

}

 如果有需要源码或本程序的Demo的话可以通过我的邮箱像我索取。由于我对java、socket及cmd了解得不是很深所以可能会有更多的bug没有发现,如果您发现有什么bug请在回贴指出,谢谢!^_^.
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值