无法在socket.io Node.JS中将数据从一个客户端发送到另一个客户端

时间:2017-04-17 15:10:00

标签: javascript node.js sockets

我有两个客户端可以通过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");

 });

Client1.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>

2 个答案:

答案 0 :(得分:0)

好的,这是我在当地做的,你可以根据自己的需要改变它。

  

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

答案 1 :(得分:-1)

确保在客户端实例化WS时将URL传递给服务器...例如var socket = io.connect('http://localhost');

在服务器端,每个客户端的每个WS连接都是唯一的实例。也就是说,为此目的,您必须仔细考虑发出事件时您所针对的哪个WS连接。

要解决的第一件事是如何将WS连接实例与特定客户端关联。对此的答案是使用地图/字典/普通ol&#39; javascript对象,将某种唯一的客户端标识符作为键,将WS连接的实例作为值。伪代码:

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

每次创建新的WS实例时都会添加到此对象。假设您有一种唯一标识客户端并存储在变量clientId中的方法,您可以执行以下操作:

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

现在,如果要向client1发送消息,可以使用与对象关联的WS实例,方法是从对象connections.client1抓取它,或者如果要定位client2 connections.client2