2017-04-17 59 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

相關問題