3

ローカルホストのポートをリッスンするJavaで書かれたサーバーがあります。Firefox拡張機能を介して接続しようとしています。リクエストを送信してレスポンスを受け取ることはできますが、1 回だけです。次に、なぜ機能しなくなったのかわかりません。応答を送信することさえできません。

ある時点でストリームが閉じると思いますが、終了時にストリームpumpを閉じないようにインターフェイスのパラメーターを設定しているため、理由はわかりません...

これが私のコードです:

const {components} = require("chrome");
const {NetUtil} = components.utils.import("resource://gre/modules/NetUtil.jsm");


var transport = null;
var outstream = null, instream = null;
var instream = components.classes["@mozilla.org/scriptableinputstream;1"]
        .createInstance(components.interfaces.nsIScriptableInputStream);
var pump = components.classes["@mozilla.org/network/input-stream-pump;1"]
        .createInstance(components.interfaces.nsIInputStreamPump);
var dataListener = null;

exports.connect = function(server, port, callback) {
    transport = components.classes["@mozilla.org/network/socket-transport-service;1"]
                          .getService(components.interfaces.nsISocketTransportService)
                      .createTransport(["udp"], 0, server, port, null);                          
    outstream = transport.openOutputStream(0, 0, 0);
    stream = transport.openInputStream(0, 0, 0);

    // Initialize
    instream.init(stream);
    pump.init(stream, -1, -1, 0, 0, false);

    dataListener = {
        receivedData: [],

        onStartRequest: function(request, context) {
            console.log("Connected to server");
        },

        onStopRequest: function(request, context, status) {
            console.log("End of request");                     
        }, 

        onDataAvailable: function(request, context, inputStream, offset, count) {
            var data = instream.read(count).replace(/\n/gm,'');         
            callback(data);   
        }
    };
    pump.asyncRead(dataListener, null); 
}

exports.send = function(data) {
    // Send data
    var outData = data + '\n';
    outstream.write(outData, outData.length);
}

exports.close = function(data) {
    // Close stream
    outstream.close();
    stream.close();
}

編集: Java サーバーのコード

    public PluginConnection(int newPort) throws IOException {
    serverSocket = new ServerSocket(this.port);
}

public void send(String message) {
    if (this.clientSocket != null) {
        out.println(message);
    } else {
        System.err.println("ERROR: message could not be sent because "
                + "connection is not established.");
    }
}


public void open() {        
    try {
        clientSocket = serverSocket.accept();           
    } catch (IOException e) {
        System.err.println("ERROR: PIRServer could not open connection.");
        e.printStackTrace();
    }       
}

public String getRequest() {
    try {
        in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        out = new PrintWriter(clientSocket.getOutputStream(), true);
    } catch (IOException e) {
        System.err.println("ERROR: PIRServer could not open streams.");
        e.printStackTrace();
    }

    String query = null;
    try {
        query = in.readLine();
    } catch (IOException e) {
        System.err.println("ERROR: could not open parse query.");
        e.printStackTrace();
        out.println("-1");
    }
    return query;
}

public void close() {
    try {
        if (in != null) {
            in.close();             
        }           
        if (out != null) {
            out.close();                
        }           
        if (clientSocket != null) {
            clientSocket.close();
        }
        if (serverSocket != null) {
            serverSocket.close();
        }
    } catch (IOException e) {
    } catch (Exception e) { 
        e.printStackTrace();
        System.exit(-1);
    }
}

誰かが解決策を知っていますか?

4

1 に答える 1

0

これはあなたが探しているような答えではないかもしれませんが、とにかく提案したいと思いました.

Java を使用する代わりに、node.js を Web ソケット サーバーとして使用し、Firefox で MozWebSocket を使用することを検討してください。それは本当にうまくいきます。たとえば、Firefox アドオンでは次のようになります。

if (typeof (MozWebSocket) != 'undefined') {
   mysocket = new MozWebSocket(SOCKET_URL);
} else if (typeof (WebSocket) != 'undefined') {
   mysocket = new WebSocket(SOCKET_URL);
} else {
   alert("Can't get socket");
}
if (mysocket === null) {
   alert("Can't get socket");
}

mysocket.onerror = function(event) {
/* error handling here */
};

mysocket.onopen = function() {
   mysocket.send(JSON.stringify(msg));
   mysocket.close();
}

サーバー側では、node.js から必要なものは次のとおりです。

var wss, http, server, wsServer, Client, fs, qs;

wss = require('node_modules/websocket/lib/WebSocketServer');
http = require('http');
fs = require('fs');
qs = require('querystring');

initializeServer();

wsServer.on('connect', function(connection) {
    console.log((new Date()) + " Connection accepted.");
    connection.on('message', function(message) {
        if (message && message.type === 'utf8') {
            var data = JSON.parse(message.utf8Data);
            /* parse data here */
        }
        else {
            console.log("Data is not utf8! Data = " + message);
        }
    });

    connection.on('close', function(connection) {
    console.log((new Date()) + " Client " + connection.remoteAddress + " disconnected.");
    });
});

function initializeServer() {
    server = http.createServer(function(request, response) {
    });
    server.listen(6969, function() {
        console.log((new Date()) + " Server is listening on port 6969");
    });

    wsServer = new wss({
        httpServer: server,
     maxReceivedMessageSize: 0x800000,
        autoAcceptConnections: true
    });
}
于 2013-03-12T07:27:13.837 に答える