Node.js 节点SocketIo-客户端不发射?

Node.js 节点SocketIo-客户端不发射?,node.js,socket.io,Node.js,Socket.io,我遇到节点SocketIo客户端不发送数据的问题。因此,当客户机在index.html中连接时,会记录“已连接,这是一个测试”,但它不会socket.emit('cool'),不会出现错误,也不会登录server.js。我不知道为什么它没有发出或者服务器没有监听 Server.js const path = require('path'); const http = require('http'); const express = require('express'); const socket

我遇到节点SocketIo客户端不发送数据的问题。因此,当客户机在index.html中连接时,会记录“已连接,这是一个测试”,但它不会socket.emit('cool'),不会出现错误,也不会登录server.js。我不知道为什么它没有发出或者服务器没有监听

Server.js

const path = require('path');
const http = require('http');
const express = require('express');
const socketio = require('socket.io');

const app = express();
const server = http.createServer(app);
const io = socketio(server);

const PORT = 3002;

app.use(express.static(path.join(__dirname, 'public')));


// run when client connects
io.on('connection', () => {
    console.log('New WS connection...');
    io.emit('connection', 'This Is A Test');
});

io.on('cool', (msg) => {
    console.log(msg);
});


server.listen(PORT, () => console.log(`server running on port ${PORT}`));
index.html

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <title></title>
</head>
<body>
<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io.connect('http://' + document.domain + ':' + location.port);
  socket.on('connection', function(data){
    console.log("connected", data);
    socket.emit('cool', 'MSG');
  });
</script>
</body>
</html>

var socket=io.connect('http://'+document.domain+':'+location.port);
socket.on('connection',函数(数据){
控制台日志(“已连接”,数据);
emit('cool','MSG');
});

在服务器上,您需要在特定连接的套接字上而不是在
io
对象上侦听
cool
消息。
io
对象除了宣布新连接的套接字外,没有特定的套接字消息。要侦听来自特定套接字的消息,您需要连接的套接字本身上有一个侦听器。添加该侦听器的通常位置是在
连接
事件中,您将看到新连接的套接字对象

因此,改变这一点:

// run when client connects
io.on('connection', () => {
    console.log('New WS connection...');
    io.emit('connection', 'This Is A Test');
});

io.on('cool', (msg) => {
    console.log(msg);
});
为此:

// run when client connects
io.on('connection', (socket) => {
    console.log('New WS connection...');

    // send a test event back to the socket that just connected
    socket.emit('test', 'This Is A Test');

    // listen for the cool message on this new socket
    socket.on('cool', (msg) => {
        console.log(msg);
    });
});

此外,您确实不应该发出系统使用的事件名称,如
连接
。这就是为什么我将事件名称更改为
test
,这样它就不会与socket.io本身使用的名称冲突。

在服务器上,您需要在特定连接的套接字上,而不是在
io
对象上侦听
cool
消息。
io
对象除了宣布新连接的套接字外,没有特定的套接字消息。要侦听来自特定套接字的消息,您需要连接的套接字本身上有一个侦听器。添加该侦听器的通常位置是在
连接
事件中,您将看到新连接的套接字对象

因此,改变这一点:

// run when client connects
io.on('connection', () => {
    console.log('New WS connection...');
    io.emit('connection', 'This Is A Test');
});

io.on('cool', (msg) => {
    console.log(msg);
});
为此:

// run when client connects
io.on('connection', (socket) => {
    console.log('New WS connection...');

    // send a test event back to the socket that just connected
    socket.emit('test', 'This Is A Test');

    // listen for the cool message on this new socket
    socket.on('cool', (msg) => {
        console.log(msg);
    });
});
此外,您确实不应该发出系统使用的事件名称,如
连接
。这就是为什么我将事件名称更改为
test
,这样它就不会与socket.io本身使用的名称冲突