我使用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>
答案 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代码,因此我们无法提供更具体的建议。