【问题标题】:Socket.io Error (socket.send is not a function)Socket.io 错误(socket.send 不是函数)
【发布时间】:2012-01-26 09:58:39
【问题描述】:

我是第一次尝试 Websockets/Node.js/Socket.io/Express,我正在尝试创建一个简单的聊天程序。一切运行良好,我在节点终端中看到了两个客户端。

但是当我尝试执行我的socket.send() 时,我在 Firefox 中得到一个错误(socket.send 不是一个函数)。它不会抱怨socket.connect(),所以我知道socket.io.js 已加载。

这是我的服务器代码:

var sys = require('util');
var express = require('express');
var io = require('socket.io');

var app = express.createServer();
app.listen(8080);
app.use(express.static(__dirname));

app.get('/', function (req, res) {
    res.render('index.html', {
        title: 'Chat'
    });
});

var socket = io.listen(app);

socket.on('connection', function (client) {
    client.on('message', function (message) {
        console.log("Message: " + JSON.stringify(data));
        socket.broadcast(message);
    });
    client.on('disconnect', function () {});
});

我的客户代码:

<script src="http://localhost:8080/socket.io/socket.io.js"></script>

var socket = new io.Socket("http://localhost:8080");
socket.connect();

然后我做一些代码来获取聊天消息并发送它。

socket.send(JSON.stringify(values));

【问题讨论】:

标签: node.js websocket socket.io


【解决方案1】:

说明

您没有在服务器端和客户端正确初始化 Socket.io。

  • 客户端

    1. new io.Socket("http://localhost:8080"); 没有给你想要的对象,你需要new io.connect("http://localhost:8080");

    2. 您需要等到客户端连接到服务器后才能发送消息。

  • 服务器端

    1. socket是Socket.IO发回的对象,需要使用socket.sockets才能访问on

    2. 要广播消息,您需要像这样使用客户端对象:client.broadcast.send()

    3. 您的广播中不存在变量 data。你的意思可能是message

解决方案

  • 服务器

    var sys = require('util'),
        express = require('express'),
        io = require('socket.io'),
        app = express.createServer();
    
    app.listen(8080);
    
    app.use(express.static(__dirname));
    
    app.get('/', function (req, res) {
        res.render('index.html', {
            title: 'Chat'
        });
    });
    
    var io = io.listen(app);
    
    io.sockets.on('connection', function (client) {
        client.on('message', function (message) {
            console.log("Message: " + JSON.stringify(message));
            client.broadcast.send(message);
        });
    
        client.on('disconnect', function () {});
    });
    
  • 客户

    <script src="http://localhost:8080/socket.io/socket.io.js"></script>
    <script>
        var socket = new io.connect("http://localhost:8080"),
            connected = false;
    
        socket.on('connect', function () {
            connected = true;
        });
    
        // Use this in your chat function.
        if (connected) {
            socket.send(JSON.stringify(values));
        }
    </script>
    

【讨论】:

    【解决方案2】:

    socket.broadcast(message); 应该是io.sockets.emit('key', message);

    当您使用传入的套接字对象时,您会向该客户端发送唯一的连接事件,要向所有客户端发送您必须使用io.sockets.emit()

    还有socket.send(JSON.stringify(values));我想你想做socket.emit(namespace, data);

    在此处查看我的一个项目中的连接文件:https://github.com/AdminSpot/HangoutCanopy/blob/master/javascripts/connection.js

    【讨论】:

      【解决方案3】:

      您必须等待 socket.io 在客户端连接

      var socket = new io.Socket("http://localhost:8080");
      socket.connect();
      socket.on('connect', function() {
        socket.emit('event', data);
      });
      

      【讨论】:

        猜你喜欢
        • 2013-05-12
        • 2018-08-27
        • 2015-11-05
        • 1970-01-01
        • 1970-01-01
        • 2021-01-24
        • 2018-03-03
        • 1970-01-01
        • 2015-09-22
        相关资源
        最近更新 更多