以Java為例,使用Socket的概念實作遠端下達指令,並取得回傳值。但此程式還有很多問題存在,所以希望各位若有使用的人,也可以提供一下意見,謝謝囉~~!

 

程式碼如下:

import java.io.*;
import java.net.*;



public class CommandServer {


public static void main(String[] args) {
    //使用 port number 1234
    final int port = 1234;

    ServerSocket serverSkt; 
    Socket skt; 
    BufferedReader sktReader; 
    PrintStream sktStream; 
    String message; //Client輸入的指令
    String output = null; //Server回應的訊息
    
    serverSkt = new ServerSocket(port); 
    
    while(true) { 
            System.out.printf("連接埠 %d 接受連線中......%n", port); 
            skt = serverSkt.accept(); 
            System.out.printf("與 %s 建立連線%n", 
            skt.getInetAddress().toString()); 


            sktReader = new BufferedReader(new 
                  InputStreamReader(skt.getInputStream())); 


            while((message = sktReader.readLine()) != null) {
                
                   //使用"quit"指令來離開
                   if(message.equals("quit")) {  
                   skt.close(); 
                   break; 
                   }
                    
                   //在Server的Console顯示Client輸入的指令
                   System.out.printf("Client: %s%n", message);
                   sktStream = new PrintStream(skt.getOutputStream());
                    
                   //在Client顯示自己輸入的指令
                   sktStream.printf("Client: %s%n", message);


                   //此為使用Windows NT系統下的"令命提示字元"用法
                   String cmd="cmd /c ";
                   //若是Linux,可以使用以下的用法
                   //String cmd="/bin/bash -c ";

            
                   //接上Client輸入的指令
                  cmd += message;
                  Runtime rt = Runtime.getRuntime();
                  Process p = rt.exec(cmd);
                  BufferedWriter buffOut = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
                  BufferedReader buffIn = new BufferedReader(new InputStreamReader(p.getInputStream()));
                  buffOut.flush();

                  output = null;
            
                  //判斷Server是否有訊息要回覆給Client
                  while((output = buffIn.readLine())!= null)
                  {

                        //迴圈一次以一列字串訊息送給Client
                        sktStream.printf("echo: %s%n", output);
                   }

                   buffOut.close();
                   buffIn.close();
    
            } 
    } 
            
}
}


參考來源:
(1)
作者:swanky - 如何取得由Java程式呼叫的外在程式的執行結果?
(2)
良葛格學習筆記 - ServerSocket 類別
(3)
JavaWorld@TW
(4)
良葛格學習筆記

dreamtails 發表在 痞客邦 PIXNET 留言(0) 人氣()