Bài giảng Lập trình mạng - Chương 3: Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread

pdf 55 trang ngocly 1050
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình mạng - Chương 3: Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_lap_trinh_mang_chuong_3_viet_he_thong_minichatter.pdf

Nội dung text: Bài giảng Lập trình mạng - Chương 3: Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread

  1. MÔN LẬP TRÌNH MẠNG Chương 3 Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread 3.1 Xây dựng module MiniChatter Client 3.2 Xây dựng module MiniChatter Server Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 76
  2. 3.1 Xây dựng module client MiniChatter Chúng ta sẽ thiết kế giao diện cho Form Cửa sổ phục vụ lệnh Connect : ứng dụng MiniChatClient như sau : Cửa sổ phục vụ lệnh Login : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 77
  3. Xây dựng module client MiniChatter 1. Chạy JBuilder từ Windows. Màn hình của JBuilder ₫ược hiển thị như sau : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 78
  4. Xây dựng module client MiniChatter 2. Chọn menu File.Close Projects ₫ể hiển thị cửa sổ "Close Projects", chọn button "All" rồi Ok ₫ể ₫óng các Project ₫ang mở : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 79
  5. Xây dựng module client MiniChatter 3. Chọn menu File.New Project ₫ể tạo Project mới quản lý ứng dụng MiniChatClient : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 80
  6. Xây dựng module client MiniChatter 4. Nhập tên Project, chọn thư mục chứa Project, chọn Template qui ₫ịnh cấu hình ban ₫ầu cho Project (nên ₫ể mặc ₫ịnh), rồi ấn button Next : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 81
  7. Xây dựng module client MiniChatter 5. Chọn version JDK, chọn thư mục chứa các file Output, Backup, chọn thư mục Working (nên ₫ể mặc ₫ịnh), rồi ấn button Next : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 82
  8. Xây dựng module client MiniChatter 6. Chọn cách mã hóa chuỗi là UTF-8, nhập Title vá các thông tin khác vềứng dụng, nếu muốn, rồi ấn nutton Finish : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 83
  9. Xây dựng module client MiniChatter 7. Chọn menu File.New , cửa sổ Object Gallery sẽ hiển thị, chọn icon "Application" ₫ể tạo 1 ứng dụng mới trong Project : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 84
  10. Xây dựng module client MiniChatter 8. Nhập tên ứng dụng, chọn Package chứa ứng dụng (nên ₫ể mặc ₫ịnh) rồi ấn button Next : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 85
  11. Xây dựng module client MiniChatter 9. Nhập tên class và title bar cho dialog của ứng dụng, chọn các options cần thiết rồi ấn button Next : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 86
  12. Xây dựng module client MiniChatter 10. Nhập tên file qu ản lý cấu hình run-time cho ứng dụng vừa tạo (nên ₫ể mặc ₫ịnh) rồi ấn button Finish : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 87
  13. Xây dựng module client MiniChatter 11. Cửa sổ JBuilder lúc này sẽ có dạng như sau : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 88
  14. Xây dựng module client MiniChatter 12. Chọn tab "Design" ₫ể chuyển sang cửa sổ thiết kế form giao diện : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 89
  15. Xây dựng module client MiniChatter 13. Chọn mục "contentPane", thay ₫ổi giá trị thuộc tính layout về "XYLayout" ₫ể ta có thể thiết kế các ph ần tử giao diện 1 cách tự do : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 90
  16. Xây dựng module client MiniChatter 14. Chọn tab "Swing", chọn icon "JButton" rồi vẽ nó ở góc trên trái Form, chọn button vừa vẽ, quan sát và thiết lập giá trị cho thuộc tính name=btnConne ct, margin = 1,1,1,1, thuộc tính text=Connect : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 91
  17. Xây dựng module client MiniChatter 15. Lập lại bước 14 ₫ể vẽ các button Groups, Login, Users, Send, Logout, Disconnect. Chọn tab "Swing Containers", chọn icon JScrollPane rồi vẽ 1 scrollpane chứa listbox hiển thị danh sách nhóm, thiết lập field name=jspGroups. Vẽ 1 JList vào trong scrollpane và thiết lập field name=jlbGroups : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 92
  18. Xây dựng module client MiniChatter 16. Lập lại bước 15 ₫ể vẽ các listbox jlbUsers, jlbContent, vẽ 1 JTextField và thiết lập field name=jtfMessage. Có thể dóng trái, trên, các ₫ối tượng bằng cách chọn chúng, ấn phải chuột ₫ể hiển thị cửa sổ lệnh rồi chọn mục tương ứng (thí dụ dóng trái các ₫ối tượng sau ₫ây) : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 93
  19. Xây dựng module client MiniChatter 17. Sau khi thiết kế hoàn chỉnh, ta có Form như sau : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 94
  20. Xây dựng module client MiniChatter 18. Tạo hàm xử lý sự kiện ấn chuột vào button Connect : chọn button Connect, chọn tab Events, ₫ưa cursor về textbox actionPerformed rồi ấn Enter ₫ể tạo hàm xử lý với tên mặc ₫ịnh : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 95
  21. Xây dựng module client MiniChatter 19. Cửa sổ code sẽ hiển thị ₫ể bạn có thể hiện thực thân của hàm xử lý vừa tạo. Bạn có thể viết code ngay hay bất ký lúc nào sau ₫ó. Lặp lại bước 18 ₫ể tạo các hàm xử lý cho các button còn lại : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 96
  22. Xây dựng module client MiniChatter 20. Để tạo form nhập liệu "Connect", chọn menu File.New ₫ể hiển thị cửa sổ Object Gallery. Chọn tab General, chọn icon Dialog : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 97
  23. Xây dựng module client MiniChatter 21. Nhập tên class, chọn class cha cần thừa kế rồi ấn button Ok : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 98
  24. Xây dựng module client MiniChatter 22. Sau khi Dialog mới ₫ược tạo ra, bạn thiết kế trực quan và viết code cho nó giống như Form ₫ầu tiên miêu tảứng dụng. Lặp lại bước 20, 21, 22 cho Form nhập liệu Login. Viết code cho các hàm xử lý sự kiện ₫ã tạo ra trên từng Form giao diện. Nếu cần thiết, viết code tăng cường cho Constructor của Form ₫ể thiết lập 1 số giá trị ban ₫ầu cho Form ₫ó. Chọn menu Run.Run Project, chọn tên file quản lý run- time của ứng dụng ₫ể chạy và debug nó. Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 99
  25. Xây dựng module client MiniChatter Mô hình multi-thread ở client : Thread chính Hiển thị Form Thread con Tạo socket Yêu cầu nối kết ₫ến server Chờ data từ server gởi về Tạo thread con chờ recv Nếu có thì nhận vào và xử lý Chờ tương tác của user, nếu có reply dựa theo trạng thái yêu cầu thì gởi request request ₫ượ c lưu trong biế n và nhớ request vào biến fstat fstat. Network Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 100
  26. Xây dựng module client MiniChatter // khai báo package của ứng dụng package jbminichatclient; // khai báo các package cần dùng trong ứng dụng import java.awt.*; import java.awt.event.*; import javax.swing.*; import com.borland.jbcl.layout.*; import java.net.*; import java.util.*; import java.io.*; // khai báo class miêu tả Form của client public class MiniChatClientDlg extends JFrame implements MessageListener { private Socket socket; // socket giao tiếp với server private boolean connected = false; // cờ trạng thái làm việc của client private ReceivingThread receivingThread; //handle ₫ến thread con chờ recv // các hằng gợi nhớ miêu tả lệnh request cu ối cùng ₫ã gởi ₫i private static final int FSGLIST = 0; private static final int FSLOGIN = 1; private static final int FSLOGOUT = 2; private static final int FSULIST = 3; private static final int FSMESG = 4; private int fstate=FSMESG; Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 101
  27. Xây dựng module client MiniChatter // các thuộc tính ₫ược tạo tự ₫ộng do thiết kế trực quan JPanel contentPane; //Constructor của Form client public MiniChatClientDlg() { enableEvents(AWTEvent.WINDOW_EVENT_MASK); try { jbInit(); } catch(Exception e) { e.printStackTrace(); } // thiết lập kích thước cho Form this.setSize(new Dimension(540, 440)); // tạo Model chứa nội dung cho các ₫ối tượng JList (listbox) DefaultListModel model = new DefaultListModel(); jlbGroups.setModel((ListModel)model); model =new DefaultListModel(); jlbUsers.setModel((ListModel)model); model =new DefaultListModel(); jlbContent.setModel((ListModel)model); } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 102
  28. Xây dựng module client MiniChatter //Code của các hàm xử lý sự kiện // hàm xử lý button btnConnect void btnConnect_actionPerformed(ActionEvent e) { ConnectDlg dlg = new ConnectDlg(new javax.swing.JFrame(),"Nhap thong tin ve server",true); dlg.show(); if (dlg.fOk) { // thuc hien connect try { socket = new Socket(InetAddress.getByName(dlg.txtIPAddress),dlg.intPort); // create Thread for receiving incoming messages receivingThread = new ReceivingThread(this,socket ); receivingThread.start(); } // handle exception connecting to server catch ( IOException ioException ) { ioException.printStackTrace(); } // update connected flag connected = true; } } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 103
  29. Xây dựng module client MiniChatter // hàm xử lý button btnGroup void btnGroup_actionPerformed(ActionEvent e) { String mesg = "GLIST "; SendMessage(socket,mesg); fstate = FSGLIST; } // hàm xử lý button btnLogin void btnLogin_actionPerformed(ActionEvent e) { LoginDlg dlg; if (jlbGroups.getSelectedValue().toString() == null) dlg = new LoginDlg(new javax.swing.JFrame(),"Nhap thong tin login",true,""); else dlg = new LoginDlg(new javax.swing.JFrame(),"Nhap thong tin login",true,jlbGroups.getSelectedValue().toString()); dlg.show(); if (dlg.fOk) { // thuc hien connect String request; request = "LOGIN "+dlg.jtfGroupName.getText() + "," + dlg.jtfUserName.getText(); SendMessage(socket,request); fstate = FSLOGIN; } } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 104
  30. Xây dựng module client MiniChatter // hàm xử lý button btnUser void btnUser_actionPerformed(ActionEvent e) { String mesg = "ULIST "; SendMessage(socket,mesg); fstate = FSULIST; } // hàm xử lý button btnSend void btnSend_actionPerformed(ActionEvent e) { SendToGroup(); } // hàm xử lý button btnLogout void btnLogout_actionPerformed(ActionEvent e) { String mesg; mesg = "LOGOU "; SendMessage(socket,mesg); fstate = FSLOGOUT; } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 105
  31. Xây dựng module client MiniChatter // hàm xử lý button btnDisconnect void btnDisconnect_actionPerformed(ActionEvent e) { try { SendMessage(socket,"LOGOU "); fstate = FSLOGOUT; } catch ( IOException ioException ) { ioException.printStackTrace(); } } // hàm xử lý sự kiện ấn phím trên textbox void jtfMessage_keyPressed(KeyEvent e) { if (e.getKeyCode()==10) SendToGroup(); } // hàm gởi 1 message ₫ến server private void SendMessage(Socket sock, String mesg) { // send message and flush PrintWriter try { PrintWriter writer = new PrintWriter( sock.getOutputStream() ); writer.println(mesg); writer.flush(); } // handle exception sending message catch ( IOException ioException ) { ioException.printStackTrace(); } } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 106
  32. Xây dựng module client MiniChatter // hàm gởi 1 message ₫ến các thành viên của nhóm private void SendToGroup() { String mesg = jtfMessage.getText(); if (mesg != "") SendMessage(socket,"SEND "+mesg); fstate = FSMESG; } // hàm nhận 1 message từ Server và xử lý reply (do thread con gọi) public void messageReceived( Socket sock, String mesg) { int status; if (mesg.compareTo("CLOSE ")==0) return; switch (fstate) { case FSLOGIN : Do_login(mesg); break; case FSLOGOUT: // logout Do_logout(mesg); break; case FSMESG : // group list Do_receive(mesg); break; case FSGLIST: // user list Do_glist(mesg); break; case FSULIST: // broadcast message Do_ulist(mesg); } fstate = FSMESG; } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 107
  33. Xây dựng module client MiniChatter private void Do_login(String mesg) { } private void Do_logout(String mesg) { if (mesg.charAt(0) == '0') return; DefaultListModel lmUsers = (DefaultListModel)jlbUsers.getModel(); lmUsers.clear(); DefaultListModel lmContent = (DefaultListModel)jlbContent.getModel(); lmContent.clear(); } private void Do_glist(String mesg) { int i; DefaultListModel lmGroups = (DefaultListModel)jlbGroups.getModel(); lmGroups.clear(); if (mesg.charAt(0) == '0') return; mesg = mesg.substring(2); // tokenize message to retrieve user name and message body StringTokenizer tokenizer = new StringTokenizer(mesg, "," ); int size =tokenizer.countTokens(); for (i=0; i<size;i++ ) lmGroups.addElement( tokenizer.nextToken()); } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 108
  34. Xây dựng module client MiniChatter private void Do_ulist(String mesg) { String gname; int i; DefaultListModel lmUsers = (DefaultListModel)jlbUsers.getModel(); lmUsers.clear(); if (mesg.charAt(0) == '0') return; if (mesg.length()<3) return; mesg = mesg.substring(2); // tokenize message to retrieve user name and message body StringTokenizer tokenizer = new StringTokenizer(mesg, "," ); int size = tokenizer.countTokens(); for (i=0; i<size;i++ ) lmUsers.addElement( tokenizer.nextToken()); } private void Do_receive(String mesg) { DefaultListModel lmContent = (DefaultListModel)jlbContent.getModel(); // append new message lmContent.addElement(mesg); } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 109
  35. Xây dựng module client MiniChatter Để ₫ặc tả thread xử lý recv (là 1 class Java), bạn chọn menu File.New ₫ể hiện thị cửa sỗ Object Gallery, chọn tab General, chọn icon Class rồi trả lời 1 số thông số ₫ể xác ₫ịnh class cần tạo ra. Sau ₫óvi ết code sau cho class : // Code của class ReceivingThread : miêu tả hoạt ₫ộng củ a thread con chờ nh ận reply package jbminichatclient; import java.io.*; import java.net.*; import java.util.StringTokenizer; public class ReceivingThread extends Thread { private BufferedReader input; private MessageListener messageListener; private boolean keepListening = true; Socket socket; // ReceivingThread constructor public ReceivingThread( MessageListener listener, Socket clientSocket ) { // invoke superclass constructor to name Thread super( "ReceivingThread: " + clientSocket ); // set listener to which new messages should be sent messageListener = listener; socket = clientSocket; Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 110
  36. Xây dựng module client MiniChatter // set timeout for reading from clientSocket and create // BufferedReader for reading incoming messages try { socket.setSoTimeout( 5000 ); input = new BufferedReader( new InputStreamReader( socket.getInputStream() ) ); } // handle exception creating BufferedReader catch ( IOException ioException ) { ioException.printStackTrace(); } } // end ReceivingThread constructor // listen for new messages and deliver them to MessageListener public void run() { String message; // listen for messages until stopped while ( keepListening ) { // read message from BufferedReader try { message = input.readLine(); } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 111
  37. Xây dựng module client MiniChatter // handle exception if read times out catch ( InterruptedIOException interruptedIOException ) { // continue to next iteration to keep listening continue; } // handle exception reading message catch ( IOException ioException ) { messageListener.messageReceived( socket, // user name "CLOSE "); // message body break; } // ensure non-null message if ( message != null ) // send message to MessageListener messageListener.messageReceived(socket, // user name message); // message body } // end while Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 112
  38. Xây dựng module client MiniChatter // close BufferedReader (also closes Socket) try { input.close(); } // handle exception closing BufferedReader catch ( IOException ioException ) { ioException.printStackTrace(); } } // end method run // stop listening for incoming messages public void stopListening() { keepListening = false; } } // end class ReceivingThread Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 113
  39. Xây dựng module Server MiniChatter Qui trình tạo ứng dụng Server cũng giống như Client. Bạn tạo Form giao diện có dạng như sau : Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 114
  40. Xây dựng module Server MiniChatter Thread chính Mô hình các thread ở Server : Hiển thị Form Thread con Thread cháu Tạo socket lắng nghe Tạo thread con chờ accept Chờ accept yêu cầu tạo Chờ data từ server gởi về Chờ tương tác của user, cầu nối từ client. Nếu có thì nhận vào và xử nếu có yêu cầu hiển thị Nếu có thì chấp nhận và lý reply dựa theo trạng dsách user trong nhóm nào tạo thread cháu ₫ể chờ thái reuqest ₫ược lưu thì thực hiện. nhận request từ client trong biến fstat. tương ứng. Network Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 115
  41. Xây dựng module Server MiniChatter // code của file MiniChatServerDlg package jbminichatclient; import java.awt.*; import java.awt.event.*; import javax.swing.*; import com.borland.jbcl.layout.*; import java.util.*; import java.net.*; import java.io.*; import java.sql.*; public class MiniChatServerDlg extends JFrame implements MessageListener { //các thuộc tính cần dùng cho Server int m_groupcnt; // số nhóm T_UserRec m_sock_no_user=null; // danh sách các user chưa login T_GroupList m_grouplist[] = new T_GroupList[10]; // danh sách nhóm String uname; // tên user ServerSocket serverSocket; // socket mà server dùng ₫ể accept final int SERVER_PORT = 256; // port lắng nghe của server //các thuộc tính cần dùng cho Server JPanel contentPane; Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 116
  42. Xây dựng module Server MiniChatter //Constructor của frame public MiniChatServerDlg() { enableEvents(AWTEvent.WINDOW_EVENT_MASK); try { jbInit(); } catch(Exception e) { e.printStackTrace(); } // thiết lập kích thước của form this.setSize(new Dimension(490, 445)); // tạo các model chứa nội dung của các listbox DefaultListModel model = new DefaultListModel(); jlbGroups.setModel((ListModel)model); model =new DefaultListModel(); jlbUsers.setModel((ListModel)model); model =new DefaultListModel(); jlbContent.setModel((ListModel)model); // truy xuất danh sách nhóm từ database và hiển thị lên listbox Groups ReadDisplayGroups(); Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 117
  43. Xây dựng module Server MiniChatter // tao sersersocket lắng nghe cho server try { serverSocket = new ServerSocket( SERVER_PORT, 100 ); DefaultListModel lmContent = (DefaultListModel)jlbContent.getModel(); lmContent.addElement("Server listening on port " + SERVER_PORT + " "); // tạo thread con ₫ể chờ accept new ServerAcceptThread(this,serverSocket).start(); } // end try // handle exception creating server and connecting clients catch ( IOException ioException ) { ioException.printStackTrace(); } } // ₫ọc danh sách nhóm từ database và hiển thị private void ReadDisplayGroups(){ String conStr = "jdbc:odbc:GroupList"; Connection con; String newSQL = "Select * from GroupList"; String[] data = {"dummy"}; DefaultListModel lmGroups = (DefaultListModel)jlbGroups.getModel(); Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 118
  44. Xây dựng module Server MiniChatter try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //1. Tao connection mieu ta database can truy xuat con = DriverManager.getConnection(conStr,"",""); //2. Tao 1 doi tuong Statement lien ket den connection java.sql.Statement stmt = con.createStatement(); //4. Tao doi tuong recordset chua ket qua cua lenh SQL ResultSet rs =stmt.executeQuery(newSQL); //5. Duyet recordset de xu ly cac record cua no int i = 0; lmGroups.clear(); if (rs != null) while (rs.next()) { m_grouplist[i] = new T_GroupList(); m_grouplist[i].name = rs.getString("groupname"); lmGroups.addElement(m_grouplist[i].name); i++; } m_groupcnt = i; //6. Dong cac dong tuong da tao ra rs.close(); stmt.close(); con.close(); } catch (Exception e) {System.out.println("Error : "+e);} } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 119
  45. Xây dựng module Server MiniChatter // hàm xử lý request ₫ến từ socket sock public void messageReceived( Socket sock, String mesg ) { int status; String opcode = mesg.substring(0,5); if (opcode.compareTo("LOGIN")==0) { // login Do_login(sock,mesg); } else if (opcode.compareTo("LOGOU")==0) { // logout Do_logout(sock); } else if (opcode.compareTo("GLIST")==0) { // group list Do_glist(sock); } else if (opcode.compareTo("ULIST")==0) { // user list Do_ulist(sock); } else if (opcode.compareTo("CLOSE")==0) { // user list Do_CloseSock(sock); } else { // broadcast message Do_MulticastMesg(sock,mesg.substring(5)); } } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 120
  46. Xây dựng module Server MiniChatter private void Do_glist(Socket sock) { String mesg,mesg1; int i; mesg = "1 "+m_grouplist[0].name; for (i=1;i <m_groupcnt;i++) mesg = mesg + "," +m_grouplist[i].name; SendMessage(sock,mesg); } private int Findgroup(Socket sock) { int i; T_UserRec pu; for (i=0; i<m_groupcnt; i++) { pu = m_grouplist[i].userlist; while (pu != null) { if (pu.sock == sock) { uname = pu.name; return i; } pu = pu.next; } } return -1; } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 121
  47. Xây dựng module Server MiniChatter private void Do_ulist(Socket sock) { String mesg; int i = Findgroup(sock); if (i <0 || m_grouplist[i].userlist ==null) mesg ="0 "; else { T_UserRec pu = m_grouplist[i].userlist; mesg ="1 "; while (pu != null) { mesg = mesg + pu.name; pu = pu.next; if (pu != null) mesg = mesg + ","; } } SendMessage(sock,mesg); } private void Do_MulticastMesg(Socket sock, String mesg) { int i = Findgroup(sock); if (i <0) return; mesg = uname+":"+mesg; T_UserRec pu = m_grouplist[i].userlist; while (pu != null) { SendMessage(pu.sock,mesg); pu = pu.next; } } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 122
  48. Xây dựng module Server MiniChatter // Dong cau noi tuong ung private void Do_CloseSock(Socket sock) { int i = Findgroup(sock); T_UserRec pu, pup = null; if (i >= 0) { pu = m_grouplist[i].userlist; while (pu!=null && pu.sock != sock) { pup = pu; pu = pu.next; } if (pu==m_grouplist[i].userlist) m_grouplist[i].userlist = pu.next; else pup.next = pu.next; } else { pu = m_sock_no_user; while (pu!= null && pu.sock != sock) { pup = pu; pu = pu.next; } if (pu == m_sock_no_user) m_sock_no_user = pu.next; else pup.next = pu.next; } try { sock.close(); } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 123
  49. Xây dựng module Server MiniChatter // handle exception connecting to server catch ( IOException ioException ) { ioException.printStackTrace(); } } private void Do_login(Socket sock, String mesg) { T_UserRec pup,pu; String gname, uname; int i; mesg = mesg.substring(6); // tokenize message to retrieve user name and message body StringTokenizer tokenizer = new StringTokenizer(mesg, "," ); // ignore messages that do not contain a user // name and message body if ( tokenizer.countTokens() == 2 ) { gname = tokenizer.nextToken(); uname = tokenizer.nextToken(); // tim group tuong ung for (i=0; i<m_groupcnt; i++) if (gname.compareTo(m_grouplist[i].name) == 0) break; System.out.println(gname + " " + uname + " " + i); Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 124
  50. Xây dựng module Server MiniChatter if (i < m_groupcnt) { // tim sokcet trong danh sach chua co user pup = pu = m_sock_no_user; while (pu!= null && pu.sock != sock) { pup = pu; pu = pu.next; } if (pu!= null) { if (pu == m_sock_no_user) m_sock_no_user = pu.next; else pup.next = pu.next; pu.next = m_grouplist[i].userlist; pu.name = uname; m_grouplist[i].userlist = pu; uname = "1 "; SendMessage(sock,uname); return; } } } errordisp: uname ="0 "; SendMessage(sock,uname); } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 125
  51. Xây dựng module Server MiniChatter private void Do_logout(Socket sock) { int i = Findgroup(sock); T_UserRec pu, pup=null; if (i >= 0) { pu = m_grouplist[i].userlist; while (pu!= null && pu.sock != sock) { pup = pu; pu = pu.next; } if (pu==m_grouplist[i].userlist) m_grouplist[i].userlist = pu.next; else pup.next = pu.next; pu.next = m_sock_no_user; m_sock_no_user = pu; SendMessage(sock,"1 "); } else SendMessage(sock,"0 "); } public void SendMessage(Socket sock, String mesg) { // send message and flush PrintWriter try { PrintWriter writer = new PrintWriter( sock.getOutputStream() ); writer.println(mesg); writer.flush(); } // handle exception sending message catch ( IOException ioException ) { ioException.printStackTrace(); } } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 126
  52. Xây dựng module Server MiniChatter // hàm xử lý sự kiện ấn chuột vào 1 phần tử của listbox Group void jlbGroups_mouseClicked(MouseEvent e) { String gname = jlbGroups.getSelectedValue().toString(); int i,j; if (gname == null) return; for (i = 0; i = m_groupcnt) return; T_UserRec ulist = m_grouplist[i].userlist; DefaultListModel lmUsers = (DefaultListModel)jlbUsers.getModel(); lmUsers.clear(); while (ulist != null) { lmUsers.addElement(ulist.name); ulist = ulist.next; } } } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 127
  53. Xây dựng module Server MiniChatter // code của thread chờ accpet package jbminichatclient; import java.util.*; import java.net.*; import java.io.*; import javax.swing.*; public class ServerAcceptThread extends Thread { ServerSocket serverSocket; MiniChatServerDlg serverChat; public ServerAcceptThread(MiniChatServerDlg server, ServerSocket sock) { serverSocket = sock; serverChat = server; } public void run() { T_UserRec puser; try { // listen for clients constantly while (true) { Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 128
  54. Xây dựng module Server MiniChatter // accept new client connection Socket clientSocket = serverSocket.accept(); puser = new T_UserRec(); puser.sock = clientSocket; puser.next = serverChat.m_sock_no_user; serverChat.m_sock_no_user = puser; // create new ReceivingThread for receiving messages from client new ReceivingThread(serverChat, clientSocket).start(); // print connection information DefaultListModel lmContent = (DefaultListModel)serverChat.jlbContent.getModel(); lmContent.addElement("Connection received from: " + clientSocket.getInetAddress()); serverChat.SendMessage(clientSocket,"Request accepted"); } // end while } // handle exception creating server and connecting clients catch ( IOException ioException ) { ioException.printStackTrace(); } } } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 129
  55. Xây dựng module Server MiniChatter // accept new client connection Socket clientSocket = serverSocket.accept(); puser = new T_UserRec(); puser.sock = clientSocket; puser.next = serverChat.m_sock_no_user; serverChat.m_sock_no_user = puser; // create new ReceivingThread for receiving messages from client new ReceivingThread(serverChat, clientSocket).start(); // print connection information DefaultListModel lmContent = (DefaultListModel)serverChat.jlbContent.getModel(); lmContent.addElement("Connection received from: " + clientSocket.getInetAddress()); serverChat.SendMessage(clientSocket,"Request accepted"); } // end while } // handle exception creating server and connecting clients catch ( IOException ioException ) { ioException.printStackTrace(); } } } Bộ môn : Công nghệ phần mềm Môn : Lập trình Mạng Khoa Công nghệ Thông tin Chương 3 : Viết hệ thống MiniChatter bằng Java & dùng kỹ thuật multi-thread Trường ĐH Bách Khoa Tp.HCM Slide 130