5

socket.io でクロム拡張を行っています。サーバーに接続してリアルタイムチャットを行うコンテンツスクリプトがありますが、バックグラウンドページでサーバーから情報を取得したいと考えています。このように別々にうまく機能します

コンテンツスクリプトで

var socket = io.connect('http://localhost:3700');
socket.on('dosomething',function(){
  console.log("test");
});

バックグラウンドページで

var socket = io.connect('http://localhost:3700');
socket.on('dosomething',function(){
  console.log("test");
});

しかし、サーバーが次のようなものを持っているときに、一度だけ接続する方法はありますか

app.js socket.emit('dosomething');

バックグラウンドページまたはコンテンツスクリプトのいずれかをトリガーします socket.on('dosomething') か?

chrome.runtime.sendMessage and を使用して、バックグラウンド ページによって確立されたソケットをコンテンツ スクリプトに送信しようとしましたが chrome.runtime.onMessage.addListener

しかし、うまくいきませんでした:(

解決策はありますか?

どうもありがとう!

4

1 に答える 1

8

socket.ioサーバーが「hello」リクエストを送信すると、バックグラウンドページにメッセージを送信するコンテンツスクリプトでsocket.ioクライアントを作成しようとしました。

コンテンツ スクリプト:

var socket = io.connect('http://localhost:1337');
socket.on("hello",function(data){
    console.log(data.text);
    chrome.runtime.sendMessage({msg:"socket",text:data.text},function(response){});
});

背景ページ:

chrome.runtime.onMessage.addListener(
    function(request,sender,senderResponse){
        if(request.msg==="socket"){
            console.log("receive from socket server: "+request.text);
        }
    }
);

サーバ側:

var app = require('http').createServer(handler).listen(1337);
var io = require('socket.io').listen(app);

function handler(req,res){
    console.log(req.url);
    res.writeHead(200, {'Content-Type':'text/plain'});
    res.end('Hello Node\n You are really really awesome!');
}

io.sockets.on('connection',function(socket){
    socket.emit('hello',{text:"node!"});
});

バックグラウンド コンソールのスクリーン ショット:

ここに画像の説明を入力

これがお役に立てば幸いです。

于 2013-07-24T08:23:25.680 に答える