Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 62 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
62
Dung lượng
3,97 MB
Nội dung
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC XÂY DỰNG HÀ NỘI KHOA CÔNG NGHỆ THÔNG TIN Bài Tập Lớn Xây dựng ứng dụng Chat Client – Server Giảng Viên Hướng Dẫn: Nhóm: Lớp: Hồng Nam Thắng Nguyễn Xn Thưởng 1121050299 Vũ Hoàng Tuấn KIệt 1121050218 Nguyễn Trung Kiên 1121050228 Khoa học máy tính – K66 Hà Nội, Ngày 19 Tháng Năm 2022 Ứng dụng clinet-server Mục Lục LỜI NÓI ĐẦU Chương GIỚI THIỆU 1.1 MỤC TIÊU CỦA ĐỀ TÀI 1.2 GIẢI QUYẾT ĐỀ TÀI Chương : CƠ SỞ LÝ THUYẾT 2.1 CÁC GIAO THỨC MẠNG 2.1.1 Giao thức IP 2.1.2 Giao thức UDP 2.1.3 Giao thức TCP 2.2 MƠ HÌNH CLIENT-SERVER 2.3 LẬP TRÌNH SOCKET Chương 3: MÔ TẢ ỨNG DỤNG 3.1 GIỚI THIỆU ỨNG DỤNG 3.2 KIẾN TRÚC ỨNG DỤNG 3.2.1 Mơ hình tổng thể 3.2.2 Gói server 3.2.3 Gói client 3.3 MƠ HÌNH THÔNG ĐIỆP GIỮA CLIENT VÀ SERVER Chương CÀI ĐẶT VÀ KẾT QUẢ THỬ NGHIỆM 4.1 KẾT QUẢ THỬ NGHIỆM 4.2 CÁC GIAO DIỆN CHÍNH CỦA CHƯƠNG TRÌNH 4.3 KẾT QUẢ THỬ NGHIỆM TRÊN MẠNG LAN Chương KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 5.1 KẾT LUẬN VÀ KẾT QUẢ ĐẠT ĐƯỢC 5.1.2 Kết đạt 5.2 ƯU KHUYẾT ĐIỂM 5.2.1 Ưu điểm 5.2.2 Khuyết điểm 5.3 HƯỚNG PHÁT TRIỂN Nhóm – Mạng máy tính K56 Ứng dụng clinet-server Chương GIỚI THIỆU 1.1 MỤC TIÊU CỦA ĐỀ TÀI - Dùng Java để xây dựng trương trình Chat qua mạng theo mơ hình -Client/Server - Tạo chương trình mà Client kết nối với thơng qua Server - Các Client gửi tin nhắn, trò chuyện trực tiếp với Client khác 1.2 GIẢI QUYẾT ĐỀ TÀI Giao thức TCP/IP Mơ hình Client Server Socket java TCP/IP cho phép máy tính mạng TCP/IP tạo kết nối để trao đổi thông tin với nhau.Với địa IP + cổng TCP tạo thành cầu nối Socket giao diện lập trình cầu nối (1 IP Address + Port TCP = Socket ) Khi máy tính muốn trao đổi thơng tin với máy phải có Socket Một máy coi Server, mở Socket lắng nghe yêu cầu Các máy lại coi Client, gọi cho Server Socket để bắt thiết lập kết nối Để thiết lập kết nối cần có địa máy đích (Destination IP Address ) cổng TCP (TCP port) Nhóm – Mạng máy tính K56 Ứng dụng clinet-server Mơ hình Client – Server Phương thức truyền tin Java: Nó sử dụng phương thức truyền tin có kết nối thông qua đối tượng là: Socket(Client) ServerSocket(Server) Tạo Socket sử dụng để kết nối tới SocketServer Client Socket tạo thông qua hàm khởi tạo(Contructor) lớp Socket: Socket client=new Socket(Destination Address,Port) Trong đó: + Destination Address địa máy muốn kết nối tới + Port số hiệu cổng TCP đòi hỏi phải có ServerSocket lắng nghe yêu cầu Để tạo ServerSocket sử dụng câu lệnh sau: ServerSocket SSocket=new ServerSocket(Port,Number of Connection) Trong đó: + Port số hiệu cổng chờ để phục vụ + Number of Connection số kết nối chấp nhận phục vụ lúc Nhóm – Mạng máy tính K56 Ứng dụng clinet-server Một SocketServer lắng nghe cổng Khi nhận yêu cầu từ socket (Client Socket) kiểm tra xem cịn chấp nhận kết nối khơng, chưa vượt q số kết nối mà phục vụ, tạo Socket để tạo liên kết với Client yêu cầu phương thức: Socket client=SSocket.accept(); Các Socket cung cấp giao diện để đọc ghi liệu thông qua luồng.Khi kết nối thiết lập máy tính trao đổi liệu thông qua đối tượng: BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream())); PrintWriter out=PrintWriter(client.getOutputStream(),true); Khi thực xong cần hủy bỏ liên kết để trả lại tài nguyên cho hệ thống, sử dụng phương thức: In.close(); Out.close(); Client.close(); Nhóm – Mạng máy tính K56 Ứng dụng clinet-server Hoạt động ứng dụng mạng Client/Server Chương : CƠ SỞ LÝ THUYẾT 2.1 Các giao thức mạng Giao thức Giao thức hay cịn gọi nghi thức phương tiện để làm cho thông tin trở nên khả hữu Một định phải thực hai hay nhiều máy tính muốn gởi nhận liệu 2.1.1 Giao thức IP (Internet Protocol - Giao thức Liên mạng) giao thức hướng liệu sử dụng máy chủ nguồn đích để truyền liệu liên mạng chuyển mạch gói Dữ liệu liên mạng IP gửi theo khối gọi gói (packet datagram) Cụ thể, IP không cần thiết lập đường truyền trước máy chủ Nhóm – Mạng máy tính K56 Ứng dụng clinet-server gửi gói tin cho máy khác mà trước chưa liên lạc với Giao thức IP cung cấp dịch vụ gửi liệu khơng đảm bảo (cịn gọi cố gắng cao ), nghĩa khơng đảm bảo gói liệu Gói liệu đến nơi mà khơng cịn ngun vẹn, đến khơng theo thứ tự (so với gói khác gửi hai máy nguồnvà đích đó), bị trùng lặp bị hoàn toàn Nếu phần mềm ứng dụng cần bảo đảm, cung cấp từ nơi khác, thường từ giao thức giao vận nằm phía IP Các thiết bị định tuyến liên mạng chuyển tiếp gói tin IP qua mạng tầng liên kết liệu kết nối với Việc khơng có đảm bảo gửi liệu có nghĩa chuyển mạch gói có thiết kế đơn giản (Lưu ý mạng bỏ gói tin, làm đổi thứ tự làm hỏng nhiều gói tin, người dùng thấy hoạt động mạng trở nên Hầu hết thành phần mạng cố gắng tránh để xảy tình trạng Đó lý giao thức gọi cố gắng cao Tuy nhiên, lỗi xảy không thường xun khơng có hiệu đủ xấu đến mức người dung nhận thấy được) Giao thức IP thông dụng mạng Internetcông cộng ngày Giao thức tầng mạng thong dụng ngày IPv4; phiên từ đến bị hạn chế, không sử dụng Phiên dùng làm giao thức dịng (stream) thử nghiệm Cịn có phiên khác, chúng thường dành giao thức thử nghiệm không sử dụng rộng rãi Kề từ thức đưa vào sử dụng định nghĩa kiến nghị RFC791 năm 1981 đến nay, phiên sử dụng rộng rãi góp phần tạo phát triển bùng nổ mạng máy tính 2.1.2 Giao thức TCP Là giao thức hướng kết nối, cung cấp hoạt động truyền tin tin cậy TCP chịu trách nhiệm phân chia liệu gửi thành segment máy gửi lắp gép segment lại máy đích, q trình truyền truyền lại segment máy đích chưa nhận Gói tin TCP có dạng sau: Nhóm – Mạng máy tính K56 Ứng dụng clinet-server Source port: Số hiệu cổng gọi (16 bits) Destination Port : Số hiệu cổng đích (16 bits) Sequence Number: Chữa số đảm bảo xác liệu đến, giống số thứ tự (32 bits) Acknowledgment Number (ACK): dùng gói liệu hồi đáp máy nhận cho máy gửi, báo hiệu để máy gửi biết lượng liệu mà máy nhận nhận yêu cầu gửi liệu (32 bits) Header Length: Số lượng từ 32 bit header (32 bits) Reserved : Set thành zero (6 bits) Code Bits: Các chức điều khiển thiết lập kết thúc phiên, giống cờ gồm bits.1.Cờ URG.2.Cờ ACK dùng để xác nhận.3.Cờ PSH (push) yêu cầu xóa vùng đệm.4.Cờ RST (Reset) tái thiết lập.5.Cờ SYN (Synchronic) đồng bộ.6.Cờ FIN (finish) Kết thúc, sử dụng muốn hủy kết nối Nhóm – Mạng máy tính K56 Ứng dụng clinet-server Window: ghi kích thước cửa sổ máy gửi báo cho máy nhận biết có gửi tín hiệu trở lại khơng vượt kích thước này(16 bits) Checksum: tính từ header trường liệu(16 bits) Urgent: Chỉ điểm kết thúc liệu chuẩn(16 bits) Options: Một tùy chọn định kích thước tối đa hành gói TCP Data: Dữ liệu giao thức lớp 2.2 MƠ HÌNH CLIENT-SERVER Các ứng dụng mạng thường hoạt động theo mơ hình client/server thư điện tử, truyền nhận tập tin, game mạng, Mơ hình gồm có chương trình đóng vai trị client chương trình đóng vai trị server Hai chương trình giao tiếp với thơng qua mạng Chương trình server đóng vai trị cung cấp dịch vụ Chương trình ln ln lắng nghe u cầu từ phía client, tính tốn đáp trả kết tương ứng Chương trình client cần dịch vụ gởi yêu cầu dịch vụ tới chương trình server đợi đáp trả từ server Như vậy, trình trao đổi liệu client/server bao gồm: Truyền yêu cầu từ chương trình client tới chương trình server Yêu cầu server xử lý Truyền đáp ứng cho client Nhóm – Mạng máy tính K56 Ứng dụng clinet-server Mơ hình truyền tin thực truyền hai thông điệp qua lại client server cách đồng hóa Chương trình server nhận thơng điệp từ client phát u cầu client chuyển sang trạng thái chờ (tạm dừng) client nhận thông điệp đáp ứng server gửi Mơ hình client/server thường cài đặt dựa thao tác gửi (send) nhận (receive) Mơ hình phổ biến chấp nhận rộng rãi hệ thống phân tán mô hình client/server Trong mơ hình có tập tiến trình mà tiến trình đóng vai trị trình quản lý tài nguyên cho tập hợp tài nguyên cho trước tập hợp tiến trình client tiến trình thực tác vụ cần truy xuất tới tài nguyên phần cứng phần mềm dùng chung Bản thân trình quản lý tài nguyên cần phải truy xuất tới tài nguyên dùng chung quản lý tiến trình khác, số tiến trình vừa tiến trình client vừa tiến trình server Các tiến trình phát yêu cầu tới server chúng cần truy xuất tới tài nguyên server Nếu yêu cầu đắn server thực hành động yêu cầu gửi đáp ứng trả lời tới tiến trình client Mơ hình client/server cung cấp cách tiếp cận tổng quát để chia sẻ tài nguyên hệ thống phân tán Mô hình cài đặt nhiều mơi trường Nhóm – Mạng máy tính K56 Ứng dụng clinet-server }); send.start(); } public void OnlineList(Message msg){ } public void close(){ try{ outObj.close(); inObj.close(); socket.close(); }catch(Exception e){ e.printStackTrace(); } } private static Runnable newRunnable() { throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody } } 2.2 ClientFrame class package clieng; import java.io.IOException; import java.util.logging.Level; Nhóm – Mạng máy tính K56 Ứng dụng clinet-server import java.util.logging.Logger; /** * * @author Admin */ public class ClientFrame extends javax.swing.JFrame { Clieng Client; /** * Creates new form NewJFrame */ @Override public void setUndecorated(boolean undecorated) { super.setUndecorated(undecorated); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/OverriddenMethodBody } public ClientFrame() { initComponents(); } /** * This method is called from within the constructor to initialize the form * WARNING: Do NOT modify this code The content of this method is always * regenerated by the Form Editor */ Nhóm – Mạng máy tính K56 Ứng dụng clinet-server @SuppressWarnings("unchecked") // private void initComponents() { jLabel1 = new javax.swing.JLabel(); jSeparator1 = new javax.swing.JSeparator(); jLabel2 = new javax.swing.JLabel(); btStart = new javax.swing.JButton(); jScrollPane2 = new javax.swing.JScrollPane(); txpMessageBoard = new javax.swing.JTextPane(); SeverPort = new javax.swing.JTextField(); jLabel3 = new javax.swing.JLabel(); Severip = new javax.swing.JTextField(); jLabel4 = new javax.swing.JLabel(); TxtMessage = new javax.swing.JTextField(); BtSend = new javax.swing.JButton(); jLabel5 = new javax.swing.JLabel(); jLabel6 = new javax.swing.JLabel(); txtName = new javax.swing.JTextField(); jScrollPane1 = new javax.swing.JScrollPane(); TxpOnlineBoard = new javax.swing.JTextPane(); jLabel7 = new javax.swing.JLabel(); ExitButton = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); jLabel1.setFont(new java.awt.Font("Segoe UI", 1, 18)); // NOI18N Nhóm – Mạng máy tính K56 Ứng dụng clinet-server jLabel1.setText("Chat Client"); jLabel2.setText("Port:"); btStart.setText("Connect"); btStart.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btStartActionPerformed(evt); } }); jScrollPane2.setViewportView(txpMessageBoard); SeverPort.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { SeverPortActionPerformed(evt); } }); jLabel3.setText("Server ip:"); Severip.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { SeveripActionPerformed(evt); } }); Nhóm – Mạng máy tính K56 Ứng dụng clinet-server jLabel4.setText("Message:"); BtSend.setText("Send"); BtSend.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { BtSendActionPerformed(evt); } }); jLabel5.setText("Tin Nhan#Nguoi Nhan"); jLabel6.setText("Name:"); jScrollPane1.setViewportView(TxpOnlineBoard); jLabel7.setText("Online"); ExitButton.setText("Exit"); ExitButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ExitButtonActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); Nhóm – Mạng máy tính K56 Ứng dụng clinet-server layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) addComponent(jSeparator1) addGroup(layout.createSequentialGroup() addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) addGroup(layout.createSequentialGroup() addGap(17, 17, 17) addComponent(jLabel3) addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) addComponent(Severip, javax.swing.GroupLayout.DEFAULT_SIZE, 143, Short.MAX_VALUE) addGap(30, 30, 30) addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE) addGap(12, 12, 12) addComponent(SeverPort, javax.swing.GroupLayout.PREFERRED_SIZE, 72, javax.swing.GroupLayout.PREFERRED_SIZE)) addGroup(layout.createSequentialGroup() addContainerGap() addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) addComponent(jScrollPane2) addGroup(layout.createSequentialGroup() addComponent(jLabel4) addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) Nhóm – Mạng máy tính K56 Ứng dụng clinet-server addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) addGroup(layout.createSequentialGroup() addComponent(jLabel5) addGap(147, 147, 147)) addComponent(TxtMessage)))))) addGap(34, 34, 34) addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 81, javax.swing.GroupLayout.PREFERRED_SIZE) addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() addComponent(btStart) addGap(8, 8, 8)) addComponent(BtSend) addGroup(layout.createSequentialGroup() addGap(20, 20, 20) addComponent(jLabel7, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE))) addGap(14, 14, 14)) addGroup(layout.createSequentialGroup() addContainerGap() addComponent(jLabel1) addGap(139, 139, 139) addComponent(jLabel6, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE) addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) Nhóm – Mạng máy tính K56 Ứng dụng clinet-server addComponent(txtName, javax.swing.GroupLayout.PREFERRED_SIZE, 72, javax.swing.GroupLayout.PREFERRED_SIZE) addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) addComponent(ExitButton) addGap(22, 22, 22)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) addGroup(layout.createSequentialGroup() addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) addGroup(layout.createSequentialGroup() addGap(9, 9, 9) addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) addComponent(jLabel1) addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE ) addComponent(jLabel6) addComponent(txtName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))) addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() addContainerGap() addComponent(ExitButton))) Nhóm – Mạng máy tính K56 Ứng dụng clinet-server addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE ) addComponent(jLabel2) addComponent(SeverPort, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) addComponent(btStart) addComponent(jLabel3) addComponent(Severip, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) addGap(18, 18, 18) addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) addGroup(layout.createSequentialGroup() addComponent(jLabel7) addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 187, javax.swing.GroupLayout.PREFERRED_SIZE)) Nhóm – Mạng máy tính K56 Ứng dụng clinet-server addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 217, javax.swing.GroupLayout.PREFERRED_SIZE)) addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE ) addComponent(jLabel4) addComponent(TxtMessage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) addComponent(BtSend)) addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) addComponent(jLabel5) addContainerGap(25, Short.MAX_VALUE)) ); pack(); }// private void SeverPortActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: } private void btStartActionPerformed(java.awt.event.ActionEvent evt) { String Serverip = this.Severip.getText(); int Port = Integer.parseInt(this.SeverPort.getText()); Nhóm – Mạng máy tính K56 Ứng dụng clinet-server Client = new Clieng(Serverip, Port,this.txpMessageBoard,this.TxpOnlineBoard,this.txtName); } private void SeveripActionPerformed(java.awt.event.ActionEvent evt) { } private void BtSendActionPerformed(java.awt.event.ActionEvent evt) { String msg = this.TxtMessage.getText(); Client.send(msg); this.TxtMessage.setText(""); } private void ExitButtonActionPerformed(java.awt.event.ActionEvent evt) { Client.send("Exit#asdasdwqe"); this.TxpOnlineBoard.setText(""); System.exit(0); Client.close(); } /** * @param args the command line arguments Nhóm – Mạng máy tính K56 Ứng dụng clinet-server */ public static void main(String args[]) { /* Set the Nimbus look and feel */ // /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html */ try { for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { javax.swing.UIManager.setLookAndFeel(info.getClassName()); break; } } } catch (ClassNotFoundException ex) { java.util.logging.Logger.getLogger(ClientFrame.class.getName()).log(java.util.logging.L evel.SEVERE, null, ex); } catch (InstantiationException ex) { java.util.logging.Logger.getLogger(ClientFrame.class.getName()).log(java.util.logging.L evel.SEVERE, null, ex); } catch (IllegalAccessException ex) { java.util.logging.Logger.getLogger(ClientFrame.class.getName()).log(java.util.logging.L evel.SEVERE, null, ex); Nhóm – Mạng máy tính K56 Ứng dụng clinet-server } catch (javax.swing.UnsupportedLookAndFeelException ex) { java.util.logging.Logger.getLogger(ClientFrame.class.getName()).log(java.util.logging.L evel.SEVERE, null, ex); } // // // // /* Create and display the form */ java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new ClientFrame().setVisible(true); } }); } // Variables declaration - not modify private javax.swing.JButton BtSend; private javax.swing.JButton ExitButton; private javax.swing.JTextField SeverPort; private javax.swing.JTextField Severip; private javax.swing.JTextPane TxpOnlineBoard; private javax.swing.JTextField TxtMessage; private javax.swing.JButton btStart; private javax.swing.JLabel jLabel1; Nhóm – Mạng máy tính K56 Ứng dụng clinet-server private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel6; private javax.swing.JLabel jLabel7; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JSeparator jSeparator1; private javax.swing.JTextPane txpMessageBoard; private javax.swing.JTextField txtName; // End of variables declaration } Chương trình bên Messger 3.1 Messeger class (messeger class) package Message; import java.io.Serializable; /** * Nhóm – Mạng máy tính K56 Ứng dụng clinet-server * @author Admin */ public class Message implements Serializable{ private static final long serialVersionUID = 1L; public String sender; public String msg; public String recipient; public Message(String sender,String msg,String recipient){ this.sender = sender; this.msg = msg; this.recipient = recipient; } public String toString(){ return "{sender='"+sender+"', message='"+msg+"', recipient='"+recipient+"'}"; } } Nhóm – Mạng máy tính K56