簡體   English   中英

無法將數據從一個客戶端發送到socket.io Node.JS中的另一個客戶端

[英]Unable to send data from one Client to another in socket.io Node.JS

我有兩個客戶端,可以通過socket.io交換一些數據。 我也有一台服務器。 我需要做的是我想通過套接字將數據從客戶端1發送到客戶端2,但我無法弄清楚如何實現。請注意,客戶端1和客戶端2是不同的html頁面。

Server.JS

var express = require('express');
var app = express();
var fs = require('fs');
var path = require('path');

var server = require('http').createServer(app);
var io = require('socket.io')(server);
var port = process.env.PORT || 3000;
var ip=process.env.IP||"192.168.1.5";
app.use(express.static(__dirname));
server.listen(port,ip, function () {
  console.log('Server listening at port %d ', port);
});
app.get('/index', function(req, res) {
  res.sendFile(path.join(__dirname,'/test.html'));
})
app.get('/index1', function(req, res) {
  res.sendFile(path.join(__dirname,'/test1.html'));
})

io.on('connection', function (socket) {
   socket.on('broadcast', function (message) {
            console.log(message);




            socket.broadcast.emit('message', message);
            });
            console.log("connected");

 });

客戶端1.JS

 <!doctype html>
<html lang="en">
<head>
</head>
<body>
 <script src="/socket.io/socket.io.js"></script>
 <script >
var socket = io.connect();
socket.emit('broadcast',"Broadcasting Message");
socket.on('message', function (data) {

     alert(data)
});
 </script>
  </body>

Client2.JS

 <!doctype html>
<html lang="en">
<head>
</head>
<body>
 <script src="/socket.io/socket.io.js"></script>
 <script >
var socket = io.connect();


socket.on('message', function (data) {

     alert(data)
    //socket.emit('message',"Hello world");
});
 </script>
  </body>

好的,這是我在本地執行的操作,您可以根據需要進行更改。

server.js

var io = require('socket.io')(80);

io.on('connection', function (socket) {
 socket.on('broadcast', function (message) {
        console.log(message);
        socket.broadcast.emit('message', message);
        });
        console.log("connected");

});

client1.js

var socket = io.connect('ws://127.0.0.1');
socket.emit('broadcast',"Broadcasting Message");
socket.on('message', function (data) {
     $('#client1').html(data);
});

client2.js

 var socket = io.connect('ws://127.0.0.1');
 socket.on('message', function (data) {
     $('#client2').html(data);
});

index.html

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <script type="text/javascript" src='https://code.jquery.com/jquery-1.12.4.min.js'></script>
    <script type="text/javascript" src="/socket.io/socket.io.js"></script>
    <script type="text/javascript" src="client1.js"></script>
    <script type="text/javascript" src="client2.js"></script>
</head>
<body>
        <div> <h1> CLIENT 1 </h1><div id="client1"></div></div>
        <div> <h1> CLIENT 2 </h1><div id="client2"></div></div>
</body>
</html>

在運行終端node server.js並重新加載頁面后,您將看到client2將附加Broadcasting message html。

在客戶端實例化WS時,請確保將URL傳遞給服務器...例如var socket = io.connect('http://localhost');

在服務器端,與每個客戶端的每個WS連接都是唯一的實例。 也就是說,為此,您必須仔細考慮在發出事件時要針對的WS連接。

首先要解決的是如何將WS連接實例與特定客戶端相關聯。 答案是使用map / dictionary / plain ol的javascript對象,將某種獨特的客戶端標識符作為鍵,並將WS連接實例作為值。 偽代碼:

let connections = { 'client1': WSinstance, 'client2': WSinstance };

每次創建新的WS實例時,都將添加到該對象。 假設您有一種唯一標識客戶端的方法,並且該方法存儲在變量clientId ,則可以執行以下操作:

io.on('connection', function (socket) {
  connections[clientId] = socket;
}

現在,如果您只想向client1發送消息,則可以通過從對象connections.client1抓取它來使用與其關聯的WS實例,或者如果您希望將client2 connections.client2作為目標

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM