如何在html / javascript中建立meteor中服务器端套接字与客户端套接字之间的连接

时间:2017-08-31 14:20:32

标签: javascript sockets meteor socket.io cors

我试图实现如下所示,但我面临两个问题。

  1. 我无法将 io 对象暴露给我从npm socket.io-client库获取的客户端,当它安装在meteor服务器中并尝试通过添加下面显示的脚本标记在客户端访问时

  2. 但是,我通过从cdnjs库中获取io对象来解决它。

    <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.3/socket.io.js"></script>
    

    2.尝试从客户端连接到服务器套接字时获取CORS错误。 客户端不在流星项目中,它是与html和js文件不同的应用程序。

    client.js(不在meteor中的文件)文件

    var socket = io('http://localhost:3000');
    

    server.js(meteor中的文件)文件

    import socket_io from 'socket.io';
    Meteor.startup(() => {
    const server = http.createServer();
    const io = socket_io(server);
    });
    

    任何线索都将不胜感激,谢谢!

3 个答案:

答案 0 :(得分:0)

  

我无法将io Object暴露给我从npm socket.io-client库获取的客户端,当它安装在meteor服务器中并尝试通过添加如下所示的脚本标记在客户端访问时。

请改用包装程序包:https://atmospherejs.com/joncursi/socket-io-client

  

尝试从客户端连接到服务器套接字时出现CORS错误。

按照此处的说明修复CORS错误:https://enable-cors.org/server_meteor.html

答案 1 :(得分:0)

我已经修复了问题并使流星插座连接到客户端(基本的html,javascript)。实施如下所示。

Meteor Server Side

<强> Main.js

import http from 'http';
import socket_io from 'socket.io';
var port = 3030;
const server = http.createServer();
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
const io = socket_io(server);

Meteor.startup(() => {
  socket_operation(io);
});

var socket_operation = Meteor.bindEnvironment((io) => {

    io.on('connection', Meteor.bindEnvironment((socket) => {
     .....
     your code goes here
     .....
    }
));

function onError(error) {
  if (error.syscall !== 'listen') {
    throw error;
  }

  var bind = typeof port === 'string'
    ? 'Pipe ' + port
    : 'Port ' + port;

  // handle specific listen errors with friendly messages
  switch (error.code) {
    case 'EACCES':
      console.error(bind + ' requires elevated privileges');
      process.exit(1);
      break;
    case 'EADDRINUSE':
      console.error(bind + ' is already in use');
      process.exit(1);
      break;
    default:
      throw error;
  }
}

function onListening() {
  var addr = server.address();
  var bind = typeof addr === 'string'
    ? 'pipe ' + addr
    : 'port ' + addr.port;
  console.log('Socket server listening on ' + bind);
}

客户端

<强> Main.js

var socket = io('http://path/to/meteor/server:3030');

<强>的index.html

<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.3/socket.io.js"></script>
<script src="http://localhost:3000/chatbox/main.js"></script>

答案 2 :(得分:0)

服务器/ main.js

import { Meteor } from 'meteor/meteor';
import { WebApp } from 'meteor/webapp';
import io from 'socket.io';

const { httpServer } = WebApp;

Meteor.startup(() => {
   io(httpServer);
})

<强>的客户机/ main.html中

<body>
  <script src="/socket.io/socket.io.js"></script>
  <script>
    var socket = io();
    socket.on('connect', () => {
      console.log('connect')
    });
    socket.on('event', (data) => {
      console.log('event', data)
    });
    socket.on('disconnect', () => {
      console.log('disconnect')
    });
  </script>
</body>