NodeJS Socket.IO不会连接

时间:2015-11-12 04:45:05

标签: node.js iis socket.io iisnode

我使用NodeJS,Express和Socket.IO构建了一个在线聊天应用程序 - 在本地运行正常,但无法让它在服务器上运行。我正在运行Windows 2012 / IIS 8.5 / IISNode。我的网站没有以虚拟形式运行,它以这种格式运行为应用程序:http://[domainname]/subfolder/chatserver.js

当我运行应用程序时,我有一个路由设置,所以如果你去'/',它会提供一个常规的HTML聊天窗口。如果你去第二个网址,它会提供一个管理员聊天窗口。两个窗口都应连接到服务器以发送消息,但是我无法连接它。

我正在引用socketio客户端,如下所示:

<script   src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.7/socket.io.min.js">    </script>

当我在本地运行时,我实际上不必像这样引用它,我可以这样做

<script src="socket.io/socket.io.js"></script>

这样,如果我理解正确,它应该从服务器下载脚本。但是,无论我尝试使用这种方法,我都会得到404.

在客户端代码中,我正在执行此调用:     socket = io.connect(地址,详细信息);     的console.log(插座);

在connect方法之后,socket.connected为false。有没有人知道它是否没有连接,因为我从与服务器上运行的nodejs应用程序不同的位置下载js?

我的第二个问题是,为什么我无法正确引用脚本并自动下载?是因为我作为应用程序运行,而不是作为虚拟应用程序运行?我需要能够作为应用程序运行,以便我可以使用域名。

任何帮助将不胜感激,我已经解决了这个问题,现在进行4天! :(

这是我的web.config文件:

<configuration>
  <system.webServer>

    <!-- indicates that the server-faye.js and server-socketio.js files are node.js applications 
    to be handled by the iisnode module -->

    <handlers>
      <add name="iisnode" path="chatserver.js" verb="*" modules="iisnode" />
    </handlers>

    <!-- indicate that all strafic the URL paths beginning with 'socket.io' should be 
    redirected to the server-socketio.js node.js application to avoid IIS attempting to 
    serve that content using other handlers (e.g. static file handlers)
    -->

    <rewrite>
         <rules>
              <rule name="LogFile" patternSyntax="ECMAScript">
                   <match url="socket.io" />
                   <action type="Rewrite" url="chatserver.js" />
              </rule>
         </rules>
    </rewrite>    

    <!-- disable the IIS websocket module to allow node.js to provide its own 
    WebSocket implementation -->
    <webSocket enabled="false" />

  </system.webServer>
</configuration>

这是服务器代码:

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

var port = process.env.PORT || 3000;

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

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

httpServer.listen(port, function () {
    console.log('listening on port: ' + port);
});

// Fires when a client connects to the server
io.sockets.on('connection', function (socket) {
    console.log('a user connected');
});

你可以看到它非常基本。当我点击网址时,我应该收到两条消息。第一个说它正在监听端口,第二个说用户连接。在当地,我得到了两个。在服务器上,我只是收听端口消息。

这是客户端代码:

<!doctype html>
<html>
<head>
    <title>Chat</title>
</head>
<body class="chat-body">

    <script src="https://cdn.socket.io/socket.io-1.2.0.js"></script>
    <script src="http://code.jquery.com/jquery-1.11.1.js"></script>

    <script type="text/javascript">
        var socket

        $(document).ready(function () {
            // Connect to the chat server
            socket = io();
            console.log(socket.connected);
        });
    </script>

</body>
</html>

1 个答案:

答案 0 :(得分:0)

此脚本标记(请注意与您所拥有的略有不同的前导斜杠):

<script src="/socket.io/socket.io.js"></script>
如果您的Web服务器在收到此路径请求时将提供socket.io.js,则

将起作用。

如果您正在运行node.js服务器端并在node.js上正确初始化socket.io库并且您已在服务器上正确安装了socket.io,那么socket.io将拦截上述请求并将提供{ {1}}返回浏览器。既然你得到了404,你显然没有正确配置。由于您尚未提供任何node.js代码,因此我们无法提供更具体的建议。