Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript node.js+;socket.io+;express.js:没有连接_Javascript_Node.js_Apache_Express_Socket.io - Fatal编程技术网

Javascript node.js+;socket.io+;express.js:没有连接

Javascript node.js+;socket.io+;express.js:没有连接,javascript,node.js,apache,express,socket.io,Javascript,Node.js,Apache,Express,Socket.io,我一直在尝试设置一个简单的socket.io示例,但它无法正常工作。客户端在Apache2上运行,应该通过端口3000访问node.js-server 似乎没有任何连接,服务器是否实际运行也无关紧要-如果在服务器上手动停止node.js-process($kill xyz),我的客户端控制台不会抛出任何错误。应用程序运行时会出现完全相同的结果(info-socket.io已启动) 服务器: // Check dependencies & setup backend var express

我一直在尝试设置一个简单的socket.io示例,但它无法正常工作。客户端在Apache2上运行,应该通过端口3000访问node.js-server

似乎没有任何连接,服务器是否实际运行也无关紧要-如果在服务器上手动停止node.js-process(
$kill xyz
),我的客户端控制台不会抛出任何错误。应用程序运行时会出现完全相同的结果(
info-socket.io已启动

服务器

// Check dependencies & setup backend
var express = require('express');
var server = express();
var http = require('http');
var app = http.createServer(server); // somehow needed? ("Socket.IO's `listen()` method expects an `http.Server` instance as its first parameter.")
var socket = require('socket.io');
// listen @ port 3000 as definied by proxy
server.listen(3000);
// listen w/ socket.io as well
var io = socket.listen(app);

...

// socket.io
// TODO: test, added 01/03/14 
io.set('match origin protocol', true);
io.set('log level', 2);
var clients = io.sockets.clients();
io.sockets.on('connection', function(client) {
    console.log('Connection from ' + client);

    client.emit('news', {
        hello : 'world'
    });

    client.on('event', function(data) {
        console.log(data);
    });
});
<script type="text/javascript" src="./js/socket.io.js" ></script>
        <script>
            try {
                var socket = io.connect('https://localhost:3000');
                console.log(io);
                console.log('check 1', socket.socket.connected); // false

                socket.on('connect', function() {
                    console.log('check 2', socket.socket.connected); // not reached
                });

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

            } catch(error) {
                console.log(error);
            } finally {
                console.log('fin');
            }
        </script>
客户端

// Check dependencies & setup backend
var express = require('express');
var server = express();
var http = require('http');
var app = http.createServer(server); // somehow needed? ("Socket.IO's `listen()` method expects an `http.Server` instance as its first parameter.")
var socket = require('socket.io');
// listen @ port 3000 as definied by proxy
server.listen(3000);
// listen w/ socket.io as well
var io = socket.listen(app);

...

// socket.io
// TODO: test, added 01/03/14 
io.set('match origin protocol', true);
io.set('log level', 2);
var clients = io.sockets.clients();
io.sockets.on('connection', function(client) {
    console.log('Connection from ' + client);

    client.emit('news', {
        hello : 'world'
    });

    client.on('event', function(data) {
        console.log(data);
    });
});
<script type="text/javascript" src="./js/socket.io.js" ></script>
        <script>
            try {
                var socket = io.connect('https://localhost:3000');
                console.log(io);
                console.log('check 1', socket.socket.connected); // false

                socket.on('connect', function() {
                    console.log('check 2', socket.socket.connected); // not reached
                });

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

            } catch(error) {
                console.log(error);
            } finally {
                console.log('fin');
            }
        </script>
客户端:

var express = require('express');
var app = express();
var server = app.listen(3000);
var io = require('socket.io').listen(server);

app.use(express.static(__dirname + '/'));

io.sockets.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});
<script type="text/javascript" src="js/socket.io.js" ></script> 
        <script>
            var socket = io.connect('ws://localhost:3000');
            socket.on('news', function(data) {
                console.log(data);
                socket.emit('my other event', {
                    my : 'data'
                });
            });

        </script>

var socket=io.connect('ws://localhost:3000');
socket.on('news',函数(数据){
控制台日志(数据);
socket.emit('my other event'{
我的:“数据”
});
});

请遵循以下示例:

此外,这是错误的:

io.connect('https://localhost:3000');

应该是
ws://localhost:3000/
好了,伙计们,我终于把它安装好并运行了

我所做的是将我的反向代理从Apache迁移到node.js/node-http-proxy-solution。我不确定这是否是强制性的——但在重新配置Apache2.2.2,甚至编译Apache2.4.7都没有帮助之后,我认为这是值得一试的。我还切换到了子域而不是子域,因为子域在某些情况下似乎也会导致问题。同样,不知道这是否只是一种预防措施,或者这是否真的是必要的

然而,我非常确定的是如何加载socket.io.js。因为我的反向代理已经将请求转发到正确的(内部)IP,所以我必须通过TLD w/o端口或ws://访问socket.io.js以及实际的Websocket

长话短说,以下是相关代码:

服务器

var express = require('express');
var app = express();
var server = app.listen(3000);
var io = require('socket.io').listen(server);

app.use(express.static(__dirname + '/'));

console.log('Express server started on port %s', app);

io.sockets.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});
客户端

<script src="http://mysubdomain.mydomain.com/socket.io/socket.io.js"></script>
<script>
    var socket = io.connect('http://mysubdomain.mydomain.com');
    // , {secure: true}

    socket.on('news', function(data) {
        console.log(data);
    });
</script>
最后但并非最不重要的一点是,对于任何通过谷歌偶然发现这一点的人来说,使用的版本包括:

$ npm list --depth=0
myapp@0.0.0 /path/app
├── express@3.4.7
└── socket.io@0.9.16

$ npm list --depth=0
/path/proxy
└── http-proxy@0.10.4

撇开变量名不谈:这似乎与我的设置非常相似,并产生相同的错误。添加了更多。老兄,老实说你做错了太多事情了。所以,请从简单的例子开始,不断改进。但从简单开始。如果调用app.listen(),app将创建一个内部http服务器,因此
server
io
对象是无意义的(?)app-指向extress。expressit本身依赖于http。如果您调用
http.createServer
,它会将http套接字连接到
app
(express),以便下次调用
socket.listen
将绑定到同一个http服务器。当你调用app.listen时,那个家伙会使用我们之前创建的http服务器。所以他们都有关联。请检查我在答案中提供的链接中的默认示例,并与它们一起玩以进一步理解。这些示例都不起作用。给定的express.js+socket.io示例参考的是Express2.0,github上的“新”文档针对的是未发布的1.0版本。在我的Mac上设置新的本地项目w/
npm install socket.io express
w/初始化服务器的代码(因为官方示例不起作用)及其index.html示例,我得到的只是
“NetworkError:404未找到-http://127.0.0.1:8020/socket.io/socket.io.js“
。此外,ws://-协议的使用也没有提到。我现在真的很困惑。你的服务器端代码应该使用
app.listen
(而不是
server.listen
)。您的客户端应该使用:src=“/socket.io/socket.io.js”。如果您还想为Apache启用websocket,那么让我们来查找关于itI的文档,因为客户端存储在/var/www/xyz中,而node.js位于/var/node中,所以不能简单地使用socket.io/socket.io.js。因此,我只是将它复制到了正确的位置:
$./node\u modules/socket.io/node\u modules/socket.io-client/dist/socket.io.js$cp./node\u modules/socket.io/node\u modules/socket.io-client/dist/socket.io.js/var/www/xyz/js
。WebSocket似乎在Apache2.2中不可用,建议的解决方案似乎只使用xhr轮询。不幸的是,这也不起作用。使用nginx代理是无痛且直接的-最新版本在默认情况下支持WebSockets流量代理,因此它与node.js一起工作会更好、更高效。事实上,您的socket.io连接可能只使用XHR长轮询,而不是WebSockets,因为Apache可能不知道如何处理WS-traffic。仔细检查这一点,因为在这种情况下,你会失去很多网络性能。感谢你发布这篇文章,我有同样的错误,你的例子帮助了我!