socket.io发出不起作用

时间:2016-12-27 14:54:15

标签: node.js sockets socket.io

我是socket.io世界的新手,我正在尝试一个简单的程序,如下所示

服务器端

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

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

io.on('connection', function(socket){
    console.log('socket listening.');
socket.on('chat_message', function(msg){
        console.log('message: ' + msg);
      });
});

http.listen(3000, function(){
  console.log('listening on *:3000');
});

客户端代码段

<script src="/socket.io/socket.io.js"></script>
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>
<script>
  var socket = io();
  $('form').submit(function(){
    socket.emit('chat_message', $('#m').val());
    $('#m').val('');
    return false;
  });
</script>
  <body>
    <ul id="messages"></ul>
    <form action="">
      <input id="m" autocomplete="off" /><input type="submit" id="submit" name="submit">Send</input>
    </form>
  </body>

所以在这里我看不到消息被打印出来。有人能帮助我理解同样的原因吗?

作为尝试,我在服务器端也做了以下事情。

 io.on('chat_message', function(msg){
        console.log('message: ' + msg);
      });

仍然没有用。

我尝试参考下面的链接,但无法理解相同的原因。

socket.io-client connecting, but not emitting

1 个答案:

答案 0 :(得分:0)

脚本标记应位于<head><body>元素中;你的不在里面。所以首先将它们移到body标签的末尾,以确保在运行脚本之前加载DOM。

您的第一个输入没有任何类型。添加type="text"以便您可以检索其值。

您已关闭第二个输入标记。 <input>标记是自动关闭的。无需关闭。 (您可以通过value属性设置值:value="Send"

<!DOCTYPE html>
<html>
  <head>
    <title>socket.io</title>
  </head>
  <body>
    <ul id="messages"></ul>
    <form>
      <input type="text" id="m" autocomplete="off">
      <input type="submit" id="submit" name="submit" value="Send">
    </form>
    <script src="/socket.io/socket.io.js"></script>
    <script src="http://code.jquery.com/jquery-1.11.1.js"></script>
    <script>
      var socket = io();
      $('form').submit(function(){
        socket.emit('chat_message', $('#m').val());
        $('#m').val('');
        return false;
      });
    </script>
  </body>
</html>