使用Node.js ws(einaros)创建聊天功能

5

昨天我开始使用这个模块。我正在尝试制作一个利用WebSocket进行聊天的应用。

现在遇到了问题,我不知道如何将客户端发送的消息传递给服务器,并显示给所有用户。在服务器端,我有以下代码:

var ipaddress = 'localhost';
var port = 8080;

var WebSocketServer = require('ws').Server
    , ws = new WebSocketServer({host:ipaddress, port:port});

ws.on('connection', function(ws) {
    console.log('New connection');
    ws.on('message', function(message) {
        ws.send(message);
    });
});

console.log('Listening to ' + ipaddress + ':' + port + ' ...');

在客户端,还有另外一段代码:

jQuery(document).ready(function($) {
    var content = $('#screen');
    var message = $('input[type="text"]').val();
    var ws = new WebSocket('ws://localhost:8080');

    ws.onopen = function() {
        console.log('Connected');
    };

    $('input[type="button"]').click(function() {
        ws.send(message);
    });

    ws.onmessage = function(msg) {
        console.log('Received message from server: ' + msg.data);
        addMessage(msg.data);
    }

    function addMessage(message) {
        content.prepend('<p><span>' + message + '</span></p>');
    }
});
2个回答

12

这里有解释,点击查看:

var WebSocketServer = require('ws').Server
  , wss = new WebSocketServer({host:ipaddress, port:port});

wss.broadcast = function(data) {
  for (var i in this.clients)
    this.clients[i].send(data);
};

// use like this:
wss.on('connection', function(ws) {
  ws.on('message', function(message) {
    wss.broadcast(message);
  });
});

@Alexbha 我编辑了我的回答,我忘记你正在覆盖 ws 变量,所以你在套接字上调用 broadcast 而不是在定义的服务器上调用。 - robertklep
我将代码片段放在了我的服务器端文件中。当我发送消息时,它既不会出现在终端上,也不会记录在日志中。我应该在客户端文件中做出一些改变吗?很抱歉我很菜,这是我第一次使用这个。 - user2088019
1
@Alexbha 这里有一个独立的服务器:gist。每个客户端将每秒发送一条随机消息,该消息将由服务器广播到所有连接的客户端。 - robertklep
好的!现在它可运行了,我忘记复制最后一行了。我会尝试将代码适应到我的程序中。谢谢。 - user2088019
1
@IbrahimApachi 这是服务器端代码,意味着它应该在像Node.js这样的Javascript运行时中运行,而不是在浏览器中运行。 - robertklep
显示剩余4条评论

0
var WebSocketServer = require('ws').Server
var webserver = new WebSocketServer({ port:3000 });

webserver.on("message",function(message) {
    webserver.clients.forEach(function(client) {
        client.send(message);
    });  
}):

1
请在您的答案中添加简短的解释。 - Nikolay Mihaylov

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