【问题标题】:How to invoke server-side function from client-side using socket.io?如何使用 socket.io 从客户端调用服务器端函数?
【发布时间】:2013-08-23 22:34:33
【问题描述】:

使用 express 框架。我想调用位于 server.js 中的function init() { // }(使用 express.js 设置)

客户端包含代码

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

但我想在客户端的 index.html 上从 &lt;a href='WHAT TO PUT HERE'&gt; Click to invoke Init() on server &lt;/a&gt; 调用 init()

编辑:

<a href='javascript:callInit();'> Get Init </a>

中调用上面的函数callInit()
 <script> function callInit() {  socket.emit('init', 'data'); }

但是`socket.emit('init', 'data');不执行。我不明白为什么?

【问题讨论】:

  • 您要初始化 express 还是驻留在正在运行的应用程序中的函数?如果您想在应用程序和套接字运行的情况下调用方法,只需查看 socket.io 示例并让客户端发出一些您在服务器端有事件的数据。 socket.on('initiate', init).
  • 我想在服务器端调用一个函数init()。
  • 代码的编辑部分有效。错误在别处。

标签: node.js express socket.io


【解决方案1】:

客户端.js

  <script src="/socket.io/socket.io.js"></script>
  <script>
     var socket = io.connect('http://localhost');
     $("#urAnchorTagId").click(function(){
         socket.emit('urEvent','urData');
   });
 </script>

服务器.js

   var app = express();
   var server = http.createServer(app);
   var io = require('socket.io').listen(server);
   server.listen(8080);
   io.sockets.on('connection', function (socket) {
       socket.on('urEvent', function (data) {
        function init(){
             //ur task

            };
   });
 });

【讨论】:

  • 而不是在 socket.on 中定义函数 init。我只是想在那里调用它。所以我写了 socket.on('urEvent', init(););
【解决方案2】:

如果您想要一种“通用”的方式来调用服务器对象的方法并获取它们的结果,那么容易做到。

例如,我想在服务器端公开给定 service 对象的方法:

var service = {
   init: function(p1, p2) {
     return p1+p2;
   }
};

// exposes all methods
for (method in service.__proto__) {
  // use a closure to avoid scope erasure
  (function(method){
    // method name will be the name of incoming message
    socket.on(method, function() {
      // assumption that the invoked method is synchronous
      var result = service[method].apply(service, arguments);
      // method name suffixed with '-resp' will be the outgoing message
      socket.emit(method+'-resp', result);
    });
  })(method)

在客户端,您可以执行以下操作:

socket.emit('init', 10, 5);
socket.on('init-resp', function(result) {
  console.log('addition result: '+result);
});

它可能会在控制台上打印15

如果您需要异步行为,我可以提供另一个示例。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-06-27
  • 2015-01-10
  • 2019-05-22
  • 1970-01-01
  • 2018-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多