آیا ممکن است از جاوااسکریپت یک سرور را پینگ کرد؟
من یک برنامه وب میسازم که نیاز دارد بررسی کنم آیا سرورهای راه دور آنلاین هستند یا خیر. وقتی آن را از خط فرمان اجرا میکنم، زمان بارگذاری صفحه من تا ۶۰ ثانیه کامل بالا میرود (برای ۸ ورودی، با تعداد بیشتر به صورت خطی افزایش خواهد یافت).
من تصمیم گرفتم مسیر ارسال پینگ به سمت کاربر را انتخاب کنم. به این صورت، میتوانم صفحه را بارگذاری کنم و فقط آنها منتظر داده «سرور آنلاین است» باشند در حالی که محتوای من را مرور میکنند.
اگر کسی جواب سؤال بالا را دارد، یا اگر راهحلی برای سریع بارگذاری شدن صفحه من میداند، قطعاً قدردان آن خواهم بود.
پاسخ شماره ۱
من کسی را پیدا کردهام که این کار را با استفاده بسیار هوشمندانه از شیء بومی Image انجام میدهد.
از منبع خود، این عملکرد اصلی است (به بخشهای دیگر منبع وابسته است اما شما منظور را میفهمید).
function Pinger_ping(ip, callback) {
if(!this.inUse) {
this.inUse = true;
this.callback = callback
this.ip = ip;
var _that = this;
this.img = new Image();
this.img.onload = function() {_that.good();};
this.img.onerror = function() {_that.good();};
this.start = new Date().getTime();
this.img.src = "http://" + ip;
this.timer = setTimeout(function() { _that.bad();}, 1500);
}
}
این روی تمام انواع سرورهایی که من آزمایش کردهام کار میکند (سرورهای وب، سرورهای FTP و سرورهای بازی). همچنین با پورتها کار میکند. اگر کسی با مورد استفادهای مواجه شد که جواب نداد، لطفاً در کامنتها منتشر کند و من پاسخ خود را بهروزرسانی میکنم.
بهروزرسانی: لینک قبلی حذف شده است. اگر کسی مورد فوق را پیدا کرد یا اجرا کرد، لطفاً نظر بدهد و من آن را به پاسخ اضافه میکنم.
بهروزرسانی ۲: @trante مهربان بود و jsFiddle را فراهم کرد.
http://jsfiddle.net/GSSCD/203/
بهروزرسانی 3: @Jonathon یک مخزن گیتهاب با پیادهسازی ایجاد کرد.
https://github.com/jdfreder/pingjs
بهروزرسانی ۴: به نظر میرسد این پیادهسازی دیگر قابل اعتماد نیست. همچنین گزارش شده است که کروم دیگر از آن پشتیبانی نمیکند و خطای net::ERR_NAME_NOT_RESOLVED را نمایش میدهد. اگر کسی بتواند یک راهحل جایگزین را تأیید کند، من آن را به عنوان پاسخ پذیرفتهشده قرار خواهم داد.
پاسخ شماره ۲
پینگ از ICMP استفاده میکند، اما اگر هر پورت TCP بازی روی سرور راه دور وجود داشته باشد، میتوان آن را به این شکل انجام داد:
function ping(host, port, pong) {
var started = new Date().getTime();
var http = new XMLHttpRequest();
http.open("GET", "http://" + host + ":" + port, /*async*/true);
http.onreadystatechange = function() {
if (http.readyState == 4) {
var ended = new Date().getTime();
var milliseconds = ended - started;
if (pong != null) {
pong(milliseconds);
}
}
};
try {
http.send(null);
} catch(exception) {
// this is expected
}
}
پاسخ شماره ۳
تو میتونی این رو امتحان کنی:
فایل ping.html را با یا بدون محتوا روی سرور قرار دهید، در جاوااسکریپت همانند زیر عمل کنید:
<script>
function ping(){
$.ajax({
url: 'ping.html',
success: function(result){
alert('reply');
},
error: function(result){
alert('timeout/error');
}
});
}
</script>
پاسخ شماره ۴
شما نمیتوانید مستقیماً در جاوااسکریپت «پینگ» کنید. ممکن است چند راه دیگر هم وجود داشته باشد:
- آژاکس
- استفاده از یک اپلت جاوا با isReachable
- نوشتن یک اسکریپت سمت سرور که پینگ میزند و استفاده از AJAX برای ارتباط با اسکریپت سمت سرور شما
- شما همچنین ممکن است بتوانید در فلش (اکشناسکریپت) پینگ کنید
