实现Django和socket.io一起工作

时间:2016-01-28 08:28:43

标签: django node.js socket.io

我正在关注此tutorial以使用Django和Socket.io(节点js)构建实时应用程序。我正在一个流浪盒中构建它,并在我的宿主文件中配置了vagrant机器。既然教程是一篇旧帖子,我就会遇到很多错误。但是在修复了一些已弃用的代码之后,就会出现这种情况。

chat.js:

var server = require('http').createServer().listen(4000);
var io = require('socket.io').listen(server, {
    'authorization': function(data, accept) {
        if (data.headers.cookie) {
            data.cookie = cookie_reader.parse(data.headers.cookie);
            return accept(null, true);
        }
        return accept('error', false);
    }
});
var cookie_reader = require('cookie');
var querystring = require('querystring');
var redis = require('redis');
var sub = redis.createClient();
sub.subscribe('chat');

io.on('connection', function (socket) {
    sub.on('message', function(channel, message){
        socket.send(message);
    });
    socket.on('send_message', function (message) {
        values = querystring.stringify({
            comment: message,
            sessionid: socket.handshake.cookie['sessionid'],
        });

        var options = {
            host: 'localhost',
            port: 80,
            path: '/node_api',
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded',
                'Content-Length': values.length
            }
        };

        //Send message to Django server
        var req = http.get(options, function(res){
            res.setEncoding('utf8');

            //Print out error message
            res.on('data', function(message){
                if(message != 'Everything worked :)'){
                    console.log('Message: ' + message);
                }
            });
        });

        req.write(values);
        req.end();
    });
});

的index.html:

<head>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js" type="text/javascript"></script>
    <script src="{% static "js/socket.io.js" %}"></script>
    <script>
        $(document).ready(function () {
            var socket = io('http://localhost:4000');
            socket.on('connect', function () {
                console.log("connect");
            });
            ...
            ...
            ...
    </script>

但是现在当我加载页面时,我遇到了这个错误

  

获取http://localhost:4000/socket.io/?EIO=3&transport=polling&t=LA7JSiV net :: ERR_CONNECTION_REFUSED

在index.html中我改变了这个

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

到这个

var socket = io();  

我收到此错误

  

获取http://vagrant-box.com/socket.io/?EIO=3&transport=polling&t=LA7NH61 404(未找到)

我做错了什么?请帮我解决这个问题。非常感谢您的帮助。谢谢。

1 个答案:

答案 0 :(得分:0)

首先请注意,您无法从django提供socket.io js,socket.io必须提供它自己的js文件,因为它确实有一些聪明的魔法来确定它必须发送的文件。

更改

<script src="{% static "js/socket.io.js" %}"></script>

<script type="text/javascript" src="http://localhost:4000/socket.io/socket.io.js"></script>

(您必须在制作时更改这些网址)

之后你必须让socket.io知道连接到node.js服务器的确切模式,主机和端口,否则你将得到一个404,因为套接字会尝试连接你的django服务器正在监听的端口。 / p>

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