II.1. Giới thiệu giao thức IRC
Giao thức IRC (Internet Relay Chart) đã đợc thiết kế trong vài năm qua để sử dụng vào việc tổ chức các cuộc hội nghị bằng văn bản. Phần này xin giới thiệu về giao thức IRC.
Giao thức IRC đợc thiết kế trên các hệ thống dùng giao thức mạng TCP/IP, mặc dù đây không phải là môi trờng yêu cầu duy nhất để IRC có thể hoạt động đợc.
Bản thân IRC là một hệ thống hội nghị, (mặc dù nó dùng mô hình client/server) nó là một bộ phần mềm tốt cho phép chạy trên rất nhiều máy trong một mô hình phân tán. Một kiểu cài đặt thông dụng có liên quan đến một quá trình đơn giản (server) tạo một điểm tập trung cho các client (hoặc các server khác) kết nối đến, thực hiện các chức năng
phân phối (delivery)/ghép (multiplexing) các thông điệp (message) gửi
đến server và các chức năng khác.
II.1.1. Các máy chủ (servers)
Server hình thành lên sơng sống (backbone) của hệ thống IRC, cung cấp một điểm để các client có thể kết nối đến và nói chuyện với nhau, và cũng là một điểm để cho các server khác kết nối đến, tạo nên một mạng IRC. Một cấu hình duy nhất cho phép các IRC server là mô hình cây (nh hình 1 dới đây) tại đó mỗi một nút đóng vai trò là một điểm trung tâm cho phần còn lại của mạng nhìn vào.
Đồ án tốt nghiệp Giới thiệu Java và cơ sở dữ liệu trên mạng Máy chủ 5 Máy chủ 2 Máy chủ 3 Máy chủ 4 Máy chủ 1 Máy chủ 6 Máy chủ 8 Máy chủ 9 Máy chủ 7
Hình 1. Cấu trúc mạng các server IRC.
II.1.2. Các máy khách (clients)
Một máy client là bất kỳ một máy nào kết nối đến server mà không phải là một server khác. Mỗi một client đợc phân biệt với các client khác thông qua tên riêng (nickname) có chiều dài tối đa là 9 kí tự. Ngoài tên riêng ra thì tất cả các server phải có các thông tin sau đây về các client: tên thật của máy tính mà tại đó phần mềm client đang chạy, tên ngời sử dụng trên máy đó, và server mà client đó nối đến.
II.1.1.1. Ngời điều hành (operator)
Để cho phép một khối lợng hợp lý các nội quy đợc giữ gìn trong mạng IRC, một loại client đặc biệt (ngời điều hành) đợc cho phép quyền thực hiện một số các chức năng điều hành trên mạng. Mặc dù các quyền đợc trao cho những ngời điều hành đợc coi là rất nguy hiểm nhng nó vẫn rất cần thiết. Những ngời điều hành nên có quyền đợc thực hiện một số tác vụ cơ bản trên mạng chẳng hạn nh huỷ kết nối hoặc kết nối lại các server khi cần thiết để tránh các trờng hợp dùng một tuyến đờng truyền xấu trong một khoảng thời gian dài. Giao thức IRC chỉ trao quyền cho
Đồ án tốt nghiệp Giới thiệu Java và cơ sở dữ liệu trên mạng
ngời điều hành các chức năng sau: SQUIT (lệnh huỷ kết nối một server) và lệnh CONNECT (lệnh kết nối đến một server).
Một khả năng nữa của ngời điều hành là có thể đuổi (trục xuất) bất cứ một ngời sử dụng bình thờng (không phải là ngời điều hành) nào ra khỏi mạng IRC, chẳng hạn nh những ngời sử điều hành có thể đóng kết nối của bất kỳ một client nào đến server.
II.1.3. Các kênh (Channels)
Một kênh là một là tên một nhóm của một hoặc nhiều client và tất cả các client này đều có chung một địa chỉ gửi các thông điệp đến là tên kênh đó. Kênh đợc tạo ra hoàn toàn ẩn khi một ngời vào kênh đó đầu tiên (và kênh đó vẫn cha đợc tạo ra trớc khi ngời này vào) và kênh đó đợc huỷ đi khi ngời cuối cùng ra khỏi kênh đó. Khi kênh đã đợc tồn tại rồi thì bất kỳ một ngời sử dụng nào cũng có thể vào kênh đó (nếu là kênh bình thờng, không phải kênh ở chế độ chỉ mời mới vào đợc) bằng cách chọn tên kênh đó.
Tên của các kênh là các chuỗi các ký tự ( bắt đầu bởi ký tự & hoặc #) có chiều dài tối đa là 200 ký tự. Ngoài yêu cầu các tên kênh phải bắt đầu bằng ký tự & hoặc ký tự # ra thì tên không còn không đợc chứa dấu cách, ký tự điều khiển, hoặc dấu phẩy(,) (vì dấu phẩy đợc giao thức IRC dùng để phân chia giữa các các tham số của lệnh).
Giao thức này hỗ trợ hai loại kênh. Loại kênh thứ nhất là kênh phân tán (distributed channel) kênh này thì tất cả các server kết nối vào mạng đều có thể biết. Loại kênh thứ hai là kênh chỉ mời mới vào đợc điều này nghĩa là chỉ có các client đợc mời mới vào đợc các kênh loại này.
Để ra khỏi một kênh hiện thời thì ngời sử dụng đó yêu cầu phải đã vào kênh đó rồi. Nếu nh ngời sử dụng vào một kênh cha tồn tại thì kênh đợc tạo ra và ngời dùng tạo kênh đó sẽ trở thành ngời điều hành của kênh đó. Nếu ngời sử dụng vào kênh đã tồn tại thì yêu cầu vào kênh của bạn phụ thuộc vào chế độ của kênh đó. Ví dụ, nếu nh kênh đó là kênh chỉ có những ngời đợc mời mới vào đợc (tức là kênh đợc bắt đầu bởi <+i>) thì bạn vào đợc kênh nếu nh bạn đợc mời. Nh là một phần của giao thức IRC, thì một ngời dùng có thể cùng một lúc vào nhiều kênh, nhng số kênh tối đa mà một ngời sử dụng có thể vào đợc một lúc là 10 kênh.
Nếu nh một kênh bị tách rời ra bởi nguyên nhân hai server (đó là hiện tợng khi một server huỷ kết nối đến server khác) tách rời ra thì mỗi
Đồ án tốt nghiệp Giới thiệu Java và cơ sở dữ liệu trên mạng
kênh trên mỗi server sẽ chỉ bao gồm những ngời sử dụng nối vào server đó. Khi hai kênh đợc ghép lại thành một (tức là khi mà hai server nối kết nối với nhau), thì các server mới nối với nhau sẽ thông báo cho nhau biết các thông tin về các kênh trên từng server. Nếu nh trên hai server đó mà có kênh trùng nhau thì các lênh JOIN và MODE đợc hiểu thành chung một kiểu để hai phía đều chấp nhận những ngời sử dụng nào trên kênh và các chế độ của kênh chung đó.
II.1.3.1. Ngời điều hành kênh
Ngời điều hành kênh của một kênh nào đó đợc hiểu nh là ngời chủ của kênh đó. Để nhận ra đợc điều này thì ngời điều hành kênh đợc trao một số quyền để điều khiển và làm cho cuộc trao đổi thông tin kênh đó luôn đợc lành mạnh và ôn hoà (điều này có nghĩa là nếu nh một thành viên của kênh không lịch sự trong khi nói chuyện thì sẽ bị ngời điều hành kênh đuổi ra khỏi kênh để làm cho cuộc trao đổi trong kênh đợc lành mạnh).
Vì một ngời điều hành của một kênh, ngời đó không bị yêu cầu phải đa ra nguyên nhân cho các hành động của ngời đó. Sau đây là các lệnh mà chỉ có ngời điều hành kênh mới đợc dùng:
KICK - Đuổi một ngời sử dụng ra khỏi kênh.
MODE - Đối chế độ của kênh
INVITE - Mời một ngời sử dụng vào một kênh chỉ mời (chế độ +i)
TOPIC - Đổi chủ đề của kênh nếu nh kênh đó là kênh ở chế độ +t.
Ngời điều hành kênh đợc nhận ra bởi ký tự '@' tiếp theo sau tên riêng (nickname) của ngời đó và có liên quan đến một kênh (chẳng hạn nh khi bạn dùng các lệnh sau để xem thông tin về ngời sử dụng trên mạng: NAMES, WHO và WHOIS thì bạn có thể biết đợc thông tin này).
II.2. Các đặc điểm kỹ thuật của IRC
II.2.1. Tổng quan
Nh đã đề cập trên đây, giao thức IRC này đợc dùng cho cả các kết nối giữa các server và giữa các client và các server. Tuy nhiên, cũng có sự hạn chế đối với các kết nối của các client đến các server hơn là các kết nối của server với nhau.
Đồ án tốt nghiệp Giới thiệu Java và cơ sở dữ liệu trên mạng
II.2.2. Các mã ký tự
Không có một tập ký tự đặc biệt đợc xác định trong giao thức IRC. Giao thức IRC dùng một tập mã đợc tạo nên từ 8 bit, tạo thành một con số hệ bát phân. Mỗi một thông điệp (message) có thể đợc tạo nên từ bất kỳ số nào trong số các con số bát phân này; tuy nhiên một số số bát phân đợc dùng làm mã điều khiển, đóng vai trò nh là phần quy định ranh giới của các thông điệp.
Các ký tự {}| đợc coi nh là các ký tự thờng và tơng đơng với các ký tự []\, theo thứ tự đó. Đây là một vấn đề không tốt khi so sánh hai tên riêng (nickname) với nhau.
II.2.3. Các thông điệp IRC (IRC messages)
Các server và các client giử cho nhau các thông điệp, các thông điệp này có thể sẽ tạo ra một thông điệp trả lời hoặc không tạo ra một thông điệp trả lời. Nhn nếu một thông điệp chứa một lệnh hợp lệ thì client gửi thông điệp đó nên chờ một thông điệp trả lời từ server tuy nhiên cũng không nên đợi thông điệp trả lời quá lâu; sự giao tiếp giữa client và server và các server với các client bản chất là không đồng bộ (tức là khi gửi thông điệp đi thì không có nghĩa là ta sẽ nhận đợc ngay thông điệp trả lời vì thông điệp gửi đến server còn phải chờ trong hàng đợi để đến lợt đợc xử lý).
Mỗi một thông điệp IRC có thể chứa đến 3 phần chính: phần tiền tố (prefix) (phần này là tuỳ chọn), phần lệnh và phần các thông số của lệnh đó (phần này có thể lên đến 12 tham số). Các phần tiền tố, lệnh và các tham số đợc cách nhau bởi một hoặc nhiều dấu cách (có mã ASCII là 0x20 - hệ hexa).
Sự có mặt của phần tiền tố đợc chỉ ra bởi dấu hai chấm (':', 0x3b), ký tự dấu hai chấm này phải là một ký tự đầu tiên của một thông điệp. Và không đợc có dấu cách giữa dấu hai chấm này và nội dung của phần tiền tố. Phần tiền tố đợc server dùng để xác định phần nội dung thực sự của message. Nếu nh một thông điệp không có phần tiền tố, thì thông điệp đó đợc hiểu là đợc gửi đi từ một kết nối mà từ đó thông điệp đợc nhận. Các client không nên dùng tiền tố khi các thông điệp đợc gửi đi từ chính các client đó, nếu nh các client dùng một tiền tố thì chỉ duy nhất một tiền tố đúng là tên riêng (nickname) của ngời sử dụng có liên quan đến client đó. Nếu nh nơi gửi không đợc xác định bằng một tiền tố thì hoặc nơi gửi thông điệp đó không cùng một liên kết với nơi nhận thì server phải tự động bỏ qua thông điệp đó.
Đồ án tốt nghiệp Giới thiệu Java và cơ sở dữ liệu trên mạng
Lệnh phải là một lệnh IRC đúng hoặc một con số gồm ba chữ số biểu diễn dới dạng văn bản ASCII.
Các thông điệp của IRC thờng là các dòng văn bản mà kết thúc bởi cặp ký tự xuống dòng và trở về đầu dòng (CR+LF), và các thông
điệp đó không đợc dài hơn 512 ký tự kể cả cặp ký tự kết thúc CR+LF. Do đó, còn 510 ký tự cho chiều dài tối đa của một lệnh và các tham số của nó.
Trên đây là một số đặc điểm kỹ thuật cơ bản của giao thức IRC. Phần tiếp theo xin giới thiệu về công cụ để xây dựng dịch vụ hội nghị từ xa trên Web đó là ngôn ngữ lập trình Java.
II.4. Giới thiệu công cụ thiết kế dịch vụ hội nghị từ xa trên Web
II.4.1. Java hỗ trợ cơ chế đa luồng (Multi-threads)
Với cơ chế đa luồng (multi-threads) đã cho phép các chơng trình viết bằng ngôn ngữ Java có thể làm đợc nhiều việc cùng một lúc. Điều này rất thuật lợi khi thiết kế các chơng trình trên mạng. Nh bạn đã biết là khi sử dụng trên mạng thì kèm theo với thời gian sử dụng nhiều là bạn phải trả nhiều tiền nhiều cho nhà cung cấp dịch vụ. Chính vì vậy việc thiết kế một ứng dụng cho phép có thể làm đợc nhiều việc một lúc là một vấn đề rất quan trọng. Với Java, bạn có thể viết một chơng trình để trong khi chơng trình của bạn nạp các tập tin trên mạng xuống thì bạn có thể nghe nhạc, hay chơng trình có thể vẽ lại màn hình, vân vân...
II.4.1.1. Giới thiệu về các Thread
Một thread là một luồng điều khiển đơn (single flow of control) nằm trong một chơng trình. Đôi khi nó đợc gọi là mạch thực hiện (execution context) bởi lẽ mỗi thread đều phải có các tài nguyên cho chính thread đó (chẳng hạn nh bộ đếm chơng trình và stack thực hiện ch- ơng trình) là ngữ cảnh ("ngữ cảnh" có nghĩa môi trờng và hoàn cảnh xung quanh của một đối tợng nào đó có tác dụng chi phối sự hoạt động của đối tợng đó. Ơ' đây là các tài nguyên của thread) của sự thực hiện. Tuy nhiên, tất cả các thread trong chơng trình vẫn cùng chia sẽ rất nhiều tài nguyên chẳng hạn nh không gian bộ nhớ và các tập tin đã đợc mở. Do đó, một thread cũng có thể đợc gọi là một tiến trình nhẹ (lightwieght
proccess): Nó là một luồng điều khiển đơn cũng giống nh một tiến trình
Đồ án tốt nghiệp Giới thiệu Java và cơ sở dữ liệu trên mạng
nó cũng đơn giản hơn một tiến trình bình thờng vì có ít sự quản lý tài nguyên đối với một thread hơn là đối với một tiến trình bình thờng.
Một chơng trình có thể bỏ ra một phần lớn thời gian thực hiện của mình để chỉ để chờ . Ví dụ, nó chờ để cho một số tài nguyên có thể truy cập đợc với một phép toán vào/ra, hoặc có thể nó chờ để đến thời gian quy định nào đó (time-out) để bắt đầu làm một việc gì đó. Để tăng hiệu xuất của CPU, thì tất cả các nhiệm vụ phải thực hiện với thời gian chờ lớn đều chạy thành các thread riêng biệt. Khi mà một nhiệm vụ nào đó chờ một điều gì đó xảy ra, thì trình Java run time có thể chọn một nhiệm vụ khác để thực hiện nh vậy hiệu xuất của CPU sẽ đợc tăng lên.
II.4.1.2. Thread làm việc ra sao?
Phần này sẽ đề cập đến các thread làm việc ra sao: làm thế nào để tạo và chạy một thread, chu trình của một thread, các nhóm thread và làm sao để lấy đợc các thông tin về các thread và các nhóm thread.
Tạo và chạy một Thread
Khi bạn có một nhiệm vụ mà bạn muốn chạy song song với các nhiệm vụ khác, có hai cách để bạn tạo một Thread mới. Cách thứ nhất là bạn tạo một lớp (class) mới là một lớp con của lớp Thread. Lớp này nên định nghĩa lấy phơng thức (method tạm dịch là "phơng thức") run() để gối lên (override) phơng thức run() của lớp Thread. Phơng thức run() là nơi mà nhiệm vụ của bạn sẽ đợc thực hiện. Cũng nh phơng thức main() là một phơng thức do ngời dùng định nghĩa và đợc gọi trớc tiên khi thực hiện một chơng trình Java để bắt đầu chạy một ứng dụng, phơng thức run() cũng đợc Java run time gọi đầu tiên để bắt đầu chạy một Thread. Ví dụ, lớp con này đợc tạo khi gọi lệnh new, tiếp theo là lời gọi đến ph- ơng thức start() của Thread để có thể thực hiện đợc phơng thức run().
Một cách khác để tạo một Thread mới là khai báo một lớp thực hiện trình giao tiếp Runnable. Trình giao tiếp Runnable chỉ yêu cầu thực hiện một phơng thức đó là phơng thức run(). Trớc tiên, bạn tạo ra một thể nghiệm (instance tạm dịch là "thể nghiệm": thể nghiệm là một khái niệm đồng nghĩa với khái niệm đối tợng khi chạy của hệ thống) của lớp bằng lệnh new, và cuối cùng là gọi đến phơng thức start() của Thread để bắt đầu thực hiện nhiệm vụ đợc định nghĩa trong phơng thức run(). Một lớp các thể nghiệm với phơng thức run() đợc định nghĩa phải đợc truyền vào nh là một tham số trong việc tạo Thread thể nghiệm do đó khi mà phơng thức start() của thread thể nghiệm đợc gọi thì Java run time sẽ biết là sẽ phải thực hiện phơng thức run() nào. Cách tạo thread này rất
Đồ án tốt nghiệp Giới thiệu Java và cơ sở dữ liệu trên mạng
thuận tiện khi mà bạn cần tạo một phơng thức run() cần phải là một lớp con của các lớp khác: lớp này có thể thừa hởng tất cả các phơng thức và các dữ liệu của các lớp mẹ khác và Thread thể nghiệm mới đợc tạo có thể đợc dùng bởi thread điều khiển.
Các phơng thức điều khiển Thread
Có rất nhiều các phơng thức đợc định nghĩa trong lớp Thread để