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