我正在建立一个基于 nodejs和socket.io 的实时聊天,以供专业人士使用。除了有时来自某些客户公司的计算机(大多数情况下,在Windows XP和IE8上),这种方法都可以正常工作。
该客户到达我的Apache服务器,加载包含聊天的HTML并调用下面的Javascript。不幸的是,它从未到过注入的socket.io脚本: http://example.com:843/socket.io/socket.io.js
注意:我使用websocket端口843试图避免防火墙问题(如果客户使用)
我想这可能是他们内部网络到达我们服务器的问题(可能是由内部代理/或防火墙引起的),但我无法确定,因为我无法从他们那里得到真实的反馈。所以说实话,我无视解决这个问题。
查找socket.io-proxy是一个好消息,可以测试它是否可以解决我的问题。不幸的是,似乎该项目尚未构建用于Web应用程序(需要使用,许多节点模块依赖...)。
以下客户代码的简单摘要:
使用
在http://example.com/mychat.php之类的HTML页面底部加载脚本<script type="text/javascript" src="js/chatux.js"></script>
,文件包含:
// using Mootools framework
// ----------------------- ONLOAD -----------------------
$(document).addEvent('domready', function() {
// ----------------------------------------------------------------
// global vars
(…)
var ioPort = 843;
var ioscript = 'http://'+window.location.hostname+':'+ioPort+'/socket.io/socket.io.js';
// Set the max moment to now (because server time can be different from client time)
moment().max( new Date().getTime() );
// ----------------------------------------------------------------
// Init server load
if ( window.self === window.top ){
appendScript(ioscript);
initIO();
}
// ----------------------------------------------------------------
// functions
function appendScript(pathToScript) {
var head = document.getElementsByTagName("head")[0];
var js = document.createElement("script");
js.type = "text/javascript";
js.src = pathToScript;
js.id = 'iojsloader';
head.appendChild(js);
}
function initIO(){
setTimeout(function(){
if (typeof io != 'undefined'){
ConnectingMsgHandler.set('html', __t('Connecting…'));
setTimeout(function(){
socket = io.connect('http://'+window.location.hostname+':'+ioPort);
initChatEvent( ioscript );
playSound('welcome');
}, 1000);
} else {
ConnectingMsgHandler.set('html', __t('Waiting for the server to be ready…'));
$('iojsloader').destroy();
appendScript(ioscript);
// retest to connect 90s later…
setTimeout(function(){ initIO(); }, 9000);
}
}, 1000);
}
function cidCheck(data){
// checking integrity of content received÷
// …
}
// ----------------------------------------------------------------
// Events
function initChatEvent(){
// sign-in onload
socket.emit('new user', [currentUserId, currentChatId], function(data){
if (data.cid != undefined){ currentCID = data.cid }
if(cidCheck(data)){
// launch chat UI…
} else{
alert(__t('Waiting for the server to be ready…'));
clearInterval(timerInterval);
var restartTimout = 30;
setTimeout(function(){ initIO(); }, (restartTimout*1000))
setTimeout(function(){
timerInterval = setInterval(function(){ $('ConnectingMsgHandler2').set('text', (restartTimout--)+'s') }, 1000);
}, 3000);
}
});
(…)
}
});
如果您还认为问题可能是由公司代理引起的,那么您是否有任何使用socket.io-proxy嵌入网页的提示? 使用我自己的chatux.js。
也许有人遇到了同样的问题,可能还有其他提示要进行调查吗?
这个项目是我的第一个nodejs体验,所以我很抱歉我误解了一些东西。 谢谢你的帮助。