1

通常、あるクライアントから別のクライアントに JSON を送信すると、正常に動作します。ただし、クライアントが 1 つしかない場合でも、パケットを送信します。私の解決策は(サーバー側で、node.jsで)することでした:

var clients = io.sockets.clients();

if(clients.length > 1){
// send stuff to other client
}

しかし、そうすると、非常に奇妙なことが起こります。クライアントを開き、if ステートメントでアクションを開始します。送信前に JSON を出力するコンソールは何もしません。クライアントが 1 つしかないためです。別のクライアントを開いて if ステートメントの実行中にアクションを開始すると、コンソールは JSON を出力し、それを別のクライアントに送信します。ただし、最初に開いたクライアントに移動して、if ステートメントでアクションを開始すると、コンソールには何も出力されず、何も送信されません。なんで?if ステートメントを次のように変更してみました。

if("hello" === "hello"){
// do the same stuff as before
}

両方のクライアントが互いに JSON を送信できましたが、if ステートメントを変更したため、一方のクライアントが開いていると、依然として無駄なパケットを送信していました。明らかな理由から、最適な状況は、1 つのクライアントでパケットを送信せず、複数のクライアントで適切にパケットを送信する場合です。

それが明確だったことを願っています。そうでない場合は申し訳ありません。

必要に応じて、さらにコードを投稿します。

編集

配列を更新するコードは次のとおりです。

var clients = io.sockets.clients();

io.sockets.on("connection", function (socket) {
clients.length++;
socket.on("disconnect", function() {
clients.length--;
console.log(clients.length + " clients are connected");
});
console.log(clients.length + " clients are connected");
});
4

2 に答える 2

0

最近note.jsを実行していません。おそらく、これは偽物です。しかし、私は考えました。おそらく、clients変数は、クライアントが接続するときにクライアントごとに定義され、後で更新されないのではないでしょうか。これは私には論理的なことのようです。新しいクライアントが接続したときにすべてのクライアントにイベントを発生させ、「clients」変数を更新する必要があると思います。

于 2012-04-22T06:11:03.370 に答える
0

あなたのコードがどのように機能するのかわかりません (これは何ですか: clients.length++?? 配列の長さの増分??) が、これを「通常の」方法で実行してみてください:

var clients;

io.sockets.on("connection", function (socket) {
  clients = io.sockets.clients();
  socket.on("disconnect", function() {
      clients = io.sockets.clients();
      console.log(clients.length + " clients are connected");
  });
  console.log(clients.length + " clients are connected");
});

またはさらに良い(接続ユーザーへのグローバル参照を保持しない):

function get_clients() {
  var clients = io.sockets.clients();
  console.log(clients.length + " clients are connected");
}

io.sockets.on("connection", function (socket) {
  socket.on("disconnect", function() {
    get_clients();
  });
  get_clients();
});

io.sockets.clients()呼び出した時点で接続されているすべてのクライアントの配列を返すためです (おそらく、この奇妙な動作が発生するのはそのためです)。

于 2012-04-22T08:06:59.477 に答える