Hệ thống chat thời gian thực với XMPP, ejabberd, ruby + xmpp4r, Android + Smack (Phần 1)

Phiên bản nháp, chưa hoàn thiện, loạt bài viết đang được viết…

Trong loạt bài viết này, chúng ta sẽ tìm hiểu về cách xây dựng một hệ thống chat thời gian thực. Hệ thống sẽ bao gồm:
Chat server: ejabberd – server chat mã nguồn mở hỗ trợ chat theo XMPP
Service hỗ trợ: Viết bằng ruby on rails sử dụng xmpp4r gem
CLient: Android với thư viện Smack
Ở phần đầu tiên này, chúng ta sẽ tìm hiểu về XMPP.
Loạt bài viết sẽ gồm 4 phần:
1. Giới thiệu XMPP
2. [Tích hợp xmpp4r gem vào ruby on rails] 3. [Cài đặt ejabberd chat server] 4. [Client với Android và thư viện Smack]

XMPP là gì?

eXtensible Messaging and Presence Protocol (XMPP hay còn gọi là Jabber) là một giao thức truyền tải thông điệp, tin nhắn (message). Các thông điệp được trao đổi dưới định dạng XML.

Phân tán

Tư tưởng khởi thuỷ của XMPP là các thông điệp có thể được trao đổi liên server. Bạn có thể gửi tin nhắn đến foo.com từ server jabber.de
Khi mình tạo một tài khoản ở jabber.de(một trong rất nhiều jabber public servers) mình sẽ có một JID (Jabber identifier) dạng: binh@jabber.de/home

JID

Ở trên, ta có một JID: binh@jabber.de/home trong đó:
binh: định danh của một NODE, hay nói cách khác, đây là id của một tài khoản Jabber, tưởng tượng trong thế giới thực, binh chính là tên một người.
jabber.de: địa chỉ server của binh, tức là muốn gửi thông điệp cho binh bạn cần chỉ định địa chỉ server là jabber.de, trong thế giới thực, jabber.de là nước mà binh ở.
home: định danh của một RESOURCE, là nơi có thể gặp được NODE. Lưu ý rằng một NODE có thể có nhiều RESOURCE, trong ví dụ này, bạn có thể gửi thông điệp cho binhhome hoặc work với JID lần lượt: binh@jabber.de/homebinh@jabber.de/work

XML messages : Stream và Stanza

Stream

Như đã nói, jabber messages được đóng gói dưới dạng XML. Stream là một luồng để truyền tải những XML messages này giữa clientserver. Stream bắt đầu với thẻ <stream> và kết thúc bằng </stream>.
Clientserver có thể giao tiếp với nhau bằng nhiều XML messages khác nhau, những XML messages được gọi là Stanza. Việc giao tiếp (hay phiên giao dịch) sẽ kết thúc khi một trong hai gửi thẻ .
Một điểm quan trọng cần lưu ý là stream KHÔNG hề tồn tại giữa các user. Nó tồn tại giữa clientserver.

Stanza

Ba kiểu stanza phổ biến:
1. Message
2. Presence
3. IQ

Message

Một message stanza được sử dụng khi USER A (usera@foo.com) đến USER B (userb@bar.org) với thông điệp: “Hello, guy”. stanzas sẽ có dạng:

Cùng xem qua một chút về cơ chế trao đổi message giữa hai user USER AUSER B:
– Đầu tiên, USER A gửi message tới SERVER của anh ấy (trong ví dụ này là foo.com)
– Server foo.com sẽ đọc gói tin và chuyển message đến địa chỉ đích: SERVER của USER B (bar.org).
– Server của USER B sẽ đọc gói tin và gửi nó đến người nhận – USER B.

Tất cả đều là thời gian thực. Ở đây, ta giả định rằng mọi kết nối cần thiết giữa server-client đều đã được thiết lập.

Presence

Một Presence stanza được dùng khi gửi trạng thái (status) của một user (Idle, Offline, Available, Do not disturb…)

I/Q – Info / Query

IQ stanza cũng là một loại message phổ biến khác. Nó được dùng để gửi những thông điệp mà MessagePresence không đáp ứng được.
Ví dụ:
USER A muốn xem thông tin hồ sơ của USER B. Lúc này, USER A sẽ gửi một IQ stanza đến USER B.
USER B nhận được IQ sẽ trả lời bằng cách tạo một IQ khác chứa những thông tinUSER A muốn biết (nếu USER B không muốn trả lời thì thôi, khỏi tạo :P).

Phù, hết phần 1, phần tiếp theo, chúng ta sẽ cùng tìm hiểu về cách tích hợp xmpp4r gem vào ruby on rails

Lập trình và hơn thế nữa

Spread the love
  • 10
  •  
  •  
  •  
  •  
    10
    Shares

Leave a Reply

1 Comment on "Hệ thống chat thời gian thực với XMPP, ejabberd, ruby + xmpp4r, Android + Smack (Phần 1)"

avatar
  Subscribe  
newest oldest most voted
Notify of
alibaba
Guest

cám ơn bạn bài viết rất hay và chi tiết lắm tôi rất thích.