谷歌插件与桌面通讯

时间:2023-01-22 23:35:12

谷歌插件的运行是在一个封闭的沙盒中的,所以要想从本地读出相应的数据无法达到。这时,我们可以考虑SOCKET通信。

原理:本地运行一个SOCKET监听某个端口,插件向该服务端口发送信息,服务处理后,再返回相应的数据。

服务中使用的是SOCKET,实现代码如下

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Web;//需要引用System.Web程序集

namespace ChromeService
{
    public class ListenService
    {
        private TcpListener listener;
        private int listenPort = 20000;  
	private Encoding encoding_ = Encoding.UTF8;

        public ListenService()
        {
            try
            {              
                listener = new TcpListener(IPAddress.Parse("127.0.0.1"), listenPort);
                listener.Start();           
                Thread listenThread = new Thread(StartListen);
                listenThread.Start();
            }
            catch (Exception ex)
            {
                Console.WriteLine("ListenService Exception :" + ex.Message);
            }
        }

        public void StartListen()
        {

            while (true)
            {
                try
                {
                    Socket newSocket = listener.AcceptSocket();
                    if (!newSocket.Connected)
                    {
                        continue;
                    }

                    Byte[] receive = new Byte[10240];
                    newSocket.Receive(receive, receive.Length, 0);
                    byte[] backData = handle(receive);
                    newSocket.Send(backData, backData.Length, 0);
                    newSocket.Close();
                    continue;
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
        }

  	public byte[] handle(byte[] cmdPack)
        {
            string bufferStr = encoding_.GetString(cmdPack);
            byte[] backData = new byte[2] { 0, 0 };

            //只处理"get"请求类型
            if (bufferStr.Substring(0, 3) != "GET")
            {
                return backData;
            }

            int dataBegin = bufferStr.IndexOf(@"/") + @"/".Length;
            int dataEnd = bufferStr.IndexOf("HTTP");
            string cmdPackStr = bufferStr.Substring(dataBegin, dataEnd - dataBegin);
            string cmdData = "";
            if (cmdPackStr.Length > 2)
            {
                cmdData = cmdPackStr.Substring(2);
                cmdData = HttpUtility.UrlDecode(cmdData);//如果插件发送的数据有中文时,需要进行解码
            }
            string cmd = cmdPackStr.Substring(0, 2).Trim();//从插件发送来的命令占两个字符00-FF
            switch (cmd)
            {
                case "0F":
                    {                        
                        backData = encoding_.GetBytes("OK");
                        break;
                    }
                default:
                    {
                        backData = encoding_.GetBytes("DEFAULT");
                        break;
                    }
            }

            return backData;
        }

    }
}

在插件中使用的是XHR或者JQUERY的AJAX,实现代码如下

/// <reference path="../libs/jquery-1.7.2.min.js"/>
var Communicate = {};

Communicate.send = function (cmd, data, callback) {//jquery的ajax实现
    var sendCmdData = "";
    if (cmd === undefined || cmd === null) {
        return;
    }
    sendCmdData += cmd;
    if (data !== undefined || data !== null) {
        sendCmdData += data;
    }
    var url = 'http://localhost:20000/' + sendCmdData
    $.ajax({ url: url, async: false, success: callback });
}
Communicate.send = function (cmd, data, callback) {//xhr实现
    var xhr = new XMLHttpRequest();
    var sendCmdData = "";
    if (cmd === undefined || cmd === null) {
        return;
    }
    sendCmdData += cmd;
    if (data !== undefined || data !== null) {
        sendCmdData += data;
    }
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4) {
            if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) //200:Success.304:Tell browser to read cache.
            {
                //alert(xhr.responseText);
                if (callback === undefined || callback === null) {
                    return;
                }
                callback(xhr.responseText);
            }
        }
    }

    xhr.open("GET", 'http://localhost:20000/' + sendCmdData, true);
    xhr.send(null);
}

转载请注明出处 http://blog.csdn.net/xxdddail/article/details/13507379