第45篇 js操作開啟本地程式

來源:互聯網
上載者:User

標籤:serial   name   blank   min   請求   head   post   public   des   

原文地址:http://blog.laofu.online/2017/06/10/how-js-controlApp/背景

假設有這樣一個產品,一個web和一個winform用戶端,在客戶在web的網頁上面點擊啟動用戶端來處理,這個時候開始調用本地的用戶端,來完成指定的工作。這種情境在日常的上網中也比較常見,如使用迅雷下載。當然實現的方式也有很多種,今天我來示範一種用監控Http請求來實現這個功能,思路如下:

HttpListener

對於上面的分析,最重要的功能雖實現對Http的監控,而.net中已經封裝了我們的需求,下面看下如何具體的實現:

static void Main(string[] args){        HttpListener listerner = new HttpListener();        try        {            listerner.AuthenticationSchemes = AuthenticationSchemes.Anonymous;//指定身分識別驗證 Anonymous匿名訪問            listerner.Prefixes.Add("http://localhost:8080/Service/");            listerner.Start();        }        catch (Exception ex)        {            Console.WriteLine("無法啟動監視:" + ex.Message);        }        Task.Factory.StartNew(() =>  //使用一個線程對監聽        {            while (true)            {                HttpListenerContext ctx = listerner.GetContext();                Task.Factory.StartNew(TaskProc, ctx);//回呼函數,開啟新線程進行調用,不影響下次監聽            }        });        Console.ReadKey();    }

 

實現請求的響應

現在我們可以拿到請求的內容相關的資訊ctx,先定義一個參數的格式,簡單的定義如下:

   public class ReciveInfo    {        public string path { get; set; }//應用程式所在的路徑        public string name { get; set; }//應用程式名稱    }

 

下面對ctx的Response資料進行填寫.

  static void TaskProc(object o)    {        HttpListenerContext ctx = (HttpListenerContext)o;        StreamWriter writer = new StreamWriter(ctx.Response.OutputStream, Encoding.UTF8);        try        {            //接收POST參數            Stream stream = ctx.Request.InputStream;            StreamReader reader = new StreamReader(stream, Encoding.UTF8);            String body = HttpUtility.UrlDecode(reader.ReadToEnd());            Console.WriteLine(body);            var reciveInfo = Json.JsonParser.Deserialize<ReciveInfo>(body);            Process.Start(reciveInfo.path);             ctx.Response.Headers.Add("Access-Control-Allow-Origin","*"); //防止出現跨域的問題錯誤            ctx.Response.StatusCode = 200; //設定返回給客服端http狀態碼            writer.Write(reciveInfo.name + "啟動成功");        }        catch (ArgumentException e)        {            ctx.Response.StatusCode = 500;            writer.Write("參數有誤:" + e.Message);        }        catch (Exception e)        {            ctx.Response.StatusCode = 500;            writer.Write("程式異常:" + e.Message);        }        finally        {            writer.Close();            ctx.Response.Close();        }    }

 

測試

在測試中我在js中啟動我電腦中的QQ,具體的代碼如下:

<button id="btnQQ"> start QQ</button>    <script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>    <script type="text/javascript">    $(function() {        $("#btnQQ").click(function() {            $.ajax({                type: "POST",                url: "http://localhost:8080/Service",                dataType: "json",                data: JSON.stringify({                    path: "D:/Program Files/Tencent/QQ/Bin/QQScLauncher.exe",                    name: "qq"                })             });        });    });    </script>

 

啟動後,運行如下:

第45篇 js操作開啟本地程式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.