FirefoxSDK插件:非常奇怪,我可以在同一个地址上打开2个服务器套接字:端口

FirefoxSDK插件:非常奇怪,我可以在同一个地址上打开2个服务器套接字:端口,firefox,sdk,serversocket,Firefox,Sdk,Serversocket,我正在开发一个使用服务器套接字的firefox插件,我发现我可以用相同的地址打开服务器套接字:端口,这很奇怪。我已经和netstat核实过了,我很震惊 其行为是,第一个打开的服务器套接字接受所有连接,然后,当它关闭时,第二个套接字开始接受新连接 更有趣的是,如果我用java打开一个服务器套接字,那么我就不能用firefox插件打开另一个服务器套接字。所以,应该有一些标志允许这个问题,但我在sdkapi中找不到任何可以避免这个问题的东西 我在Windows7下做测试 我想立即检测服务器套接字是否已

我正在开发一个使用服务器套接字的firefox插件,我发现我可以用相同的地址打开服务器套接字:端口,这很奇怪。我已经和netstat核实过了,我很震惊

其行为是,第一个打开的服务器套接字接受所有连接,然后,当它关闭时,第二个套接字开始接受新连接

更有趣的是,如果我用java打开一个服务器套接字,那么我就不能用firefox插件打开另一个服务器套接字。所以,应该有一些标志允许这个问题,但我在sdkapi中找不到任何可以避免这个问题的东西

我在Windows7下做测试

我想立即检测服务器套接字是否已打开。我不想打开客户端套接字来检查这个。有什么想法吗

这里是我如何打开插座,不是很难

try
{
    serverSocket = Cc["@mozilla.org/network/server-socket;1"].createInstance(Ci.nsIServerSocket);
    serverSocket.init(listenPort, true, 100);
    serverSocket.asyncListen(listener);
}
catch(error)
{
    console.log(error);

好的,经过大量的搜索,我只能为这个问题提供一个解决方案。只需测试服务器套接字是否已打开。这个解决方案非常快,而且有效。以下是一些用于创建ServerSocket以避免此问题的代码:

const {Cc, Ci, Cu, components}  = require("chrome");

const gThreadManager = Cc["@mozilla.org/thread-manager;1"].getService();

function ServerSocket(){

    function checkFreePort(port, callback, error){
        try{        
            var bRead = false;
            var socket_service = Cc["@mozilla.org/network/socket-transport-service;1"].getService(Ci.nsISocketTransportService);

            // we open a socket client to test if there is a server socket listening
            socket = socket_service.createTransport(null, 0, "127.0.0.1", port, null);
            socket.setEventSink ({
                onTransportStatus : function(transport, status){
                    if (status == nsISocketTransport.STATUS_CONNECTED_TO) // connected
                    {
                        if (!bRead)
                        {
                            bRead = true;
                            try{
                                socket.close();
                            }catch(ex){
                                console.log(ex);
                            }
                            // connected to the server socket, so we return error
                            error();
                        }
                    }
                }
            }, gThreadManager.mainThread);

            // we put a timeout to avoid the block of the extension forever, 2 seconds should be enougth for localhost
            // actually tests shows that the socket replies instantly if there is no server socket listening on the onInputStreamReady
            socket.setTimeout(0, 2000);

                    var input = socket.openInputStream(Ci.nsITransport.OPEN_BLOCKING,0,0);


            input.asyncWait({
                onInputStreamReady: function(input) {
                    try
                    {
                        // if there is no server socket listening, we get onInputStreamReady and reading the stream will throw an error...

                        if (bRead) // we detected the connection before, so we have finished
                            return;
                        var sin = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream);
                        sin.init(input);
                        sin.read(1);
                        bRead = true;
                        // we read something, code should never execute this because we must be connected before and we have controlled it
                        // but... just in case...
                        error();

                    }
                    catch(ex) {
                        // error reading, the socket can't connect, so it is ok for us
                        bRead = true;
                        callback();
                    }           
                    finally
                    {
                        sin.close();
                        input.close();
                    }
                }
            }, 0, 0, gThreadManager.mainThread);
        }
        catch(error2)
        {
            console.log("Unexpected error: " + error2);
            error();
        }

    }

}

ServerSocket.prototype = {
    listen: function(port, listener, errorCallback){
        checkFreePort(port, function(){
            serverSocket.init(port, true, 100);
            serverSocket.asyncListen(listener);
        }, errorCallback);
    }
}


var listener = {
        onSocketAccepted: function(serverSocket, clientSocket) {
            console.log("Accepted connection on " + clientSocket.host + ":" + clientSocket.port);

            // do stuff

        }
    };  


var server = new ServerSocket(8080, listener, function(){
    console.log("Error creating server socket");
});