2017-02-17 121 views
-1

在文檔頁面上,他們說我需要這樣使用。將客戶端socket.io返回給變量

io.on('connection', function (socket) { 
    socket.emit('news', { hello: 'world' }); 
    socket.on('my other event', function (data) { 
     console.log(data); 
    }); 
}); 

有什麼方法可以將客戶端暴露給變量?

var socket = io.on('connection'); 
socket.emit('news', { hello: 'world' }); 

在幫助頁面他們說Server#onconnection(socket:engine#Socket):Server暴露一個客戶端,但我無法弄清楚如何使用它。 doc

這樣我可以在我的其他功能中使用套接字。

現在對我的東西冒落的每個函數我做io.on('connection', function (socket)一遍

另一個問題:

有一種方法不同的文件發出事件彼此

app.js

var app = require('express')(); 
var server = require('http').Server(app); 
var io = require('socket.io')(server); 

的file1.html發射

<script src="socket.io/socket.io.js"></script> 
<script> 
    var socket = io('http://localhost'); 

    socket.emit('event15', function(x){ 
    }); 

</script> 

file2.html收到

<script src="socket.io/socket.io.js"></script> 
<script> 
    var socket = io('http://localhost'); 

    socket.on('event15', function(x){ 
    }); 

</script> 

回答

0

在您需要處理多個插槽,一個爲每個客戶端服務器。這就是爲什麼在服務器上,你編寫了一個事件處理程序,爲每個連接的新客戶機設置套接字。其基本思路是這樣的:

服務器:

io.on('connection', function(socket) { 
    socket.on('chat message', function(msg) { 
    io.emit('chat message', msg); 
    }); 
}); 

你的所有消息處理應該是在外部功能設置。通過調用socket.emit()

io.on('connection', function(socket) { 
    socket.on('login', function(data) { 
    myServer.attemptLogin(socket, data.user, data.hash); 
    }); 
}); 

attemptLogin(socket, user, hash)功能現在可以處理的參數,然後回覆到客戶端。如果您想:如果你想在其他地方卻使用socket,你可以通過它在這樣將每個用戶的套接字存儲在一個變量中,您需要創建一個數據結構來執行此操作。這裏有一個例子:

var users = {}; // empty object 
io.on('connection', function(socket) { 
    users[socket.id] = socket; // store socket for later use 
    // ... 
}); 

這是但如果連接的用戶可以在斷開連接後不知何故恢復他們以前的會話時纔有用。否則,這只是正確組織你的函數和變量的問題。

至於第二個問題,您不能將數據從一個HTML文檔發送到另一個。只要用戶點擊導致file2.html的鏈接,就會打開一個新的套接字並且socket.io甚至不會意識到這仍然是同一個用戶。就socket.io而言,一些隨機的傢伙在世界其他地方剛剛打開file2.html
有兩種解決方法:您可以創建一個單頁面應用程序,用戶從未實際導航到另一個站點。但是,如果他們不小心關閉了標籤,或者導航回來或刷新頁面,他們仍然會失去連接。
另一種方式是使用某種會話信息。如果用戶登錄,則可以將其用戶名和密碼散列存儲在localStorage中。在每個頁面上,檢查localStorage是否存儲了憑據,然後發送"login"消息到服務器。

+0

它有助於澄清一些事情,但我不在乎用戶,我不需要發送和發送事件的「用戶」,不在乎是否爲2或一千。 幾乎沒有什麼會在服務器上進行處理,僅在客戶端上執行。 這就是爲什麼我想從file1發出並從file2作出反應。 –

+0

那你爲什麼要用socket.io呢?如果你想在file1上存儲信息並將它讀回到file2上,只需使用'localStorage'。 –

+0

我沒有說'商店',我說發送事件,電腦1打開文件1(管理頁面)發送事件,電腦2文件2(前端)反應事件,反之亦然@ chris-g(第三個電腦將是服務器) –

相關問題