Báo cáo đồ án cơ sở mạng

55 469 2
Báo cáo đồ án cơ sở mạng

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA CÔNG NGHỆ THÔNG TIN *** ĐỒ ÁN CƠ SỞ NGÀNH MẠNG NGUYÊN LÝ HỆ ĐIỀU HÀNH: ĐỀ TÀI NĂM TRIẾT GIA ĂN TỐI LẬP TRÌNH MẠNG: ĐỀ TÀI SỬ DỤNG KỸ THUẬT SOCKET TRONG JAVA ĐỂ XÂY DỰNG CHƯƠNG TRÌNH CHAT QUA MẠNG LAN  Đà Nẵng, ngày 01 tháng 11 năm 2018 Báo cáo đồ án MỤC LỤC MỞ ĐẦU PHẦN I: NGUYÊN LÝ HỆ ĐIỀU HÀNH CHƯƠNG I: PHÂN TÍCH BÀI TỐN I Mô tả II Mô tả vấn đề III Yêu cầu toán CHƯƠNG II: CƠ SỞ LÝ THUYẾT I Tiến trình (proccess) II Tài nguyên găng đoạn găng 10 III Giải pháp Semaphore 12 IV Deadlock 12 CHƯƠNG III: GIẢI QUYẾT BÀI TOÁN 15 I Quản lý vùng găng 15 II Giải pháp xử lý deadlock 17 III Chương trình 17 CHƯƠNG IV: KẾT QUẢ CHƯƠNG TRÌNH 20 I II Chương trình tạm dừng 20 Chương trình reset 20 KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 21 I II Đạt 21 Chưa đạt 21 PHẦN II: LẬP TRÌNH MẠNG 22 CHƯƠNG I PHÂN TÍCH BÀI TOÁN 22 Bối cảnh, lý thực đề tài 22 Cơ sở lập trình 23 CHƯƠNG CƠ SỞ LÝ THUYẾT 24 Yêu cầu đề tài 24 Giới thiệu mơ hình Client/Server 24 Giới thiệu giao thức IP/TCP 25 Giới thiệu gói phục vụ giao thức IP/TCP 26 GVHD: Trần Hồ Thủy Tiên Page Báo cáo đồ án CHƯƠNG : PHÂN TÍCH THIẾT KẾ CHƯƠNG TRÌNH 28 Phân tích yêu cầu 28 Phân tích chức 28 Phân tích thiết kế chương trình 29 CHƯƠNG : KẾT QUẢ CHƯƠNG TRÌNH 30 Môi trường triển khai 30 Kết thực 30 KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 33 Đạt 33 I II Chưa đạt hướng phát triển 33 KẾT LUẬN CHUNG 34 TÀI LIỆU THAM KHẢO 35 PHỤ LỤC 36 Phần hệ điều hành 36 Phần lập trình mạng 43 2.1 Cấu trúc chương trình 43 2.2 Chương trình Server 43 2.3 Chương trình Client 47 GVHD: Trần Hồ Thủy Tiên Page Báo cáo đồ án DANH SÁCH HÌNH VẼ Hình Mơ tả tốn năm triết gia ăn tối Hình Mơ tả tình trạng deadlocked Hình Thực tiến trình tương ứng triết gia Hình Chương trình chay tạm dừng Hình Chương trình reset Hình Mơ hình Client/Server Hình Giao diện Máy Chủ Hình Giao diện nút “Start Server” Hình Giao diện đăng nhập Client Hình 10 Giao diện chat Client Hình 11 Giao diện Gửi File Client Hình 12 Cấu trúc chương trình lập trình mạng GVHD: Trần Hồ Thủy Tiên Page Báo cáo đồ án DANH SÁCH TỪ VIẾT TẮT WAN Wide Area Network LAN Local Area Network IP Internet Protocol TCP Transmission Control Protocol CS Critical Section API Application Programming Interface GVHD: Trần Hồ Thủy Tiên Page Báo cáo đồ án MỞ ĐẦU Nếu khơng có phần mềm, máy tính thiết bị điện tử thông thường Với hỗ trợ phần mềm, máy tính lưu trữ, xử lý thơng tin người sử dụng gọi lại thông tin Phần mềm máy tính chia thành nhiều loại: chương trình hệ thơng, quản lý hoạt động máy tính Chương trình ứng dụng, giải vấn đề liên quan đến việc sử dụng khai thác máy tính người sử dụng Hệ điều hành thuộc nhóm chương trình hệ thống chương trình hệ thơng quan trọng máy tính người sử dụng Hệ điều hành điều khiển tất tài nguyên máy tính cung cấp mơi trường thuận lợi để chương trình ứng dụng người sử dụng viết chạy máy tính Một máy tính đại bao gồm: nhiều processor, nhớ chính, clocks, đĩa, giao diện mạng, thiết bị vào/ra khác Tất tạo thành hệ thống phức tạp Để viết chương trình để theo dõi tất thành phần máy tính sử dụng chúng cách hiệu quả, người lập trình phải biết processor thực chương trình nào, nhớ lưu trữ thông tin nào, thiết bị đĩa làm việc (ghi/đọc) nào, lỗi xảy đọc block đĩa, cơng việc khó khăn q khó người lập trình Nhưng may cho người lập trình ứng dụng người sử dụng công việc hệ điều hành hỗ trợ nên họ khơng cần quan tâm đến Vì vậy, cần tìm hiểu kiến thức nâng cao hệ điều hành, nắm bắt nguyên tắc hoạt động Qua đó, có nhìn tổng quan liên quan đến việc thiết kế cài đặt chức hệ điều hành đề hệ điều hành đạt mục tiêu: Giúp người sử dụng khai thác máy tính dễ dàng chương trình người sử dụng chạy máy tính Nguyên lý hệ điều hành học phần quan trọng bắt buộc tất sinh viên chuyên ngành công nghệ thông tin Nguyên lý hệ điều hành cung cấp cho sinh viên hoạt động hệ điều hành máy tính Hệ điều hành xem thành phần trung gian cầu nối cho giao tiếp người sử dụng máy tính Thơng qua hệ điều hành người sử dụng dễ đàng làm việc khai thác hiệu thiết bị phần cứng máy tính, quản lý phần mềm ứng dụng Người sử dụng cần thao tác lệnh, kiện chờ tiến trình hệ điều hành thực "Bài toán năm triết gia ăn tối" (Dining Philosophers), toán kinh điển tương tranh chia sẻ tài nguyên Việc nghiên cứu toán cho hiểu rõ khía cạnh hệ điều hành GVHD: Trần Hồ Thủy Tiên Page Báo cáo đồ án Về phần đồ án lập trình mạng, thấy mạng Internet phát triển vũ bão, việc chuyển thông tin, liệu qua mạng Internet ưu tiên hàng đầu nghành công nghệ thơng tin Với việc muốn tìm hiểu sâu cách giao tiếp client với thông qua server củng bố lập trình mạng lý thuyết nên em chọn đề tài “Sử dụng kỹ thuật socket java để xây dựng chương trình chat qua mạng LAN” Đề tài sâu tìm hiểu kết nối socket mơ hình Client-Server giúp em nắm kiến thức lý thuyết mơn lập trình mạng Qua đồ án lần này, em xin cảm ơn hướng dẫn tận tình Trần Hồ Thủy Tiên giúp em hoàn thành đề tài Mong q thầy góp ý để em tích lũy kinh nghiệm cho đồ án Sinh viên thực Nguyễn Tiến Dũng GVHD: Trần Hồ Thủy Tiên Page Báo cáo đồ án PHẦN I: NGUYÊN LÝ HỆ ĐIỀU HÀNH CHƯƠNG I: PHÂN TÍCH BÀI TỐN I Mơ tả Viết chương trình giải tốn “Năm triết gia ăn tối” Chương trình tạo năm q trình mơ hoạt động năm triết gia Sử dụng Semaphore để đồng hoạt động năm triết gia II Mô tả vấn đề Đây toán cổ điển hệ điều hành Bài toán bữa tối triết gia đưa nhà toán học E W Dijkstra Bài toán mơ tả sau : Có năm triết gia ngơi ăn tối quanh bàn tròn, trước mặt người có đĩa thức ăn, triết gia có muỗng Hình Mơ tả toán năm triết gia ăn tối Khi triết gia suy nghĩ, ông ta không giao tiếp với triết gia khác Thỉnh thoảng, triết gia cảm thấy đói cố gắng chọn hai đũa gần (hai đũa nằm ông ta với hai láng giềng trái phải) Một triết gia lấy đũa thời điểm Chú ý, ông ta lấy đũa mà dùng người láng giềng Khi triết gia đói có hai đũa lúc, ơng ta ăn mà không đặt đũa xuống Khi triết gia ăn xong, ông ta đặt đũa xuống bắt đầu suy nghĩ tiếp GVHD: Trần Hồ Thủy Tiên Page Báo cáo đồ án Đói : triết gia chết đói ơng ta khơng có cách để ăn Tắc nghẽn : triết gia phải đợi lẫn nên khơng có ăn III Yêu cầu toán Phải đặt thuật toán cho triết gia bị đói ơng ta ăn đảm bảo khơng có triết gia bị chết đói Bài tốn đặt vấn đề “đồng tiến trình”, giải vấn đè tắc nghẽn xảy Một giải pháp đơn giản thể đũa biến semaphore Một triết gia cố gắng chiếm lấy đũa cách thực thi thao tác wait biến semaphore đó, triết gia đặt hai đũa xuống cách thực thi thao tác signal biến semaphore tương ứng Thuật toán đưa Semaphore GVHD: Trần Hồ Thủy Tiên Page Báo cáo đồ án CHƯƠNG II: CƠ SỞ LÝ THUYẾT I Tiến trình (proccess) Khái niệm Tiến trình phận chương trình thực hiện, đơn vị thực tiến trình processer Vì tiến trình phận chương trình nên tương tự chương trình, tiến trình sở hữu trỏ lệnh, trỏ stack, tập ghi, khơng gian địa nhớ tất thơng tin cần thiết khác đề tiến trình có thê hoạt động Định nghĩa tiến trình Định nghĩa Saltzer: Tiến trình chương trình processor logic thực Định nghĩa Horning & Rendell: Tiến trình trình chuyển từ trạng thái sang trạng thái khác tác động hàm hành động, xuất phát từ trạng thái ban đầu Các loại tiến trình Các tiến trình hệ thơng chia thành hai loại: tiến trình tiến trình song song Tiến trình tiến trình mà điểm khởi tạo điểm kết thúc tiến trình trước Tiến trình song song tiến trình mà điểm khởi tạo tiến trình nằm thân tiến trình khác, tức khởi tạo tiến trình tiến trình trước chưa kết thúc Tiến trình xuất hệ điều hành đơn nhiệm hệ điều hành MSDOS Các tiến trình song song xuất hệ điều hành đa nhiệm GVHD: Trần Hồ Thủy Tiên Page Báo cáo đồ án mt.addImage(imgs[1], 1); imgs[2] = controller.getImage(controller.getDocumentBase(), "images\\gotright.gif"); mt.addImage(imgs[2], 2); imgs[3] = controller.getImage(controller.getDocumentBase(), "images\\eating.gif"); mt.addImage(imgs[3], 3); imgs[4] = controller.getImage(controller.getDocumentBase(), "images\\gotleft.gif"); mt.addImage(imgs[4], 4); try { mt.waitForID(0); mt.waitForID(1); mt.waitForID(2); mt.waitForID(3); mt.waitForID(4); } catch (java.lang.InterruptedException e) { System.out.println("Couldn't load one of the images"); } initPlacing(); } void backdrop() { Dimension d = getSize(); if ((offscreen == null) || (d.width != offscreensize.width) || (d.height != offscreensize.height)) { offscreen = createImage(d.width, d.height); offscreensize = d; offgraphics = offscreen.getGraphics(); offgraphics.setFont(new Font("Helvetica", Font.BOLD, 18)); Graphics2D g2D = (Graphics2D) offgraphics; g2D.translate(d.width / 2, d.height / 2); } offgraphics.setColor(Color.WHITE); offgraphics.fillRect(-d.width / 2, -d.height / 2, d.width, d.height); } void drawtable() { offgraphics.setColor(Color.red); offgraphics.fillOval(-80, -80, 160, 160); offgraphics.setColor(Color.black); for (int i = 0; i < NUMPHILS; i++) { if (untable[i]) { offgraphics.setColor(Color.black); offgraphics.fillRect((int) chopX[i], (int) chopY[i], 5, 30); } offgraphics.setColor(Color.black); offgraphics.drawString(String.valueOf(i), (int) disX[i], (int) disY[i]); offgraphics.setColor(Color.WHITE); offgraphics.fillOval((int) disX[i], (int) disY[i], 25, 25); } } GVHD: Trần Hồ Thủy Tiên Page 40 Báo cáo đồ án public void paint(Graphics g) { update(g); } public void update(Graphics g) { backdrop(); for (int i = 0; i < NUMPHILS; i++) { philPaint(offgraphics, i); if (state[i] == EATING) Message += "Philosopher " + i + " EATING" + "\n"; } controller.txtMes.setText(Message); drawtable(); if (deadlocked()) { offgraphics.setColor(Color.black); offgraphics.drawString("DEADLOCKED", -60, 0); } g.drawImage(offscreen, 0, 0, null); } void philPaint(Graphics g, int i) { Graphics2D g2D = (Graphics2D) g; g2D.drawImage(imgs[state[i]], philPlace[i], this); } synchronized void setPhil(int id, int s) throws java.lang.InterruptedException { while (frozen) wait(); state[id] = s; repaint(); } synchronized void freeze() { frozen = true; } synchronized void thaw() { frozen = false; notifyAll(); Message = ""; } synchronized void setChopstick(int id, boolean taken) { untable[id] = !taken; } boolean deadlocked() { int i = 0; while (i < NUMPHILS && state[i] == GOTRIGHT) ++i; return i == NUMPHILS; } GVHD: Trần Hồ Thủy Tiên Page 41 Báo cáo đồ án void initPlacing() { double radius = 130.0; double philWidth = imgs[0].getWidth(this); double philHeight = imgs[0].getHeight(this); double radians; for (int i = 0; i < NUMPHILS; i++) { philPlace[i] = new AffineTransform(); radians = 2.0 * Math.PI * (1.0 - (double) i / (double) NUMPHILS); philPlace[i].rotate(radians); philPlace[i].translate(0, -radius); philPlace[i].translate(-philWidth / 2, -philHeight / 2); } radius = 55; for (int i = 0; i < NUMPHILS; i++) { radians = (double) i * 2.0 * Math.PI / (double) NUMPHILS + Math.PI / (double) NUMPHILS; chopX[i] = -Math.sin(radians) * radius; chopY[i] = -Math.cos(radians) * radius; untable[i] = true; } radius = 65; for (int i = 0; i < NUMPHILS; i++) { radians = (double) i * 2.0 * Math.PI / (double) NUMPHILS; disX[i] = -Math.sin(radians) * radius - 12; disY[i] = -Math.cos(radians) * radius - 12; } } } GVHD: Trần Hồ Thủy Tiên Page 42 Báo cáo đồ án Phần lập trình mạng 2.1 Cấu trúc chương trình Hình 12 Cấu trúc chương trình lập trình mạng 2.2 Chương trình Server public MainForm() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 549, 472); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); lblPort = new JLabel("Port"); lblPort.setFont(new Font("Tahoma", Font.PLAIN, 15)); lblPort.setBounds(37, 28, 43, 16); contentPane.add(lblPort); textField = new JTextField(); textField.setBounds(92, 26, 127, 22); contentPane.add(textField); textField.setColumns(10); GVHD: Trần Hồ Thủy Tiên Page 43 Báo cáo đồ án btnStartServer = new JButton("Start Server"); btnStartServer.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { btnStartServerActionPerformed(evt); } }); btnStartServer.setBackground(Color.GREEN); btnStartServer.setBounds(250, 25, 103, 25); contentPane.add(btnStartServer); btnStopServer = new JButton("Stop Server"); btnStopServer.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { btnStopServerActionPerformed(evt); } }); btnStopServer.setBackground(Color.RED); btnStopServer.setBounds(381, 25, 110, 25); contentPane.add(btnStopServer); JScrollPane scrollPane = new JScrollPane(); scrollPane.setBounds(34, 74, 457, 321); contentPane.add(scrollPane); textArea = new JTextArea(); textArea.setForeground(Color.WHITE); textArea.setBackground(Color.DARK_GRAY); scrollPane.setViewportView(textArea); textArea.setEditable(false); } private void btnStartServerActionPerformed(ActionEvent evt) { int port = Integer.parseInt(textField.getText()); serverThread = new ServerThread(port, this); t = new Thread(serverThread); t.start(); new Thread(new OnlineListThread(this)).start(); btnStartServer.setEnabled(false); btnStopServer.setEnabled(true); } private void btnStopServerActionPerformed(ActionEvent evt) { int confirm = JOptionPane.showConfirmDialog(null, "Stop server?"); if (confirm == 0) { serverThread.stop(); } } GVHD: Trần Hồ Thủy Tiên Page 44 Báo cáo đồ án package ChatServer; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; public class OnlineListThread implements Runnable { MainForm main; public OnlineListThread(MainForm main) { this.main = main; } @Override public void run() { try { while (!Thread.interrupted()) { String msg = ""; for (int i = 0; i < main.clientList.size(); i++) { msg = msg + " " + main.clientList.elementAt(i); } for (int i = 0; i < main.socketList.size(); i++) { Socket socket = (Socket) main.socketList.elementAt(i); DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); if (msg.length() > 0) { dos.writeUTF("CMD_ONLINE " + msg); } } Thread.sleep(1900); } } catch (InterruptedException e) { main.appendMessage("[Server]: " + e.getMessage()); } catch (IOException e) { main.appendMessage("[Server]: " + e.getMessage()); } } } GVHD: Trần Hồ Thủy Tiên Page 45 Báo cáo đồ án package ChatServer; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class ServerThread implements Runnable { ServerSocket server; MainForm main; boolean connected = true; public ServerThread(int port, MainForm main) { main.appendMessage("[Server]: Server khởi động port " + port); try { this.main = main; server = new ServerSocket(port); main.appendMessage("[Server]: Server khởi động!"); } catch (IOException e) { main.appendMessage("[Server]: " + e.getMessage()); } } @Override public void run() { try { while (connected) { Socket socket = server.accept(); new Thread(new SocketThread(socket, main)).start(); } } catch (IOException e) { main.appendMessage("[Server]: " + e.getMessage()); } } public void stop() { try { server.close(); connected = false; System.exit(0); } catch (IOException e) { main.appendMessage("[Server]: " + e.getMessage()); } } } GVHD: Trần Hồ Thủy Tiên Page 46 Báo cáo đồ án 2.3 Chương trình Client private void initComponents() { jLabel1 = new javax.swing.JLabel(); jLabel1.setFont(new Font("Tahoma", Font.PLAIN, 15)); txtUsername = new javax.swing.JTextField(); jLabel2 = new javax.swing.JLabel(); jLabel2.setFont(new Font("Tahoma", Font.PLAIN, 15)); txtHost = new javax.swing.JTextField(); jLabel3 = new javax.swing.JLabel(); jLabel3.setFont(new Font("Tahoma", Font.PLAIN, 15)); txtPort = new javax.swing.JTextField(); jButton1 = new javax.swing.JButton(); jLabel5 = new javax.swing.JLabel(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setTitle("Login"); setBackground(new java.awt.Color(255, 255, 255)); setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); jLabel1.setText("Username"); txtUsername.setFont(new java.awt.Font("Tahoma", 0, 12)); txtUsername.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { txtUsernameActionPerformed(evt); } }); jLabel2.setText("Địa IP"); txtHost.setFont(new java.awt.Font("Tahoma", 0, 12)); txtHost.setText(""); jLabel3.setText("Port"); txtPort.setFont(new java.awt.Font("Tahoma", 0, 12)); txtPort.setText(""); jButton1.setBackground(new java.awt.Color(0, 51, 204)); jButton1.setFont(new java.awt.Font("Arial", 1, 18)); jButton1.setForeground(new java.awt.Color(255, 255, 255)); jButton1.setText("LOGIN"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); GVHD: Trần Hồ Thủy Tiên Page 47 Báo cáo đồ án private void initComponents() { jScrollPane1 = new javax.swing.JScrollPane(); jTextPane1 = new javax.swing.JTextPane(); jTextField1 = new javax.swing.JTextField(); jButton1 = new javax.swing.JButton(); jScrollPane3 = new javax.swing.JScrollPane(); txtpane2 = new javax.swing.JTextPane(); jLabel1 = new javax.swing.JLabel(); jLabel1.setForeground(Color.BLUE); jLabel3 = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel(); jMenuBar1 = new javax.swing.JMenuBar(); jMenu3 = new javax.swing.JMenu(); sendFileMenu = new javax.swing.JMenuItem(); jMenuItem3 = new javax.swing.JMenuItem(); jMenu2 = new javax.swing.JMenu(); LogoutMenu = new javax.swing.JMenuItem(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setBackground(new java.awt.Color(204, 255, 255)); jTextPane1.setFont(new java.awt.Font("Arial", 0, 11)); // NOI18N jScrollPane1.setViewportView(jTextPane1); jTextField1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jTextField1ActionPerformed(evt); } }); jButton1.setBackground(new java.awt.Color(255, 255, 255)); jButton1.setFont(new java.awt.Font("Tahoma", 1, 15)); // NOI18N jButton1.setForeground(new java.awt.Color(0, 51, 255)); jButton1.setText("SEND"); jButton1.setEnabled(false); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); txtpane2.setFont(new java.awt.Font("Tahoma", 1, 9)); // NOI18N txtpane2.setForeground(new java.awt.Color(120, 14, 3)); txtpane2.setAutoscrolls(false); txtpane2.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); jScrollPane3.setViewportView(txtpane2); jLabel1.setFont(new Font("Arial", Font.BOLD, 13)); // NOI18N jLabel1.setText("Danh sách bạn bè"); GVHD: Trần Hồ Thủy Tiên Page 48 Báo cáo đồ án jLabel2.setBackground(new java.awt.Color(204, 204, 204)); jLabel2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Chat/images/chat.png"))); // NOI18N jMenu3.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Chat/images/sharing.png"))); // NOI18N jMenu3.setText("Chia Sẻ File"); jMenu3.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jMenu3ActionPerformed(evt); } }); sendFileMenu.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Chat/images/sendfile.png"))); // NOI18N sendFileMenu.setText("Gửi File"); sendFileMenu.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { sendFileMenuActionPerformed(evt); } }); jMenu3.add(sendFileMenu); jMenuItem3.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Chat/images/process.png"))); // NOI18N jMenuItem3.setText("Tải Xuống"); jMenuItem3.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jMenuItem3ActionPerformed(evt); } }); jMenu3.add(jMenuItem3); jMenuBar1.add(jMenu3); jMenu2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Chat/images/check.png"))); // NOI18N jMenu2.setText("Tài Khoản"); LogoutMenu.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Chat/images/loggoff.png"))); // NOI18N LogoutMenu.setText("Đăng xuất"); jMenuBar1.add(jMenu2); GVHD: Trần Hồ Thủy Tiên Page 49 Báo cáo đồ án @Override public void run() { try { while (!Thread.currentThread().isInterrupted()) { String data = dis.readUTF(); st = new StringTokenizer(data); String CMD = st.nextToken(); switch (CMD) { case "CMD_MESSAGE": String msg = ""; String frm = st.nextToken(); while (st.hasMoreTokens()) { msg = msg + " " + st.nextToken(); } main.appendMessage(msg, frm, Color.MAGENTA, Color.BLUE); break; case "CMD_ONLINE": Vector online = new Vector(); while (st.hasMoreTokens()) { String list = st.nextToken(); if (!list.equalsIgnoreCase(main.username)) { online.add(list); } } main.appendOnlineList(online); break; case "CMD_FILE_XD": String sender = st.nextToken(); String receiver = st.nextToken(); String fname = st.nextToken(); int confirm = JOptionPane.showConfirmDialog(main, sender + " gửi đến file: " + fname + "\nBạn có muốn nhận file không?"); if (confirm == 0) { main.openFolder(); try { dos = new DataOutputStream(socket.getOutputStream()); String format = "CMD_SEND_FILE_ACCEPT " + sender + " Chấp nhận"; dos.writeUTF(format); Socket fSoc = new Socket(main.getMyHost(), main.getMyPort()); DataOutputStream fdos = new DataOutputStream(fSoc.getOutputStream()); fdos.writeUTF("CMD_SHARINGSOCKET " + main.getMyUsername()); new Thread(new ReceivingFileThread(fSoc, main)).start(); } catch (IOException e) { } GVHD: Trần Hồ Thủy Tiên Page 50 Báo cáo đồ án @Override public void run() { try { while (!Thread.currentThread().isInterrupted()) { String data = dis.readUTF(); st = new StringTokenizer(data); String cmd = st.nextToken(); switch (cmd) { case "CMD_RECEIVE_FILE_ERROR": String msg = ""; while (st.hasMoreTokens()) { msg = msg + " " + st.nextToken(); } form.updateAttachment(false); JOptionPane.showMessageDialog(SendFile.this, msg, "Lỗi", JOptionPane.ERROR_MESSAGE); this.closeMe(); break; case "CMD_RECEIVE_FILE_ACCEPT": new Thread(new SendingFileThread(socket, file, sendTo, myusername, SendFile.this)).start(); break; case "CMD_SENDFILEERROR": String emsg = ""; while (st.hasMoreTokens()) { emsg = emsg + " " + st.nextToken(); } JOptionPane.showMessageDialog(SendFile.this, emsg, "Lỗi", JOptionPane.ERROR_MESSAGE); form.updateAttachment(false); form.disableGUI(false); form.updateBtn("Gửi File"); break; case "CMD_SENDFILERESPONSE": String rReceiver = st.nextToken(); String rMsg = ""; while (st.hasMoreTokens()) { rMsg = rMsg + " " + st.nextToken(); } form.updateAttachment(false); JOptionPane.showMessageDialog(SendFile.this, rMsg, "Lỗi", JOptionPane.ERROR_MESSAGE); dispose(); break; } } } catch (IOException e) { } } GVHD: Trần Hồ Thủy Tiên Page 51 Báo cáo đồ án private void initComponents() { jLabel1 = new javax.swing.JLabel(); txtFile = new javax.swing.JTextField(); btnBrowse = new javax.swing.JButton(); jLabel2 = new javax.swing.JLabel(); txtSendTo = new javax.swing.JTextField(); progressbar = new javax.swing.JProgressBar(); btnSendFile = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setTitle("Gửi file "); jLabel1.setText("File gửi"); txtFile.setEditable(false); txtFile.setBackground(new java.awt.Color(255, 255, 255)); txtFile.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); txtFile.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { txtFileActionPerformed(evt); } }); btnBrowse.setText("Chọn file"); btnBrowse.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); btnBrowse.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnBrowseActionPerformed(evt); } }); jLabel2.setText("Người nhận"); progressbar.setStringPainted(true); btnSendFile.setBackground(new java.awt.Color(132, 6, 6)); btnSendFile.setForeground(new java.awt.Color(255, 255, 255)); btnSendFile.setText("Gửi file"); btnSendFile.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnSendFileActionPerformed(evt); } }); GVHD: Trần Hồ Thủy Tiên Page 52 Báo cáo đồ án protected Socket socket; private DataOutputStream dos; protected SendFile form; protected String file; protected String receiver; protected String sender; protected DecimalFormat df = new DecimalFormat("##,#00"); private final int BUFFER_SIZE = 100; public SendingFileThread(Socket soc, String file, String receiver, String sender, SendFile from) { this.socket = soc; this.file = file; this.receiver = receiver; this.sender = sender; this.form = from; } @Override public void run() { try { form.disableGUI(true); dos = new DataOutputStream(socket.getOutputStream()); File filename = new File(file); int len = (int) filename.length(); int filesize = (int) Math.ceil(len / BUFFER_SIZE); String clean_filename = filename.getName(); dos.writeUTF("CMD_SENDFILE " + clean_filename.replace(" ", "_") + " " + filesize + " " + receiver + " " + sender); InputStream input = new FileInputStream(filename); OutputStream output = socket.getOutputStream(); BufferedInputStream bis = new BufferedInputStream(input); byte[] buffer = new byte[BUFFER_SIZE]; int count, percent = 0; while ((count = bis.read(buffer)) > 0) { percent = percent + count; int p = (percent / filesize); form.updateProgress(p); output.write(buffer, 0, count); } form.setMyTitle("Đã gửi file!"); form.updateAttachment(false); JOptionPane.showMessageDialog(form, "File gửi thành công!", "", JOptionPane.INFORMATION_MESSAGE); form.closeThis(); output.flush(); output.close(); } catch (IOException e) { form.updateAttachment(false); } } GVHD: Trần Hồ Thủy Tiên Page 53 Báo cáo đồ án @Override public void run() { try { while(!Thread.currentThread().isInterrupted()){ String data = dis.readUTF(); st = new StringTokenizer(data); String CMD = st.nextToken(); switch(CMD){ case "CMD_SENDFILE": String consignee = null; try { String filename = st.nextToken(); int filesize = Integer.parseInt(st.nextToken()); consignee = st.nextToken(); String path = main.getMyDownloadFolder() + filename; FileOutputStream fos = new FileOutputStream(path); InputStream input = socket.getInputStream(); ProgressMonitorInputStream pmis = new ProgressMonitorInputStream(main, "Downloading file please wait ", input); BufferedInputStream bis = new BufferedInputStream(pmis); byte[] buffer = new byte[BUFFER_SIZE]; int count, percent = 0; while((count = bis.read(buffer)) != -1){ percent = percent + count; int p = (percent / filesize); fos.write(buffer, 0, count); } fos.flush(); fos.close(); JOptionPane.showMessageDialog(null, "File lưu!"); } catch (IOException e) { DataOutputStream eDos = new DataOutputStream(socket.getOutputStream()); eDos.writeUTF("CMD_SENDFILERESPONSE "+ consignee + "Kết nối bị mất, vui lòng thử lại!"); JOptionPane.showMessageDialog(main, e.getMessage(), "Exception", JOptionPane.ERROR_MESSAGE); socket.close(); } break; } } } catch (IOException e) { } } GVHD: Trần Hồ Thủy Tiên Page 54 ... chương trình chat qua mạng LAN”, điều giúp em thực hành để có hội hiểu rõ mạng, lập trình mạng – lĩnh vực lập trình thú vị GVHD: Trần Hồ Thủy Tiên Page 22 Báo cáo đồ án Cơ sở lập trình Ứng dụng... 19 Báo cáo đồ án CHƯƠNG IV: KẾT QUẢ CHƯƠNG TRÌNH I Chương trình tạm dừng Từ kết demo ta có : Hình Chương trình chay tạm dừng II Chương trình reset GVHD: Trần Hồ Thủy Tiên Page 20 Báo cáo đồ án. .. Tiên Page 28 Báo cáo đồ án Phân tích thiết kế chương trình Server Main Form ServerThread Client Login Form Main Form SocketThread ClientThread GVHD: Trần Hồ Thủy Tiên Page 29 Báo cáo đồ án CHƯƠNG

Ngày đăng: 29/01/2019, 07:52

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan