我正在使用ZeroMQ为服务器创建一个简单的聊天应用程序。在客户端,它只是一个“永远的框架”,一个等待来自聊天服务器的消息的无限循环,以及一个小的表单来向服务器发送消息。
这一切都很好,但我有一个美学问题。结果(可能是)无限循环,浏览器窗口/选项卡在页面打开时不断显示加载指示符。显然,整个互联网上的聊天服务都可以在浏览器显示加载指示器的整个过程中完成。那么,我该如何摆脱它?
这是相关代码。我认为最重要的部分是jQuery onLoad函数和chat.php中的部分,它在该无限循环中创建了一个JS调用。
HTML:
<div id="chat">
<div id="chatwindow">
</div>
<form id="chatform">
<input id="chatbox" name="chatbox" type="textarea" value="" />
<input type="submit" value="Send" />
</form>
</div>
<iframe id="datasrc" src="chat.php?name=myname"></iframe>
JS:
function updateChat(response) { //adds newly received message to chat window
$('#chatwindow').append('<p>' + response + '</p>');
}
$(document).ready(function(){
$('#chatform').submit(function(e) { //sends message to chat server through AJAX
$.post('send.php', {'name': myname, 'message': $('#chatbox').val()});
e.stopPropagation();
e.preventDefault();
$('#chatbox').val('');
});
});
send.php:
<?php
//sends message to server, not really important here
chat.php:
<?php
$context = new ZMQContext();
$sub = new ZMQSocket($context, ZMQ::SOCKET_SUB);
$sub->setSockOpt(ZMQ::SOCKOPT_SUBSCRIBE, '');
$sub->connect('tcp://localhost:5566');
$poll = new ZMQPoll();
$poll->add($sub, ZMQ::POLL_IN);
$readable = $writeable = array();
// Hack for chrome etc. to start polling
echo str_repeat("<span></span>", 100);
ob_flush();
flush();
while(true) {
$events = $poll->poll($readable, $writeable, 5000000);
if($events > 0) { //here is where we call a JS function to update the chat window
echo "\n\n<script type='text/javascript'>parent.updateChat('" . str_replace("'", "\'", $sub->recv()) ."');</script>\n\n";
} else {
echo ".";
}
ob_flush();
flush();
}