Yêu cầu bài toán: Xây dựng chương trình Chát theo mô hình Client – Server sử dụng Java Socket Phân tích: Xây dựng chương trình bên Server • Tạo một TCP Socket và gắn vào một cổng • Kết nối Database để lưu trữ dữ liệu người dùng như: username, password • Xây dựng một chương trình Server đa tuyến (Thread Server) để cho phép nhiều Client kết nối đến Server • Luôn luôn chờ và lắng nghe yêu cầu kết nối từ Client • Chấp nhận kết nối và tạo ra các Thread (Socket) tương ứng • Truyền nhận thông tin qua các luồng nhậngửi dữ liệu của socket • Cập nhật trạng thái đăng nhập, đăng xuất của các Client và gửi về các Client • Thiết kế giao diện Server • Xử lý 1 số công việc khác … Xây dựng chương trình bên Client • Tạo một TCP Socket với địa chỉ IP và số cổng mà chương trình Server đang chạy • Thiết lập kết nối và trao đổi với Server: đăng nhập, đăng xuất …; • Gửi, Nhận thông điệp với tất cả mọi người trong phòng chát • Chức năng xem lại lịch sử đã chát • Chức năng upload, Download File • Thiết kế giao diện Client
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC MỎ - ĐỊA CHẤT HÀ NỘI KHOA CÔNG NGHỆ THÔNG TIN Đồ án lập trình mạng Xây dựng ứng dụng Chat Client – Server Giảng Viên Hướng Dẫn: Phan Mạnh Tiến Nhóm: Đỗ Viết Thanh 1121050299 Nguyễn Thị Thanh Huệ 1121050218 Nguyễn Thanh Hương 1121050228 Nguyễn Thế Phong 1121050073 Phạm Văn Thực 1121050103 Lớp: Mạng Máy Tính K56 Hà Nội, Ngày 18 Tháng 5 Năm 2014 Đồ án: ứng dụng chát Client – Server 2 | P a g e Mục Lục I. Tổng quan về đề tài 1. Cơ sở lý thuyết • Giao thức TCP/IP • Mô hình Client/Server • Cơ chế Socket trong Java 2. Phân tích và thiết kế hệ thống 2.1 Phân tích yêu cầu bài toán Yêu cầu bài toán: Xây dựng chương trình Chát theo mô hình Client – Server sử dụng Java Socket Phân tích: Xây dựng chương trình bên Server • Tạo một TCP Socket và gắn vào một cổng • Kết nối Database để lưu trữ dữ liệu người dùng như: username, password • Xây dựng một chương trình Server đa tuyến (Thread Server) để cho phép nhiều Client kết nối đến Server • Luôn luôn chờ và lắng nghe yêu cầu kết nối từ Client • Chấp nhận kết nối và tạo ra các Thread (Socket) tương ứng • Truyền nhận thông tin qua các luồng nhận/gửi dữ liệu của socket • Cập nhật trạng thái đăng nhập, đăng xuất của các Client và gửi về các Client • Thiết kế giao diện Server • Xử lý 1 số công việc khác … Xây dựng chương trình bên Client • Tạo một TCP Socket với địa chỉ IP và số cổng mà chương trình Server đang chạy • Thiết lập kết nối và trao đổi với Server: đăng nhập, đăng xuất …; • Gửi, Nhận thông điệp với tất cả mọi người trong phòng chát • Chức năng xem lại lịch sử đã chát • Chức năng upload, Download File • Thiết kế giao diện Client 2.2 Thiết kế chương trình 2.2.1 Thiết kế giao diện • Giao diện của Server Nhóm 2 – Mạng máy tính K56 Đồ án: ứng dụng chát Client – Server 3 | P a g e Giao diện của Server hết sức đơn giản. Thiết kế cơ bản gồm nút Start. Phần Port, select Database đã được mặc định chọn sẵn trong code. Server cập nhật trạng thái của các Client và in thông tin ngay tại trên Server và đồng thời gửi xuống cho các Client Hình 2.1: Server đang hoạt động • Giao diện bên Client Giao diện bên Client được tách ra làm 2 form: ChatFram (phần chát chính) và HistoryFram (nhật ký chát). Nhóm 2 – Mạng máy tính K56 Đồ án: ứng dụng chát Client – Server 4 | P a g e Hình 2.2 Client đã kết nối đến Server • ChatFram là giao diện tổng hợp của việc kết nối, đăng nhập và Chát. • Host Address và Port của Server mặc định • Phần List Online: để hiển thị các nick đang online • Khung chát chính: tất cả thông báo đến từ Server, chương trình và các tin nhắn từ thành viên khác đều được hiển thị ở đây • Gửi tin nhắn: Có thể chát Room qua List Online chọn thuộc tính All. Và chát riêng khi chọn thành viên muốn chát • Nhật ký: hiển thị lịch sử đã chát qua 1 form mới là HistoryFram • Upload File: cho phép gửi tập tin cho người dùng #. Cấm gửi lên cho tất cả mọi người (tránh tắc nghẽn) Nhóm 2 – Mạng máy tính K56 Đồ án: ứng dụng chát Client – Server 5 | P a g e Hình 2.3 Nhật ký chát 2.2.2 Các lớp xử lý của chương trình • Phía bên Server • Phía bên Client Nhóm 2 – Mạng máy tính K56 Đồ án: ứng dụng chát Client – Server 6 | P a g e II. Hướng dẫn cài đặt và chạy Demo chương trình 1. Hướng dẫn cài đặt Chương trình gồm 2 phần chính là : Client và Server. Muốn chương trình chạy được thì ta phải chạy Server trước để lắng nghe các Client. Sau đó chạy các Client Chạy Server ta Run File ServerFrame là Main Chạy Client ta Run File ChatFramme là Main 2. Chạy Demo Chương trình Thử nghiệm chạy chương trình lần lượt theo các bước kết quả được hiển thị qua các hình Hình 2.1 Kết nối lỗi khi Server chưa chạy Nhóm 2 – Mạng máy tính K56 Đồ án: ứng dụng chát Client – Server 7 | P a g e Hình 2.2 Chạy chương trình Server Hính 2.3 Chạy Client Kết nối và đăng nhập thành công • Sau khi Server đã được bật thì đã kết nối được thành công • Tiến hành kết nối và đăng nhập thêm nhiều Client khác Nhóm 2 – Mạng máy tính K56 Đồ án: ứng dụng chát Client – Server 8 | P a g e Hình 2.4 Chát Room và chat Private • Chát Room thì tại List Online ta chọn All và tiến hành chát với mọi người • Chát Private thì tại List Online ta chọn người muốn chát và tiến hành chát. Như trong hình thì Đỗ Thanh chát private đến Thanh Huệ. Và Thanh Huệ, Văn Thực chát Private cho Đỗ Thanh. Nhóm 2 – Mạng máy tính K56 Đồ án: ứng dụng chát Client – Server 9 | P a g e Hình 2.5 Hiển thị nhật ký chát của Thế Phong Hình 2.6 Thông báo đến các Client khi có Nick đăng xuất Nhóm 2 – Mạng máy tính K56 Đồ án: ứng dụng chát Client – Server 10 | P a g e Hình 2.7 Thông báo trên Server khi có Client thoát, tiến hành giải phóng tài nguyên và tiếp tục chờ đợi các Client Hình 2.8 Server gửi thông báo cho Thế Phong không cho phép gửi tập tin cho tất cả mọi người Nhóm 2 – Mạng máy tính K56 [...]... recipient='"+recipient+"'}"; } } 1.3 ServerFrame class package com.socket; import javax.swing.UIManager; public class ServerFrame extends javax.swing.JFrame { Nhóm 2 – Mạng máy tính K56 Đồ án: ứng dụng chát Client – Server 19 | P a g e public SocketServer server; public Thread serverThread; public String filePath = "src\\com\\data\\Data.xml"; public ServerFrame() { initComponents(); this.setTitle( "Server Chat" ); txtThongBao.setEditable(false);... SocketServer implements Runnable { public ServerThread clients[]; public ServerSocket server = null; public Thread thread = null; public int clientCount = 0, port = 9999; public ServerFrame ui; public Database db; public SocketServer(ServerFrame frame) { clients = new ServerThread[50]; ui = frame; db = new Database(ui.filePath); try { Nhóm 2 – Mạng máy tính K56 25 | P a g e Đồ án: ứng dụng chát Client. .. e Đồ án: ứng dụng chát Client – Server 29 | P a g e if (db.checkLogin(msg.sender, msg.content)) { clients[findClient(ID)].username = msg.sender; clients[findClient(ID)].send(new Message("login", "SERVER" , "TRUE", msg.sender)); ThongBao("newuser", "SERVER" , msg.sender); SendUserList(msg.sender); } else { clients[findClient(ID)].send(new Message("login", "SERVER" , "FALSE", msg.sender)); } } else { clients[findClient(ID)].send(new... i++) { clients[i - 1] = clients[i]; } } clientCount ; try { toTerminate.close(); } catch (IOException ioe) { ui.txtThongBao.append("\nLỗi: " + ioe); } toTerminate.stop(); } } private void addThread(Socket socket) { if (clientCount < clients.length) { ui.txtThongBao.append("\nThêm Client: " + socket); clients[clientCount] = new ServerThread(this, socket); try { clients[clientCount].open(); clients[clientCount].start();... tính K56 Đồ án: ứng dụng chát Client – Server 30 | P a g e { clients[findClient(ID)].send(new Message("test", "SERVER" , "OK", msg.sender)); } else if (msg.type.equals("signup")) { if (findUserThread(msg.sender) == null) { if (!db.userExists(msg.sender)) { db.addUser(msg.sender, msg.content); clients[findClient(ID)].username = msg.sender; clients[findClient(ID)].send(new Message("signup", "SERVER" ,... i = 0; i < clientCount; i++) { clients[i].send(msg); Nhóm 2 – Mạng máy tính K56 Đồ án: ứng dụng chát Client – Server } } public void SendUserList(String toWhom) { for (int i = 0; i < clientCount; i++) { findUserThread(toWhom).send(new Message("newuser", "SERVER" , clients[i].username, toWhom)); } } public ServerThread findUserThread(String usr) { for (int i = 0; i < clientCount; i++) { if (clients[i].username.equals(usr))... – Mạng máy tính K56 Đồ án: ứng dụng chát Client – Server IV Source code 1 Chương trình bên Server 1.1 Database class package com.socket; import java. io.*; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult;... { return clients[i]; } } return null; } @SuppressWarnings("deprecation") public synchronized void remove(int ID) { int pos = findClient(ID); if (pos >= 0) { ServerThread toTerminate = clients[pos]; ui.txtThongBao.append("\nXóa bỏ Client: " + ID + " at " + pos); if (pos < clientCount - 1) { Nhóm 2 – Mạng máy tính K56 32 | P a g e Đồ án: ứng dụng chát Client – Server for (int i = pos + 1; i < clientCount;... public String username = ""; Nhóm 2 – Mạng máy tính K56 22 | P a g e Đồ án: ứng dụng chát Client – Server public ObjectInputStream In = null; public ObjectOutputStream Out = null; public ServerFrame ui; public ServerThread(SocketServer _server, Socket _socket) { super(); server = _server; socket = _socket; ID = socket.getPort(); ui = _server. ui; } public void send(Message msg) { try { Out.writeObject(msg);... clients[clientCount].start(); clientCount++; } catch (IOException ioe) { ui.txtThongBao.append("\nLỗi: " + ioe); } } else { Nhóm 2 – Mạng máy tính K56 33 | P a g e Đồ án: ứng dụng chát Client – Server 34 | P a g e ui.txtThongBao.append("\nĐã vượt quá số Client cho phép đăng nhập: " + clients.length); } } } 2 Chương trình bên Client 2.1 Download class package com.socket; import com.ui.ChatFrame; import java. io.*; import java. net.*; . 1 121 05 021 8 Nguyễn Thanh Hương 1 121 05 022 8 Nguyễn Thế Phong 1 121 050073 Phạm Văn Thực 1 121 050103 Lớp: Mạng Máy Tính K56 Hà Nội, Ngày 18 Tháng 5 Năm 20 14 Đồ án: ứng dụng chát Client – Server 2 |. làm 2 form: ChatFram (phần chát chính) và HistoryFram (nhật ký chát). Nhóm 2 – Mạng máy tính K56 Đồ án: ứng dụng chát Client – Server 4 | P a g e Hình 2. 2 Client đã kết nối đến Server • ChatFram. nghẽn) Nhóm 2 – Mạng máy tính K56 Đồ án: ứng dụng chát Client – Server 5 | P a g e Hình 2. 3 Nhật ký chát 2. 2 .2 Các lớp xử lý của chương trình • Phía bên Server • Phía bên Client Nhóm 2 – Mạng máy