2017-04-17 106 views
1

我有两个客户端可以通过socket.io交换一些数据。我也有一台服务器。我需要做的是我想通过套接字发送数据从客户端1到客户端2,我无法弄清楚我如何实现它。请注意客户端1和客户端2是不同的HTML页面。无法在socket.io中将数据从一个客户端发送到另一个客户端Node.JS

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> 

回答

-1

确保通过网址在服务器端实例化客户端上的WS ...例如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; 
} 

现在如果你想发出一条消息,只是客户端1,你可以使用相关联的WS实例与他们通过从对象connections.client1抓住它,或者如果你想要目标客户端2 connections.client2

+0

嗨通过看你的答案@rdgd感谢您的回复,我认为你是什么试图说的是,我想从我的服务器发送消息给每个客户端,但是我需要做的是将消息从客户端1发送到客户端2!我将不得不使用服务器作为中间人,我完全理解你的答案! – Jeff

+0

他使用的是socket.io,这有助于您通过所有套接字客户端广播发送消息。 'socket.broadcast.emit()'我没有看到任何错误的代码是诚实的,它应该工作。但它看起来像还有其他东西丢失,完整的代码会帮助更多。 –

+0

没问题丹麦语。我试图回答你的问题,从客户端1发送到客户端2,是的,除非你使用WebRTC或其他类似的东西,否则你需要使用服务器作为中间人。不知道为什么我被低估了...我的回答假定他想从y客户端定位x客户端,而不是他想要将所有消息广播到所有客户端。这在概念上起作用,因为我多次实施了类似的设计。 – rdgd

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); 
}); 

索引。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和重新载入网页后termminal,你会看到客户机程序将有Broadcasting message HTML附加

+0

感谢我让我检查它在我的结束代码是几乎相同我想我可能一直在我的代码中缺少url – Jeff

相关问题