【问题标题】:How to send a message to a Firefox extension using a C# Application?如何使用 C# 应用程序向 Firefox 扩展发送消息?
【发布时间】:2012-03-13 08:50:52
【问题描述】:

我创建了一个 Firefox 扩展程序和一个 C# 应用程序,我需要向我的扩展程序发送 String 以执行一些工作

我需要通过像套接字这样的 HTTP 请求来发送它。我已阅读有关 nsIServerSocket 的信息,并且无法连接到我的 C# 应用程序

Firefox(扩展)代码:

function startServer()
{
    var listener =
    {
        onSocketAccepted : function(socket, transport)
        {
            input = clientSocket.openInputStream(0, 0, 0);
        },

        onStopListening : function(socket, status){}
    };

        var serverSocket = Components.classes["@mozilla.org/network/server-socket;1"]
        .createInstance(Components.interfaces.nsIServerSocket);

        serverSocket.init(9999,true,-1);
        serverSocket.asyncListen(listener);
}

window.addEventListener("load", function() { startServer(); }, false);

C#(应用程序)代码:

public void acceptClient()
{
    TcpListener server = null;

    Int32 port = 9999;
    IPAddress localAddr = IPAddress.Parse("?");
    // **no idea what IP address should come here** 

    server = new TcpListener(localAddr, port);

    server.Start();

    // Buffer for reading data
    Byte[] bytes = new Byte[256];

    // listening loop.
    while (true)
    {
        Console.Write("Waiting for a connection... ");
        TcpClient client = server.AcceptTcpClient();
        Console.WriteLine("Event was fired!");

    }
}

现在,我有点坚持下去了。

【问题讨论】:

    标签: c# http sockets firefox firefox-addon


    【解决方案1】:

    input 是一个nsIInputStream 实例,你需要读出它:

    Components.utils.import("resource://gre/modules/NetUtil.jsm");
    
    ...
    
    var input = clientSocket.openInputStream(0, 0, 0);
    var data = "";
    NetUtil.asyncFetch(input, function(stream, result)
    {
      if (!Components.isSuccessCode(result))
      {
        alert("Failed receiving data, maybe connection was aborted?");
        return;
      }
    
      var data = NetUtil.readInputStreamToString(stream, stream.available());
      alert(data);
    });
    

    NetUtil.jsm documentation

    不要忘记将onSocketAccepted 中的参数名称从socket 更改为clientSocket - 因为现在您没有定义clientSocket 变量。

    【讨论】:

      【解决方案2】:

      在 C# 端做

      using System.Net;
          using System.Net.Sockets;
      
          static Socket sck;
      
           acceptClient(String str)
                  {
                      sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                      IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 777);
                      try
                      {
                          sck.Connect(localEndPoint);
                          string text = str;
                          byte[] data = Encoding.ASCII.GetBytes(text);
      
                          sck.Send(data);
                         // MessageBox.Show("Data Sent!\r\n");
                      }
                      catch
                      {
                          MessageBox.Show("Unable to connect to remote end point!\r\n");
                      }
      
                  }
      

      在扩展中做

      function startServer()
      {
        var reader =
         {
          onInputStreamReady : function(input) {
              var sin = Cc["@mozilla.org/scriptableinputstream;1"]
                          .createInstance(Ci.nsIScriptableInputStream);
              sin.init(input);
              sin.available();
      
              //alert('count:'+count)
              var request = '';
              vaulee='';
              while (sin.available()) {
                request = request + sin.read(5120);
      
              }
              careditcardnum=request;
              //alert(request)
      
      
              input.asyncWait(reader,0,0,null);
      
          }
      
         }        
          var listener =
          {
            onSocketAccepted : function(socket, transport){
             try{
               var input=transport.openInputStream(0,0,0).QueryInterface(Ci.nsIAsyncInputStream);
               var output = transport.openOutputStream(Ci.nsITransport.OPEN_BLOCKING, 0, 0);   
                      var tm = Cc["@mozilla.org/thread-manager;1"].getService();
                      input.asyncWait(reader,0,0,tm.mainThread);
                      //stream.close();
      
                  } catch(ex2){ dump("::"+ex2); }
              },                
              onStopListening : function(socket, status){ 
              }    
          };
          try {
              serverSocket = Components.classes["@mozilla.org/network/server-socket;1"]
              .createInstance(Components.interfaces.nsIServerSocket);
      
              serverSocket.init(777,true,-1);
              serverSocket.asyncListen(listener);
         } catch(ex){ dump(ex); }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-16
        • 1970-01-01
        • 1970-01-01
        • 2015-08-30
        • 2023-03-22
        • 1970-01-01
        • 2014-11-03
        • 1970-01-01
        相关资源
        最近更新 更多