Như vậy, mọi người dùng trong hệ thống sẽ được coi là các client, trong hệ thống sẽ tồn tại một máy chủ để tiến hành lưu các thông điệp gửi đi và tải các thông điệp về máy điện thoại di
Trang 1Trường Đại học Công nghệ - Đại học Quốc gia Hà Nội
BÁO CÁO BÀI TẬP LỚN
XÂY DỰNG CHƯƠNG TRÌNH CHAT TRÊN ĐIỆN THOẠI DI ĐỘNG
Người thực hiện: Đoàn Ngọc Phương
Nguyễn Thị Thu Hằng Lớp cao học CNTT K17
Trang 2Lời nói đầu
Hệ thống chat là một hệ thống đa người dùng và thực hiện chức năng truyền thông điệp giữa các người dùng trong hệ thống, với tính chất là thông điệp được gửi từ người dùng A đến người dùng B (đang online – hay đang sử dụng hệ thống) phải được thực hiện ngay với thời gian trễ rất nhỏ, đủ để thể hiện một cuộc trò chuyện thông thường
Với đặc điểm như vậy hệ thống chat cũng có điểm tương đồng với hệ thống mail,
đó là khả năng truyền thông điệp: nếu người nhận không online – hay đang không sử dụng
hệ thống thì hệ thống chat cũng giống như hệ thống mail, các thông điệp chỉ được tải về máy người nhận khi người nhận đăng nhập và tiến hành xem thông điệp Nhưng nếu người nhận online, thì thông điệp trong chương trình chat phải được tải về ngay và hiển thị trên cửa sổ chat của người nhận Như vậy có thể nói điểm khác biệt chủ yếu của hai hệ thống là thời gian truyền thông điệp
Qua phân tích, và dựa trên những công cụ hiện có là J2ME để lập trình trên điện thoại di động, một ngôn ngữ lập trình luôn hỗ trợ giao thức http trên mọi dòng máy, nhóm
em đã quyết định xây dựng hệ thống chat trên điện thoại di động trên mô hình client – server Như vậy, mọi người dùng trong hệ thống sẽ được coi là các client, trong hệ thống
sẽ tồn tại một máy chủ để tiến hành lưu các thông điệp gửi đi và tải các thông điệp về máy điện thoại di động của người nhận khi người nhận, hay máy client có yêu cầu nhận thông điệp
Việc nhận thông điệp trong mắt người sử dụng là một quá trình tự nhiên, không phải qua khâu kết nối hay yêu cầu (request) tới máy chủ, cho nên việc làm này phải được chương trình tiến hành tự động, và cứ sau một khoảng thời gian trễ đủ nhỏ (cỡ giây), hành động này lại được tiến hành lại để nhằm mục đích cập nhập thông điệp, khiến cho thông điệp như được gửi ngay và trực tiếp đến người dùng
Dựa trên những ý tưởng như vậy, nhóm em đã tiến hành xây dựng một hệ thống chat trên điện thoại di động với nhiệm vụ chính là truyền thông điệp dạng văn bản không dấu, bỏ qua các chức năng truyền file đính kèm, biểu tượng,…
Với hạn chế và chuyên môn và thời gian nên chương trình còn nhiều sai sót, kính mong sự góp ý của cô giáo cùng các anh chị học viên
Báo cáo bao gồm các nội dung sau:
- Phân tích thiết kế hệ thống
- Giới thiệu về chương trình và các công cụ dùng để xây dựng chương trình
Trang 3Mục lục
Lời nói đầu 0
Mục lục 2
PHÂN TÍCH, THIẾT KẾ 3
1 Phân tích và thiết kế tổng quát 3
1.2 Lựa chọn kiểu kết nối 3
1.3 Kiểu dữ liệu phía server 3
1.4 Kiểu dữ liệu phía client 4
2 Phân tích và thiết kế chi tiết 5
2.1 Các chức năng cần xây dựng của chương trình, biểu đồ user case 5
2.2 Biểu đồ trình tự của một số chức năng chính 6
2.3 Các servlet phía server 14
2.4 Biểu đồ lớp 15
GIỚI THIỆU VỀ CHƯƠNG TRÌNH VÀ CÁC CÔNG CỤ XÂY DỰNG CHƯƠNG TRÌNH 17 1 Các công cụ xây dựng chương trình 17
2 Giới thiệu chương trình 17
3 Các chức năng của chương trình 18
Trang 4
PHÂN TÍCH, THIẾT KẾ
1 Phân tích và thiết kế tổng quát
1.1 Lựa chọn kiểu kết nối
Hệ thống được xây dựng trên mô hình Client – Server và sử dụng giao thức Http Kết nối Http là kết nối phi trạng thái, khó để quản lý phiên làm việc của từng người dùng, nhất là đối với người dùng sử dụng một chương trình, chứ không phải một trang web trên một thiết bị di động Do đó để luôn cập nhập được các thông điệp và trạng thái nhập/xuất của các thành viên, thì chương trình phía client dùng cách theo định kỳ gửi yêu cầu về phía server để luôn luôn cập nhật được mọi thông tin Chi tiết cụ thể được nêu dưới đây
1.2 Kiểu dữ liệu phía server
Một người dùng khi muốn sử dụng chương trình chat thì cần phải có tài khoản Tài khoản của người dùng trong chương trình chat còn có thêm một giá trị trạng thái để xác định việc người đó đang online hay offline
Một người có thể có rất nhiều bạn bè là các tài khoản khác sử trong hệ thống và cũng có rất nhiều tin nhắn từ những người dùng khác, các tin nhắn này có thể giống hệt nhau cả về người nhận, người gửi, và nội dung thông điệp Ngoài ra một thông điệp của một chương trình chat cũng ngắn, nên có thể lưu thành một trường của cơ sở dữ liệu
Trên cơ sở những phân tích đó, phía server dữ liệu được lưu thành ba bảng:
Hình 1:
Cơ sở dữ liệu
Trang 5Bảng user để lưu thông tin của người dùng hay còn gọi là tài khoản của người dùng, mỗi người dùng sẽ sở hữu riêng một username, password và trạng thái nhập/xuất
Một người dùng có nhiều bạn bè được lưu trong bảng friends Tương tự mỗi người dùng cũng có nhiều thông điệp được gửi tới được lưu trong bảng message
Khi có bất cứ thay đổi gì: thêm danh sách bạn bè, thêm thông điệp mới, thay đổi trạng thái, thì server sẽ thực hiện cập nhập lại cơ sở dữ liệu
Còn khi server phải phản hồi lại yêu cầu của client, kết quả sẽ được gửi về client dưới dạng một chuỗi, trong đó các bản ghi của bảng sẽ được phân biệt bởi dấu “;” Riêng với các thông tin trong từng hàng sẽ được phân tách bởi dấu “:” Danh sách bạn bè sẽ kết thúc bằng chuỗi “offm”, tiếp sau đó là danh sách các thông điệp Client sẽ dựa vào những dấu hiệu này để bóc tách ra những thông tin cần thiết
1.3 Kiểu dữ liệu phía client
Phía client có hai loại thông tin cần xử lý, đó là thông tin gửi đi và thông tin nhận lại được từ phía server
Thông tin gửi đi sẽ là các tham số để yêu cầu server phục vụ Client ở đây sẽ yêu cầu server cho login/logoff, yêu cầu được gửi thông điệp đến một người dùng khác và yêu cầu được cập nhật trạng thái của các người dùng có trong danh sách bạn bè của họ, cũng như các thông điệp đã được gửi đến cho họ.Phần lớn các thông tin này đều được nhập vào các textfield
Thông tin nhận về bao gồm: thông điệp offline-các thông điệp được gửi đến khi người dùng chưa đăng nhập, thông điệp online là các thông điệp mà người dùng trao đổi khi trò chuyện với những người dùng khác Danh sách bạn bè và trạng thái nhập/xuất kèm theo
Vì bộ nhớ tạm thời có hạn và tốc độ xử lý kém, ngoài ra nếu lưu trữ theo dạng mảng thì khó truy xuất, cập nhật Cho nên chương trình dùng các bản ghi RMS của j2me
để lưu lại các thông điệp Dùng các bản ghi thì ta luôn được hỗ trợ sẵn các phương thức sắp xếp, tìm kiếm, thêm xóa, sửa mà không cần mất công cài đặt, lại có thể tiết kiệm vùng nhớ tạm thời
Còn danh sách bạn bè và trạng thái kèm theo thì chương trình dùng hai mảng để lưu lại, và thường xuyên được cập nhập Hai mảng này chỉ là tạm thời để xử lý, nội dung chính được lưu trong một list, một kiểu cửa sổ có dạng danh sách, mỗi một thành viên của danh sách lại có biểu tượng kèm theo thể hiện trạng thái nhập/xuất
Trang 62 Phân tích và thiết kế chi tiết
2.1 Các chức năng cần xây dựng của chương trình, biểu đồ user case
Hệ thống gồm có hai tác nhân chính là người dùng và server
Hình 2:
Biểu đồ user case cho tác nhân người dùng
Những thông tin mà người dùng yêu cầu luôn luôn thay đổi, người dùng đăng nhập hay đăng xuất thì trạng thái của người dùng sẽ thay đổi, nên chức năng show friend list cần cập nhập trạng thái của những tài khoản có mặt trong danh sách…Vì lý do đó mà chương trình cần cung cấp chức năng update để liên tục cập nhập những thông tin cần thiết.login, logout là chức năng đăng nhập và đăng xuất, show friend list là chức năng hiển thị danh sách bạn bè với trạng thái nhập/xuất kèm theo, show offline message là chức năng hiển thị tin nhắn offline, chức năng add new friend để thêm bạn bè vào danh sách friend list, multi talking là chức năng trò chuyện với nhiều người, save in to a file là chức năng ghi lại đoạn hội thoại mà người dùng mong muốn
Trang 7Hình 3:
Biểu đồ user case cho tác nhân server
Mọi việc server thực hiện đều phải tiến hành cập nhập lại cơ sở dữ liệu, vì vậy mọi user case của server đều cần phải sử dụng các chức năng và thuộc tính của user case cập nhập cơ sở dữ liệu
2.2 Biểu đồ trình tự của một số chức năng chính
2.2.1 Chức năng chính-update
Như đã được phân tích ở phần đầu của chương, chương trình chat phải theo định
kỳ gửi yêu cần lên server để cập nhập thông tin Để làm được việc đó chương trình phải
có một tiến trình riêng, tiến trình này làm công việc chính là kết nối với server và nhận thông tin phản hồi về để xử lý Cứ sau một khoảng thời gian định kỳ tiến trình lại quay lại thực hiện công việc như trên Giữa khoảng thời gian của hai lần cập nhật, các tiến trình khác có thể hoạt động để đón bắt và xử lý tương tác của người dùng Những tương tác này cuối cùng cũng chỉ được xử lý để làm thay đổi tham số mà tiến trình chính gửi lên server mà thôi
Chi tiết những trình tự sẽ xảy ra trong hệ thống để phục vụ cho chức năng update được mô tả trong biểu đồ trình tự dưới đây Tiến trình này sẽ được lặp đi lặp lại để cập
Trang 8nhập thông tin cho đến khi người dùng đăng xuất, khi đó chương trình không cần cập nhập bất kỳ thông tin nào nữa:
Hình 4:
Biểu đồ trình tự của user case update
Như vậy lớp chính cần được cài đặt giao tiếp runnable để có thể sử dụng các tiến trình Mọi hoạt động của lớp chính đều nằm trong phương thức run(), phương thức hoạt động của tiến trình, trong phương thức này có một vòng lặp không xác định, vòng lặp chỉ
Trang 9kết thúc khi người dùng có yêu cầu đăng xuất, sau mỗi lần thực hiện kết nối và cập nhập thông tin, lệnh cuối cùng của vòng lặp này là sleep(), lệnh cho tiến trình tạm nghỉ, trong khi đó các tiến trình khác có thể hoạt động
Trong phương thức run() có nhiều đoạn mã khác nhau dành cho những yêu cầu khác nhau của người dùng Việc bắt đầu đoạn mà nào phụ thuộc vào một số biến boolean hay còn gọi là cờ trạng thái Nếu người dùng chọn chức năng nào thì cờ tương ứng với chức năng ấy cũng được bật, và đoạn mã xử lý chức năng đó sẽ được thực thi trong lần hoạt động tiếp theo của tiến trình Khi người dùng nhấn back để thoát khỏi chức năng nào đó, cờ trạng thái tương ứng cũng bị tắt và đoạn mã tương ứng sẽ không được xử lý cho đến khi cờ trạng thái lại được bật lại
Mặt khác do đặc thù của chương trình chat, cần có nhiều cửa sổ để giao lưu với nhiều người, cho nên toàn bộ chương trình sẽ được phân rã thành các cửa sổ, mỗi chức năng người dùng sử dụng sẽ được cung cấp bằng một cửa sổ Do đó lớp chính sẽ có thuộc tính là các cửa sổ này Người dùng yêu cầu chức năng nào thì sẽ cho hiển thị cửa
sổ tương ứng
2.2.2 Chức năng đăng nhập và đăng xuất
Nếu người dùng nhấn nút login được gắn với form, thì một sự kiện sẽ phát sinh,
cờ login sẽ được bật, tham số được xác định và thread mới được tạo ra để bắt đầu phục
vụ người dùng, trong phương thức run của lớp chính, chuỗi url login sẽ được dùng để kết nối với server, nếu thành công, midlet sẽ hiện cửa sổ chính của chương trình, ngược lại nếu tài khoản không hợp lệ, cờ login sẽ bị tắt, chương trình sẽ không thực hiện kết nối, và một thông báo yêu cầu nhập lại sẽ được hiện ra trên form login
Trong đoạn mã thực hiện nhiệm vụ login của lớp chính, kết quả sẽ chia ra làm hai nửa: phần thể hiện danh sách bạn bè được cắt ra dựa vào dấu hiệu “offm” để đưa vào lớp friendList, lớp hiển thị danh sách bạn bè của người dùng, tên và trạng thái của người dùng sẽ được bóc tách ra, một hình ảnh tương ứng sẽ được gắn vào tên để hiển thị trạng thái nhập xuất Phần còn lại được đưa vào lớp offlineMessage-lớp hiển thị tin nhắn offline, lớp này là một form, nó nhận dữ liệu, xử lý và gắn tin nhắn vào cửa sổ của nó, khi có yêu cầu xem tin offline form này sẽ được gọi hiển thị và không cần xử lý gì thêm, trạng thái của người dùng khi đó sẽ được server cập nhật lại thành trạng thái online
Trang 10Hình 5:
Biểu đồ trình tự của user case login
Trang 11Hình 6:
Biểu đồ trình tự của user case logout
2.2.3 Chức năng hiển thị tin nhắn offline
Tin nhắn offline sẽ được hiển thị trong một form riêng, các thành phần của form là các StringItem, nội dung của nó chính là các thông điệp, còn lable của nó là tên của người gửi Những thông tin này được lấy ra từ chuỗi thông tin offline có được từ kết quả kết nối khi đăng nhập Mỗi thông điệp được chích ra nhờ vào kí tự phân cách “;”, phần lable được lấy ra nhờ kí tự “:” Form này còn đưa ra cho người dùng thông tin về số tin nhắn offline được gửi đến, thông tin này là một dòng thông báo được đặt phía trên cùng của cửa sổ, để
có được thông tin này thì chỉ cần dùng một biến đếm, mỗi lần tách ra được một tin nhắn trong chuỗi offline lấy về từ server, biến đếm sẽ tăng lên một đơn vị Do đó nếu không có tin nhắn cửa sổ hiện ra sẽ không phải là một cửa sổ trống, không có thông tin
Trang 12Hình 7:
Biểu đồ trình tự của user case show offline message
Khi người dùng nhấn back cửa sổ này sẽ không được hiển thị nữa để nhường chỗ cho cửa sổ chính Việc xác định có hiển thị hay không cũng dựa vào việc bật tắt cờ trạng thái để thực hiện đoạn mã tương ứng trong hàm run()
2.2.4 Chức năng thêm bạn bè
Tương tự, chức năng này cũng là một form, và tương tự nó cũng có cờ trạng thái như các chức năng khác Chỉ có điều nó có các thuộc tính khác mà thôi Form này gồm một textfield để nhập tên người cần thêm vào danh sách bạn bè, và hai nút nhấn, một để thay đổi tham số, gửi yêu cầu đến server để thêm bạn bè Một để quay lại chương trình chính Nếu chuỗi nhập vào không đúng quy cách là một tên tài khoản, chương trình sẽ
xử lý ngay và không cho phép gửi lên server Sau khi đã thêm thành công thì vấn đề cần
xử lý là update lại danh sách bạn bè, do đó lớp chính phải gọi phương thức update của form chứa danh sách này
Trang 14thông điệp không được gửi đi, làm mất tính an toàn và ổn định của chương trình, do đó phía server cần phải có những xử lý cho vấn đề tranh chấp tài nguyên
Hình 9:
Biểu đồ trình tự của user case multi talking
Trang 15Khi người dùng di chuyển trên danh sách bạn bè và dừng lại ở một người cần nói chuyện, rồi nhấn talk trong menu Một cửa sổ tương ứng sẽ được mở Cửa sổ này là một trong nhiều cửa sổ talk của lớp chính, tên của cửa sổ là tên của người được chọn trên danh mục, form này chứa một textfield để nhập nội dung thông tin cần trao đổi, khi người dùng nhấn gửi thông điệp này sẽ được append ngay vào form và chuỗi url được thay đổi cùng với cờ trạng thái được bật Địa chỉ url đó là địa chỉ trỏ đến trang servlet phục vụ nhu cầu gửi thông điệp từ client lên server Nếu thông điệp là hợp lệ, nội dung thông điệp sẽ được lưu vào bảng message trong CSDL, cho đến khi người được nhận nó đăng nhập và truy xuất nó
Lớp chính của chương trình sở hữu một mảng các cửa sổ này, và một biến đếm, nếu một cửa sổ trò chuyện mới được tạo ra thì biến đếm sẽ tăng lên Còn nếu không chương trình sẽ so sánh giữa tên người được chọn trong danh sách, với tên của các form
đã được tạo ra, kết quả là vị trí của form tương ứng trong mảng, giá trị đó được lưu vào một biến kiểu int, dùng để hiển thị chính xác form trò chuyện mà người dùng cần
Việc dùng form làm cửa sổ trò chuyện rất có lợi, vì khi form chưa bị hủy nó sẽ luôn lưu lại các item đã được append vào đó Do vậy dù chương trình luôn thay đổi form hiển thị, khi quay trở lại nội dung cuộc trò chuyện vẫn không bị mất đi
2.3 Các servlet phía server
Đầu tiên, server cần một lớp chung để xử lý việc kết nối và truy xuất đến cơ sở
dữ liệu Việc cài đặt sẵn lớp này sẽ khiến việc cài đặt các servlet trở nên tường minh Lớp này cũng rất đơn giản, nó cần có chức năng kết nối, cập nhật, sửa đổi, thêm, xóa các bản ghi trong các bảng trong CSDL, ngoài ra cần phải có các chức năng so sánh để phục vụ cho mục đích khẳng định tính đúng đắn của dữ liệu mà client gửi lên server
Các servlet nói chung đều gần giống nhau, đầu tiên là phải có một đối tượng truy xuất CSDL như trên Trong hàm doGet() là hàm xử lý các yêu cầu phía client, lúc nào cũng là những dòng lệnh kiểm tra tính đúng đắn của các tham số truyền lên, sau đó mới thực hiện phục vụ client
Servlet login: nhận yêu cầu đăng nhập từ client Tham số truyền lên là username
và password Nếu so sánh thấy đúng thì tiếp tục thực hiện, còn sai phải thông báo lại client Tiếp đó là kiểm tra xem trạng thái của tài khoản đó, nếu đã login rồi thì không được phép login nữa và trả về thông báo Nếu hoàn toàn thỏa mãn điều kiện thì tiến hành sửa đổi lại trạng thái cho tài khoản đó là “on” thay vì “off” Thông tin phản hồi là danh sách bạn bè của tài khoản này lấy từ bảng friend và các tin nhắn offline lấy từ