Почему nsIScriptableInputStream не работает? - PullRequest
1 голос
/ 19 октября 2011

Я работаю над расширением Firefox, которое будет общаться с Java через Socket.

Вот мой код Java

      Socket clientSocket = new Socket("localhost", 8888);
      PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
      String messageToServer="Success" ;
      out.write(messageToServer);

Вот мой JavaScript

var reader = {
            onInputStreamReady : function(input) {
                var sin = Components.classes["@mozilla.org/scriptableinputstream;1"]
                            .createInstance(Ci.nsIScriptableInputStream);
                sin.init(input);
                var request = '';
                try
                {
                  while (true)
                  {
                    var chunk = sin.read(512);
                    alert(chunk.length);
                    if (chunk.length == 0)
                      break;
                    alert(chunk);
                    request=request+chunk;
                  }
                  alert("Received"+request);
                }
                catch (e)
                {
                  alert("Error: failed reading from stream:\n" + e + "\n");
                }
            } 
        } 
    var listener = {
        onSocketAccepted: function(serverSocket, transport) {
            addSpan("Accepted connection on " + transport.host + ":" + transport.port);
            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);

        }
    }

Но Javascript ничего не получает.Я вижу ту же проблему в ссылке .Что нужно сделать, чтобы эта работа?

1 Ответ

2 голосов
/ 11 января 2012

для работы с сокетами вам нужен не только поток сценариев, но и:

1.nsiTransportService

2.nsIScriptableInputStream

3.nsIInputStreamPump

выможете использовать этот код:

this.transportService = Components.classes["@mozilla.org/network/socket-transport-service;1"].
                                        getService(Components.interfaces.nsISocketTransportService);
    this.scriptablestream = Components.classes["@mozilla.org/scriptableinputstream;1"].
                                            createInstance(Components.interfaces.nsIScriptableInputStream);
    this.pump = Components.classes["@mozilla.org/network/input-stream-pump;1"].
                                                createInstance(Components.interfaces.nsIInputStreamPump);
this.transport = this.transportService.createTransport(null, 0, server, port, null);
this.outstream = this.transport.openOutputStream(1, 0, 0);
this.outputData = "";
  //this is where the connection is actually opens.
            this.outstream.write(this.outputData, this.outputData.length);
            this.outstream.flush();
this.stream = this.transport.openInputStream(0, 0, 0);
this.scriptablestream.init(this.stream);
var dataListener = {
            data: "",
            onStartRequest: function (request, context) {
    //here is the event for connection established
                                },
            onStopRequest: function (request, context, status) {
    // here is the event if connection lost
            },
            onDataAvailable: function (request, context, inputStream, offset, count) {
    // here is where you recive input from server
                var response = scriptStream.read(count);
                            };

this.pump.init(this.stream, -1, -1, 0, 0, false);
        this.pump.asyncRead(dataListener, null);

//to write to stream
  outstream.write(data, data.length);
   outstream.flush();

надеюсь, это поможет вам.о, кстати, по моему опыту, порядок кода имеет решающее значение, но не стесняйтесь доказать, что я работаю: -).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...