[英]Using Socket.io with multiple clients connecting to same server
服務器-
var dgram = require('dgram');
var client= dgram.createSocket('udp4');
/** @requires socket.io */
var io = require('socket.io')(http);
/** Array of clients created to keep track of who is listening to what*/
var clients = [];
io.sockets.on('connection', function(socket, username){
/** printing out the client who joined */
console.log('New client connected (id=' + socket.id + ').');
/** pushing new client to client array*/
clients.push(socket);
/** listening for acknowledgement message */
client.on('message', function( message, rinfo ){
/** creating temp array to put data in */
var temp = [];
/**converting data bit to bytes */
var number= req.body.size * 2
/** acknowledgement message is converted to a string from buffer */
var message = message.toString();
/** cutting hex string to correspong to requested data size*/
var data = message.substring(0, number);
/** converting that data to decimal */
var data = parseInt(data, 16);
/** adding data to data array */
temp[0] = data
/** emitting message to html page */
socket.emit('temp', temp);
});
/** listening if client has disconnected */
socket.on('disconnect', function() {
clients.splice(clients.indexOf(client), 1);
console.log('client disconnected (id=' + socket.id + ').');
clearInterval(loop);
});
});
}
});
客戶-
var socket = io.connect('192.168.0.136:3000');
socket.on(temp', function(temp){
var temp= temp.toString();
var message= temp.split(',').join("<br>");
$('#output').html('<output>' + message + '</output>');
});
當客戶端連接時,會向客戶端發送一個名為 temp 的隨機數。 當一個客戶端連接到服務器時,上述代碼有效。 現在你怎么能每次都設置一個新的連接? 這樣,如果打開一個選項卡,它會返回自己的隨機消息,而當打開另一個選項卡時,它會返回自己的隨機消息。
你可以嘗試這樣的事情: 服務器端:
// you have your socket ready and inside the on('connect'...) you handle a register event where the client passes an id if one exists else you create one.
socket.on('register', function(clientUuid){ // a client requests registration
var id = clientUuid == null? uuid.v4() : clientUuid; // create an id if client doesn't already have one
var nsp;
var ns = "/" + id;
socket.join(id);
var nsp = app.io.of(ns); // create a room using this id that is only for this client
clientToRooms[ns] = nsp; // save it to a dictionary for future use
// set up what to do on connection
nsp.on('connection', function(nsSocket){
console.log('someone connected');
nsSocket.on('Info', function(data){
// just an example
});
});
客戶端:
// you already have declared uuid, uuidSocket and have connected to the socket previously so you define what to do on register:
socket.on("register", function(data){
if (uuid == undefined || uuidSocket == undefined) {// first time we get id from server
//save id to a variable
uuid = data.uuid;
// save to localstorage for further usage (optional - only if you want one client per browser e.g.)
localStorage.setItem('socketUUID', uuid);
uuidSocket = io(serverHost + "/" + uuid); // set up the room --> will trigger nsp.on('connect',... ) on the server
uuidSocket.on("Info", function(data){
//handle on Info
});
// initiate the register from the client
socket.emit("register", uuid);
您可以使用廣播消息。
廣播意味着向除啟動它的套接字之外的其他所有人發送消息。
服務器:
var io = require('socket.io')(80);
io.on('connection', function (socket) {
socket.broadcast.emit('user connected');
});
從我在代碼中看到的內容來看,每個命名空間總是有一個套接字(命名空間是 URI 的路徑部分)。 所以你不能為同一個命名空間創建新的套接字,因為它們都將使用同一個套接字。
一種解決方案是使用帶有正則表達式的動態命名空間:
服務器
io.of(/^\/path\/([0-9a-fA-F-]+)$/).on('connection', (socket) => {
console.log(`${socket.nsp?.name}: new connection with id '${socket.id}'`);
const namespace = socket.nsp?.name;
socket.on('event_for_server', ...);
io.of(namespace).emit('event_for_client', ...);
socket.disconnect();
});
客戶端(Java)
final String uuid = UUID.randomUUID().toString();
final Socket socket = IO.socket("http://.../path/" + uuid, options);
socket.on("connect", args -> {
socket.emit("event_for_server", ...);
});
socket.on("event_for_client", args -> {
...
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.