如何使用Node.js通过套接字从服务器与客户端进行通信?

3

目前我正在创建一款JavaScript应用程序,我使用AppJS进行开发。

我在理解客户端和服务器之间的连接方面遇到了一些问题。

菜单栏 -> socket问题

问题出现在菜单栏和socket组合上。

Socket连接

io.sockets.on('connection', onSocketConnection)

function onSocketConnection(socket) {
    socket.emit('onMessage', {
        date: new Date(),
        message: 'Welcome!'
    })
}

菜单栏

var menubar = app.createMenu([{
    label:'File',
    submenu:[{
        label:'New',
        action: function() {
            // Simply window.reload() or windows.frame.reload()?    
            // Reload window
        }
    },{
        label:'Change something in view...',
        action: function() {
            // How to speak to client from here?
            // I cannot use socket.emit()
        }
    }, {
        label:'Exit',
        action: function() {
            window.close()
        }
    }]
}])

但如何告知客户端用户何时单击了菜单栏项目?

异步长函数 -> sockets

使用sockets的另一个问题是异步长时间加载函数。

套接字连接

io.sockets.on('connection', onSocketConnection)

function onSocketConnection(socket) {
    var test = veryLongLoading()
    console.log(test) // undefined -.-'
    socket.emit('test', {
        test: test

    })
}

所以我想要像这样使用回调函数:
io.sockets.on('connection', onSocketConnection)

function onSocketConnection(socket) {
    veryLongLoading(returnValue)
}

function veryLongLoadingFunction(next) {
    // Blablabla
    next('test')
}

function returnValue(value) {
    // Again socket is not available -.-'
    socket.emit('test', {
        test: test
    })
}

有没有人遇到过相同的问题,或者有人可以指引我正确的方向。

也许我只是对流程存在误解(我通常使用PHP编程)。

1个回答

0
问题1

对于第一部分,您需要从服务器侦听事件:

socket.on('message-from-server', function(data) {
  // You need to trigger the sub-menu change here.
  // Which means you need a handle for the sub-menu object.
  subMenu.action(data)
});

问题2

长时间运行的异步函数的模式如下:

var veryLongLoading = function(next) {
   // pass your value to next
   // like this
   next(someValue);
};

然后,要使用它,你需要这样做:

veryLongLoading(function(someValue) {
   socket.emit(someValue);
});

希望这能有所帮助!

我通过不使用套接字来“修复”问题。你的第二个例子将无法工作,因为socket.emit()veryLongLoading()中不可用。感谢你的帮助! - Ron van der Heijden
很高兴你能够在不使用套接字的情况下解决问题。但是,你应该通过将其设置为全局变量window.socket = socket,使“socket”对“verLongLoading”可用。 - Brad C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接