Делитесь файлами с socket.io - PullRequest
1 голос
/ 27 марта 2020

Я использую Node.js и Socket.io для своего веб-приложения.

Я хочу передать файл, который может быть как-то большого размера (> 15 Мб) всем подключенным сокетам, а затем использовать его в моих клиентах. Есть ли способ сделать это?

PS: если у вас есть демоверсия с Babylon. js + socket.io, это было бы здорово

РЕДАКТИРОВАТЬ :
По запросу мой код сервера:

import { createServer } from 'http';
import { createSocketServer} from "./socket";
import cookieParser from "cookie-parser";
import express from "express";
import morgan from "morgan";
import path from "path";

const port = 3000;

// Create a new express application instance
const app: express.Application = express();

app.use(cookieParser());
app.use(morgan('dev'));

const server = createServer(app);

// create a socket.io server
createSocketServer(server);

app.use('/', express.static(path.join(__dirname, 'public')));

server.listen(port,'0.0.0.0', function () {
  console.log('Server is listening on port ' + port + ' !');
});

Вавилонские активы Код загрузки:

this.assetsManager = new BABYLON.AssetsManager(this.scene);

this.assetsManager.addMeshTask('obj task', '',
      'http://192.168.0.100:3000/babylon-files/dir1/', 'objectFile.obj');
this.assetsManager.addMeshTask('mtl task', '',
      'http://192.168.0.100:3000/babylon-files/dir1/', 'materialFile.mtl');
this.assetsManager.addTextureTask('text1 task',
      'http://192.168.0.100:3000/babylon-files/dir1/texture1.jpg');
this.assetsManager.addTextureTask('text2 task',
      'http://192.168.0.100:3000/babylon-files/dir1/texture2.jpg');

this.assetsManager.onFinish = ((tasks) => {
      this.engine.runRenderLoop(() => {
        this.scene.render();
      });
}).bind(this);

this.assetsManager.load();

1 Ответ

0 голосов
/ 02 апреля 2020

Вы можете хранить файлы *.obj & *.mtl на одном сервере.

Обратите внимание, что код вашего узла и веб-сервера не может выполняться на одном и том же порту. Вы должны использовать обратный прокси-сервер или прослушивать разные порты.

Это предотвращает проблемы между сайтами. Например: создайте на своем веб-сервере каталог, доступный для публикации c: http://example.com/assets/babylon-files

В вашем коде node теперь вы можете запускать клиенты для загрузки файлов по этому пути:


// socket.io logic above
// waiting for connetions, auth, etc...

// tell conencted clients what the should load from 
// http://example.com/assets/babylon-files
socket.broadcast.emit('loadAsset', 'house.obj');
socket.broadcast.emit('loadAsset', 'car.obj');
socket.broadcast.emit('loadAsset', 'wall.obj');

Клиент должен выглядеть примерно так:


// listen for socket.io events from server here
io.on("loadAsset", (filename) => {

  // tell babylon to load assets
  BABYLON.SceneLoader.Load("/assets/babylon-files", filename, engine, function (scene) {
   // do something with the scene
  });

  // - or -

  // tell babylon to append assets
  BABYLON.SceneLoader.Append("/assets/babylon-files", filename, function (scene) {
    // do something with the scene
  });


});

Точно так же вы можете отправлять двоичные данные клиентам:


fs.readFile("/path/to/obj<or>mtl/file", (err, buff) => {

    if (err) {
        res.status(500).end();
        return;
    }

    socket.binary(true).emit("loadAsset", buff);

});
...