Hỏi về JS

Mỗi khi user nhấn gửi msg nó mới phải liên lạc với server, chẳng khác biệt mấy so với dùng IM client bình thường, nói chung là có lẽ ko có khác biệt về tải trên server so với IM client thường.
 
Chẹp, phía mình gõ thì nó liên lạc với server là ok rồi. Nhưng ý anh là ví dụ anh chat với em, em gõ 1 cái gì đó, thì nó sẽ đến anh ngay lập tức, chậm trễ hay không là phụ thuộc đường truyền. Thế là sao ?
Ý anh là tuy viết để chat trên web nhưng nó có tính năng của một IM mình cài trong máy. Dựa vào đâu mà nó làm hay thế ^^
 
Nãy giờ bác nói đến AJAX liên tục. Thực sự thì bác có hiểu AJAX nó là để làm gì ko?? Đã biết là nó dùng AJAX mà còn nói thế được thì thật em chẳng hiểu ra thế nào nữa.
 
Chỉnh sửa lần cuối:
He he thằng ku Hiếu chưa tưởng tượng ra hả em :-?
Ý Việt là cái Google Chat nó giống kiểu chat trong phim Matrix ý, gõ cái gì là bên kia nhìn thấy y hệt như mình đang nhìn thấy trên màn hình lúc mình đang gõ luôn, ko cần nhấn Send, hoặc là sự hiện diện của nút Send là thừa.
 
Đặng Trần Hiếu đã viết:
Nãy giờ bác nói đến AJAX liên tục. Thực sự thì bác có hiểu AJAX nó là để làm gì ko?? Đã biết là nó dùng AJAX mà còn nói thế được thì thật em chẳng hiểu ra thế nào nữa.
Biết nó dùng AJAX là 1 chuyện. Nhưng việc chat trên web mà real time như thế thì server của nó phải thế nào, chứ không thì bốc khói là cái chắc.
Ở trên anh có hỏi về việc gõ 1 kí tự, cái đó đã mệt server rồi, thế mà google chat nó còn cập nhật liên tục như 1 IM client chạy trên máy, không chậm trễ một chút nào. Không tưởng tượng nổi server nó thế nào nên mới hỏi em mà.

Google chat không phải cứ gõ 1 chữ là bên kia thấy luôn, nhưng tại sao nó có thể cập nhật nhanh và liên tục thế được ?

Ví dụ nếu làm webchat bằng PHP, phải đặt số thời gian để web refresh, cập nhật các dòng chat mới. Còn ở Google Chat thì không có vụ đó, bên kia gõ gì là mình nhận được ngay lập tức. Thậm chí nó còn hiển thị dòng thông báo cho thấy bên kia đang gõ, như trong YM ý. Phần mềm như thế thì còn hiểu được, chứ webchat mà như thế thì mới thắc mắc :|
 
He he thằng ku Hiếu chưa tưởng tượng ra hả em
Ý Việt là cái Google Chat nó giống kiểu chat trong phim Matrix ý, gõ cái gì là bên kia nhìn thấy y hệt như mình đang nhìn thấy trên màn hình lúc mình đang gõ luôn, ko cần nhấn Send, hoặc là sự hiện diện của nút Send là thừa.
Chắc chắn là ko phải như thế vì nếu như thế thì có vẻ như Google cực ngu. Đơn giản là vì khi chat (mà gõ nói chung) chẳng ai gõ chính xác mọi lúc mọi nơi cả, chắc chắn sẽ có lỗi & khi đó người ta sẽ phải dùng backspace hoặc del để sửa (hoặc tệ hơn là bôi đen và trực tiếp gõ đè lên) ---> thế thì nó sẽ hiển thị thế nào?? 1244<left><backspace>3 à??
Biết nó dùng AJAX là 1 chuyện. Nhưng việc chat trên web mà real time như thế thì server của nó phải thế nào, chứ không thì bốc khói là cái chắc.
Ở trên anh có hỏi về việc gõ 1 kí tự, cái đó đã mệt server rồi, thế mà google chat nó còn cập nhật liên tục như 1 IM client chạy trên máy, không chậm trễ một chút nào. Không tưởng tượng nổi server nó thế nào nên mới hỏi em mà.
Thế bác nghĩ IM client bình thường nó làm thế nào?? Khi user nhấn send, sẽ connect đến server và gửi msg. Còn trong trường hợp sử dụng AJAX với PHP chẳng hạn, khi người dùng nhấn send, nó sẽ gửi đến PHP script.

Khi nhận msg, dĩ nhiên là nó sẽ phải refresh theo 1 interval nhất định, tuy nhiên vì dùng AJAX nên nó sẽ ko phải refresh cả trang mà chỉ lấy 1 vài chữ được gửi đi từ người gửi. Cũng giống như socket programming bình thường, dùng C/C++ trên Linux sẽ có hàm select() (<sys/types.h> & <sys/time.h>), cái hàm này thực ra cũng chỉ là poll định kỳ xem có dữ liệu ko, nếu ko dùng hàm này thì cũng có thể poll định kỳ bằng tay được (mặc dù rắc rối hơn nhiều nhưng ko phải là ko thể), suy cho cùng, cũng chẳng khác refresh định kỳ là bao.
 
Anh không nói tí nào về việc mình send msg đi cơ mà ?? (ở trên anh không nói một chút nào đến vụ mình send msg, anh nói người bên kia gõ cơ mà)
Ví dụ anh để online trong gmail, không chat với ai, thì một lúc sau nó sẽ nhảy qua status "idle", mình chỉ cần di chuột vào bất cứ chỗ nào trong phạm vi cửa sổ gmail thì nó sẽ trở lại "available". Nếu có người gọi thì cửa sổ xuất hiện ngay lập tức, họ gõ gì mình cũng nhận được ngay lập tức (gõ + enter ý nhé), bất kể gõ nhanh hay chậm. Thông thường thì phần chat nó phải refresh mới nhận được msg của bên kia gửi, nhưng trong gmail thì không chờ một chút nào cả, thế tức là refresh interval của nó rất nhỏ ?

Câu hỏi nhỏ xíu, mà chỉ vì mọi người ko dùng gmail chat nên cứ phải diễn giải mệt quá +_+
 
Chỉnh sửa lần cuối:
Ví dụ anh để online trong gmail, không chat với ai, thì một lúc sau nó sẽ nhảy qua status "idle", mình chỉ cần di chuột vào bất cứ chỗ nào trong phạm vi cửa sổ gmail thì nó sẽ trở lại "available". Nếu có người gọi thì cửa sổ xuất hiện ngay lập tức, họ gõ gì mình cũng nhận được ngay lập tức (gõ + enter ý nhé), bất kể gõ nhanh hay chậm. Thông thường thì phần chat nó phải refresh mới nhận được msg của bên kia gửi, nhưng trong gmail thì không chờ một chút nào cả, thế tức là refresh interval của nó rất nhỏ ?
IM client bt như kiểu YIM cũng phải refresh mà như đã nói ở trên là qua select(). Cái khác biệt chỉ là trước khi có AJAX thì nó phải refresh cả trang, còn khi dùng AJAX thì chỉ việc poll & nhận đúng cái đoạn được gửi đi (vài bytes kèm cả header & footer).
 
Đỗ Việt đã viết:
Anh không nói tí nào về việc mình send msg đi cơ mà ?? (ở trên anh không nói một chút nào đến vụ mình send msg, anh nói người bên kia gõ cơ mà)
Ví dụ anh để online trong gmail, không chat với ai, thì một lúc sau nó sẽ nhảy qua status "idle", mình chỉ cần di chuột vào bất cứ chỗ nào trong phạm vi cửa sổ gmail thì nó sẽ trở lại "available". Nếu có người gọi thì cửa sổ xuất hiện ngay lập tức, họ gõ gì mình cũng nhận được ngay lập tức (gõ + enter ý nhé), bất kể gõ nhanh hay chậm. Thông thường thì phần chat nó phải refresh mới nhận được msg của bên kia gửi, nhưng trong gmail thì không chờ một chút nào cả, thế tức là refresh interval của nó rất nhỏ ?

Câu hỏi nhỏ xíu, mà chỉ vì mọi người ko dùng gmail chat nên cứ phải diễn giải mệt quá +_+
Không phải refresh interval quá nhỏ, mà là client chỉ cần gửi đi 1 msg nhỏ tới server và nhận reply cũng nhỏ từ server, chẳng hạn chỉ là đoạn text thay thế cho 1 DIV. Web browser nhận đoạn text này thì thay thế vào trong đoạn DIV dùng cho chitchat của Việt, có vài byte thì phải nhanh rồi :)

Yeah, như chú Hiếu đã nói đấy.
 
Chỉnh sửa lần cuối:
Anh Duy nói "client" ở đây là mình hay người ta ạ ? tất nhiên em biết là mình chỉ nhận lại 1 msg nhỏ khi mình gửi msg tới server rồi, nhưng mà... khổ nhỉ, sao mọi người cứ nói tới việc mình gửi msg thế ? khi em đang mặc kệ cái gmail, quay đi trang khác chẳng hạn, thì em gửi gì tới server đâu mà bảo là nó reply cho em ạ ?
 
Đỗ Việt đã viết:
Anh Duy nói "client" ở đây là mình hay người ta ạ ? tất nhiên em biết là mình chỉ nhận lại 1 msg nhỏ khi mình gửi msg tới server rồi, nhưng mà... khổ nhỉ, sao mọi người cứ nói tới việc mình gửi msg thế ? khi em đang mặc kệ cái gmail, quay đi trang khác chẳng hạn, thì em gửi gì tới server đâu mà bảo là nó reply cho em ạ ?
Client tức là mình, đúng hơn là cái web browser của Việt :) Khi nó đã load xong AJAX code, thì nó đã trở thành 1 application dùng DOM object, biết communicate với webserver bằng XML. Vì nó đã là 1 application cho nên nó tự biết sau 15 min nếu không có msg gì từ phía server cả thì nó phải gửi 1 msg cho server nói là set idle. Thực tế lúc này nó cũng chả khác gì 1 IM client.
 
Vâng, việc nhảy sang chế độ idle và trở lại available thì không có gì đáng thắc mắc thêm, vì hoạt động hay không là do mình. Nhưng em vẫn còn thắc mắc tại sao server chuyển msg đến mình ngay khi người ta gửi msg cho mình như thế được ý ạ :-? em nhắc lại là mình không đụng gì vào web cả, mà là bên kia gửi msg cho mình thôi, bên kia vừa enter một cái là mình nhận được liền, thông thường với webchat thì việc ấy tương đương với việc web được refresh không ngừng nghỉ, mà theo em nghĩ thì làm thế có mà server bốc khói :|
Em hỏi cái này để tìm cách làm webchat cho hiệu quả mà vẫn dựa trên nền một server bình thường, chứ nếu chỉ vì Google có hàng trăm nghìn servers mà làm được cái đó thì bó tay.
 
nó ko refresh cả trang, chỉ refresh vài byte trong ô chat thôi
 
Bất kể nó lấy dữ liệu gì, vài bytes hay vài Kbytes, cứ refresh tức là request lại cái file PHP hay cái gì đó tương tự, server gì mà request liên tục không ngừng không nghỉ thế cũng không bốc khói ạ +_+

Lạ nhỉ, từ lúc em hỏi cái này tới giờ, có 2 thứ em không hề nói nhưng mọi người cứ nói đi nói lại:
- Refresh cả trang: em có bảo refresh hết cả trang đâu, đã dùng AJAX thì còn refresh cả trang làm gì nữa :-?
- Gửi msg tới server thì nó reply lại kèm theo dòng chat mới: không có, em không gõ gì để gửi tới server hết.
 
- Gửi msg tới server thì nó reply lại kèm theo dòng chat mới: không có, em không gõ gì để gửi tới server hết.
Ko ai nói là phải reply thì mới nhận được msg mới cả. Cái chuyện poll PHP script liên tục ko có gì là quá nặng với server của google cả. Nhất là ở cái chỗ toàn expert về optimization như Google. Nó sẽ chỉ poll xem có msg mới ko, nếu có msg mới thì mới xử lý để lấy, cái này chẳng qua là nó thêm tính năng cho keep-alive messages thôi. Nhiều protocol cũng gửi keep-alive mỗi giây (ví dụ như BGP).
 
Đấy, thế có nghĩa là cần 1 server rất mạnh mới làm được thế đúng không ? chứ host thường bây giờ chắc không đủ khả năng ?
Khi làm như thế thì có cái gì là nguy hại nhất cho server hả em ?
 
Ko cần thiết phải có server mạnh, cần server mạnh đến mức nào tỉ lệ thuận với số lượng người dùng. Nếu chỉ có khoảng 10 người dùng thì host nào cũng được, 1000 người dùng có khi vẫn ổn. Đến mức như Google thì lại là chuyện khác, nhưng cái này đúng với tất cả network applications.
 
Đang lượn lung tung ngó về AJAX, thấy có cái này hay hay, hỏi Hiếu cái :D

Người ta dùng JS DOM để bắt chước AJAX (đúng hơn là request để nhận được kết quả như cách của AJAX):

1. File page1.php

Mã:
<?php

$html = '<b>This content came from our Ajax Engine</b>';

?>

div = document.getElementById('contentdiv');
div.innerHTML = '<?php echo $html; ?>';

2. Hàm JS (cho vào engine.js):

Mã:
url = document.location.href;
xend = url.lastIndexOf("/") + 1;
var base_url = url.substring(0, xend);

function ajax_do (url) {
        // Does URL begin with http?
        if (url.substring(0, 4) != 'http') {
                url = base_url + url;
        }

        // Create new JS element
        var jsel = document.createElement('SCRIPT');
        jsel.type = 'text/javascript';
        jsel.src = url;

        // Append JS element (therefore executing the 'AJAX' call)
        document.body.appendChild (jsel);
}

3. Phần HTML để thực hiện:

Mã:
<html>
        <head>
                <title>Demo 1 - The Basic's</title>

                <script type="text/javascript" src="engine.js"></script>       
        </head>

        <body>
                <div id="contentdiv">

                </div>

                <input type="button" onclick="ajax_do ('page1.php');" value="Get content" />
        </body>
</html>

Kết quả ngon lành như AJAX: http://www.phpit.net/demo/php and ajax remix/page1.html

Không biết làm thế này có gì lợi/hại hơn AJAX thực thụ nhỉ? ^^

Nhưng nhìn chung là nó hay (ngắn gọn, chạy ngon) :D
 
Nếu chỉ muốn mấy tính năng cơ bản thì 2 cái chẳng khác gì nhau cả. Chỉ có điều, cái này chỉ có thể request = GET. Nếu muốn dùng 1 method khác, ví dụ như POST để gửi dữ liệu từ form thì phải dùng AJAX. Cái này có ưu điểm là đơn giản & kể cả trên browser ko hỗ trợ AJAX cũng hoạt động (tất nhiên là nếu browser vẫn hỗ trợ JS) - cái này chẳng quan trọng mấy vì tất cả các engine lớn hiện nay đều hỗ trợ AJAX (IE, Mozilla, Opera & KHTML).

Đoạn code trên có thể làm cho nó chạy nhanh hơn đáng kể = cách bỏ đi 2 đoạn:
Mã:
url = document.location.href;
xend = url.lastIndexOf("/") + 1;
var base_url = url.substring(0, xend);
Mã:
// Does URL begin with http?
        if (url.substring(0, 4) != 'http') {
                url = base_url + url;
        }
Trong phần onclick= sử dụng đường dẫn relative nếu như page1.php nằm trên cùng server (nếu như page1.php nằm cùng thư mục thì dòng đó ko có gì thay đổi).
 
Ừ nhỉ, AJAX hơn hẳn ở chỗ có thể dùng method post :D
Chỗ nên bỏ bớt anh cũng hiểu rồi, cảm ơn em :x
 
Back
Bên trên