Socket.emit()和/或socket.on()不起作用

时间:2019-02-17 03:06:54

标签: javascript html node.js html5 socket.io

我正在使用node.js和socket.io进行游戏,我只想使用socket.emit()和socket.on()将变量发送给客户端。但是,这似乎不起作用,我不确定为什么。我编写了一个精简程序,以查看我是否正确编写了此程序,因为我对socket.io非常陌生。

//server

var express = require('express');
var app = express();
var serv = require('http').Server(app);

app.get('/', function(req, res) {
	res.sendFile(__dirname + '/client/index.html');
});
app.use('/client', express.static(__dirname + '/client'));

serv.listen(2000);
console.log('Server started.');

var SOCKET_LIST = {};

var PLAYER_LIST = {};

var optypes = [Math.floor(Math.random()*6), Math.floor(Math.random()*6), Math.floor(Math.random()*6), Math.floor(Math.random()*6)]

var op1 = {
    x: 450,
    y: 600,
    type: optypes[0]
}
socket.emit('operations', op1);
<canvas id="ctx" width="900" height="1400" style="border:1px solid #000000;"></canvas>

<script src="https://cdn.socket.io/socket.io-1.4.5.js"></script>
<script>

//client

var ctx = document.getElementById("ctx").getContext("2d");
    ctx.font = '30px Arial';
    
    var socket = io();


    socket.on('operations', function(data) {
        console.log(data);
        
    });

</script>

是socket.emit吗?是socket.on吗?都是吗为什么我在控制台中没有收到变量op1?

提前谢谢!

2 个答案:

答案 0 :(得分:0)

您应该在connection之后发射。否则,客户将不会收到它。在下面更改您的服务器代码

服务器

var express = require('express');
var app = express();
var serv = require('http').Server(app);
var io = require('socket.io')(serv);
app.get('/', function(req, res) {
    res.sendFile(__dirname + '/client/index.html');
});
app.use('/client', express.static(__dirname + '/client'));
serv.listen(2000);
console.log('Server started.');
var SOCKET_LIST = {};
var PLAYER_LIST = {};
var optypes = [Math.floor(Math.random()*6), Math.floor(Math.random()*6), Math.floor(Math.random()*6), Math.floor(Math.random()*6)]
var op1 = {
    x: 450,
    y: 600,
    type: optypes[0]
}
io.on('connection',(socket) =>{
    socket.emit('operations', op1);
})

答案 1 :(得分:0)

您尚未在服务器代码中指定任何套接字io库。为了发出一个套接字,您必须等待直到建立连接。

//server

var express = require('express');
var app = express();
var serv = require('http').Server(app);
var socketio = require('socket.io')(serv);

app.get('/', function(req, res) {
    res.sendFile(__dirname + '/client/index.html');
});
app.use('/client', express.static(__dirname + '/client'));

serv.listen(2000);
console.log('Server started.');

var SOCKET_LIST = {};

var PLAYER_LIST = {};

var optypes = [Math.floor(Math.random()*6), Math.floor(Math.random()*6), Math.floor(Math.random()*6), Math.floor(Math.random()*6)]

var op1 = {
    x: 450,
    y: 600,
    type: optypes[0]
}

var connection = socketio
  .on('connection', function (socket) {
    socket.emit('operations', op1);
});

此外,您还需要在客户端代码中指定要连接到的服务器。如果要在端口2000上运行套接字服务器,则必须指定要连接到的服务器。

<canvas id="ctx" width="900" height="1400" style="border:1px solid #000000;"></canvas>

<script src="https://cdn.socket.io/socket.io-1.4.5.js"></script>
<script>

//client

var ctx = document.getElementById("ctx").getContext("2d");
    ctx.font = '30px Arial';

    var socket = io('http://localhost:2000');


    socket.on('operations', function(data) {
        console.log(data);        
    });

</script>