我正在考虑对网站上的“通知”系统进行长时间轮询。我以前从未这样做过,因此我正在网上寻找有关它的信息。我正在看这里:http ://techoctave.com/c7/posts/60-simple-long-polling-example-with-javascript-and-jquery
在关于长轮询的部分中,它说:“超时:为请求设置超时(以毫秒为单位)。超时时间从进行 $.ajax 调用时开始。这里,我们将超时设置为 30 秒。这意味着在 ajax 调用完成并且(至少)三十 (30) 秒过去之前,我们的 poll 函数不会再次被调用。”
说 poll 不会被调用,直到 ajax 调用完成并且至少过去了 30 秒。
当我将其添加到 Javascript 中时,poll 会在 ajax 调用完成时被一遍又一遍地调用。它不会等待 30 秒。
(function poll() {
$.ajax({ url: "/myapp/messages/messages/checkMessages", success:
function(data){alert("YO");}, complete: poll, timeout: 30000 });
})();
Run Code Online (Sandbox Code Playgroud)
我是否做错了什么,或者这就是轮询的工作时间?
另外,这样有效率吗?这会随着网站流量而扩展吗?
谢谢您的帮助!
(function poll(){
setTimeout(function(){
$.ajax({ url: "/myapp/messages/messages/checkMessages", success: function(data){
console.log("Polling!");
}, complete: poll, timeout: 30000});
}, 30000);
})();
Run Code Online (Sandbox Code Playgroud) 我想在 java web 应用程序中实现长轮询。基本上,当用户登录时,我希望他能够连接到通知服务。我想在新通知发生时从服务器向他推送新通知,并且我希望他实时查看这些通知。(如此短的轮询或定期检查来自客户端的服务器还不够好)。
我怎样才能做到这一点?本质上,我想要一种从服务器推送字符串消息的方法,并让客户端立即接收它。
我听说一些参考资料说这可以使用来自服务器的“http 块传输”标头来完成。但是如何在客户端上设置呢?
我不能调试这个消息,就像一个星期前一样.
我尝试恢复到旧文件,但这很奇怪,没有解决我的问题.
所以:我有两个长轮询请求.(关闭其中一个没有帮助).
例如,这是其中之一:
public function update_private_messages_ajax_handler(){
global $wpdb;
global $bp;
$chat_table = $wpdb->prefix . 'bp_dollars_chat';
$current_user = $bp->loggedin_user->id;
ob_start();
header("Content-Type: application/json");
header("Cache-Control: no-cache, must-revalidate");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
$startTime = time();
while((time()-$startTime)<=20) {
$messages = $wpdb->get_results(
$wpdb->prepare("(SELECT *
FROM $chat_table
WHERE to_user = %d
AND recd = 1
AND id > %d
ORDER BY id DESC) ORDER BY id ASC
", $current_user, $_POST['last_id'])
);
if($messages) {
foreach($messages as $v){
//$v->timestring = date_i18n($this->date_format.' - '.$this->time_format, $v->unix_timestamp+$this->gmt_offset);
$v->name …Run Code Online (Sandbox Code Playgroud) 在共享主机服务器发送事件(SSE)或长轮询上实现实时通知的最佳方法是什么?
我看了一个视频说SSE不适合共享主机,Apache服务器并不适合PHP和MySql.
我只是想知道哪种技术更适合长轮询或SSE在共享服务器上进行实时通知,我在godaddy.com上有我的服务器
请提供解释推荐技术的良好链接.
我正在尝试在我的Http服务中构建一个无限轮询,因为我正在建立一个dashborad之王来调查来自服务器的数据,这里是我的代码几乎正在工作(在我的控制台中,我看到Json正在进行,但它没有'反思我的看法...我想注入我的用户:可观察
const usersURL = 'http://my.super.servor.php'
@Injectable()
export class UserService {
users: Observable<User[]>
constructor (public http:Http) {
this.users = http.get(usersURL)
genre mobile ou autre
.map(res => [res.json()]);
let i = this.users.subscribe(
usersURL => console.log(usersURL),
() => {}, // Here we catch up errors
() => console.log("completed!") // Here we catch up if its completed
)
// Here's where I'm trying to do the polling every 5 secondes
let tick$ = Observable.interval(5000);
let response$ =
tick$
.flatMap(() => http.get(usersURL))
.map(res => [res.json()]); …Run Code Online (Sandbox Code Playgroud) 我正在尝试制作旧时尚应用程序的 Angular 2 版本。有一项服务会向服务器发送重复请求以检查用户是否正在登录。登录守卫将检查轮询以查看登录会话结果(从请求中获取)是否有效,以便向路由返回正确的信号。
这是我的服务功能:
getUser(): Observable<User> {
return this.http.get<User>(this.userUrl);
}
这是我的守卫的 canActive 函数:
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
// const isLoggedIn = this.authService.isLoggedIn();
return this.authService.getUser().flatMap((data) => {
console.log(data);
if (data.id === 1 && data.name === 'Beany' ) {
console.log(1111)
return Observable.of(true);
} else {
console.log(2222)
this.router.navigate(['pages/login']);
return Observable.of(false);
}
});
该路线有效,但只有 1 次。不确定是否可以重复此操作(当请求完成时,服务将重新向服务发送检查,当然我应该为此设置一点超时)?
我正在进行一项测试,检查与 Websockets 相比,HTTP 长轮询对 iPhone 电池性能的影响程度。基本上我拥有的是一个带有 Express 服务器的 Node.js,它每隔 0.5 或 10 秒向 iPhone 发送一个随机字符串。我检查了 Chrome 中的消息,可以看到存在 keep-alive 标头。我知道 keep-alive 是自 HTTP/1.1 以来的默认功能。据我了解,TCP 连接将保持打开状态并可用于管道传输,当我每 0.5 秒从服务器发送 ping 时,情况肯定如此。但是当我每10秒发送一次时,连接会在这段时间关闭吗?
我如何知道连接打开了多长时间?这似乎是进行测试时要记住的关键部分。
当 TCP 连接打开时,HTTP 握手是否仍会进行?
我有一个长时间运行的控制台应用程序,使用 while(true)... 结构 它是通过使用 Net Core 实现的 我应该创建什么类型的 Azure 应用服务来托管该应用程序?
我创建了一个 Amazon SNS 主题。我有一个订阅该主题的 Amazon SQS 队列。
我创建了一个默认的 SQS 队列(不是 FIFO 队列)。
我正在使用sqs-consumerAPI 来长轮询队列SQS。
const app = Consumer.create({
queueUrl: 'https://sqs.us-east-2.amazonaws.com/xxxxxxxxxxxx/xxxxxxxxxxx',
handleMessage: async (message) => {
console.log(message);
},
sqs: sqs//new AWS.SQS({apiVersion: '2012-11-05'})
});
app.on('error', (err) => {
console.error(err.message);
});
app.on('processing_error', (err) => {
console.error(err.message);
});
app.on('timeout_error', (err) => {
console.error(err.message);
});
app.start();
Run Code Online (Sandbox Code Playgroud)
当我js通过执行以下操作从单个终端运行这段文件时node sqs_client.js,一切都工作得很好,消息也按正确的顺序发送。
但是,如果打开另一个终端窗口并运行node sqs_client.js,则传入消息的顺序变得非常随机。较新的消息可能以任何顺序进入第一终端窗口或第二终端窗口。
为什么会这样呢?有什么方法可以防止这种情况,以便我可以同时在两个终端窗口中收到相同的消息。
message-queue amazon-sqs amazon-web-services long-polling amazon-sns
我用短轮询(AJAX Refresh)创建了一个简单的PHP jQuery Chat应用程序.比如,每2到3秒就要求新消息.但是,我读到Long Polling是一种更好的聊天应用程序方法.所以,我经历了一些Long Polling脚本.我是这样做的:
$("#submit").click(function(){
$.ajax({
url: 'chat-handler.php',
dataType: 'json',
data: {action : 'read', message : 'message'}
});
});
var getNewMessage = function() {
$.ajax({
url: 'chat-handler.php',
dataType: 'json',
data: {action : 'read', message : 'message'},
function(data){
alert(data);
}
});
getNewMessage();
}
$(document).ready(getNewMessage);
Run Code Online (Sandbox Code Playgroud)
<?php
$time = time();
while ((time() - $time) < 25) {
$data = $db->getNewMessage ();
if (!empty ($data)) {
echo json_encode ($data);
break;
}
usleep(1000000); // 1 Second
}
?>
Run Code Online (Sandbox Code Playgroud)
问题是,一旦getNewMessage()启动,它将执行,除非它得到一些响应(来自chat-handler.php).它以递归方式执行.但是如果有人想在其间发送消息,那么实际上该函数 …
long-polling ×10
ajax ×3
php ×3
angular ×2
comet ×2
javascript ×2
jquery ×2
.net-core ×1
amazon-sns ×1
amazon-sqs ×1
angular-http ×1
azure ×1
http ×1
java ×1
keep-alive ×1
mysql ×1
rxjs5 ×1
service ×1
struts2 ×1