Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 51 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
51
Dung lượng
558,52 KB
Nội dung
ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA CÔNG NGHỆ THÔNG TIN Tel (84-511) 736 949, Fax (84-511) 842 771 Website: itf.ud.edu.vn, E-mail: cntt@edu.ud.vn BÁO CÁO THỰC HÀNH LẬP TRÌNH MẠNG GVHD: SINH VIÊN : LỚP : MSSV: NHÓM: ThS.NGUYỄN VĂN NGUYÊN BÙI TẤN VIỆT 10T2 102152101166 11B ĐÀ NẴNG, 3/2014 Mục Lục Page | LỜI NÓI ĐẦU Lập trình mạng nhiệm vụ quan trong việc phát triển ứng dụng doanh nghiệp Một chương trình mạng viết để chương trình máy tính khác truyền tin với cách hiệu an toàn cho dù chúng cài đặt mạng LAN, WAN hay mạng toàn cầu Internet, điều thành công nhiều hệ thông Java ngơn ngữ lập trình hướng đối tượng thúy với nhiều đặc trưng ưu việt so với ngơn ngữ lập trình hướng đối tượng khác tính độc lập với nền, tính bảo mật,… Java ngơn ngữ từ đời hướng đến lập trình mạng nên việc viết chương trình lập trình mạng Java dễ dàng nhiều so với ngôn ngữ khác Page | Báo cáo thực hành lập trình mạng CHƯƠNG 1: CÁC 2014 BÀI TẬP THỰC HÀNH 1.1 BÀI THỰC HÀNH BUỔI 1.1.1 Bài tập 1.1.1.1 Đề bài: Dùng Java xây dựng chương trình lấy liệu sinh viên từ Access xuất bảng 1.1.1.2 Thuật tốn: B1: Nạp trình điều khiển: Lớp DriverManager chịu trách nhiệm nạp driver tạo kết nối đến csdl: Class.forName(String) Với String "sun.jdbc.odbc.JdbcOdbcDriver" B2: Tạo thông tin kết nối đối tượng Connection: Với Access: Connection = DriverManager.getConnection("jdbc:odbc:testDB"); B3: Tạo đối tượng Statement để thực thi lệnh sql Statement stmt = (java.sql.Statement) con.createStatement(); String sql = "Select * from SinhVien"; ResultSet rs = ((java.sql.Statement) stmt).executeQuery(sql); ResultSetMetaData rsmd = rs.getMetaData(); B4: Lấy số cột bảng tên cột lưu vào mảng Object header[]; B5: Lấy số dòng bảng: B5.1: Biến rows = 0; B5.2: Di chuyển tới hàng bảng, lần di chuyển tăng rows lên Lặp hết dòng B6: Tạo mảng liệu chiều có số hàng số cột bảng Access: Object[][] data = new Object[rows][numberOfColumns]; B7: Di chuyển dòng bảng Access, đọc liệu trường gán liệu vào vị trí tương ứng mảng data Lặp hết dòng B8: Tạo đối tượng JTable để hiển thị liệu data, có nội dung header chứa header[], có trượt JScrollBar gắn vào đối tượng JFrame để hiển thị 1.1.1.3 Cài đặt import import import import import import import import import Page java.sql.Connection; java.sql.DriverManager; java.sql.ResultSet; java.sql.ResultSetMetaData; java.sql.SQLException; java.sql.Statement; javax.swing.JFrame; javax.swing.JScrollPane; javax.swing.JTable; public class Database { public static void main(String arg[]) { Object header[]; Object data[][]; int rows, i, j; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection = DriverManager.getConnection("jdbc:odbc:testDB"); Statement stmt = (java.sql.Statement) con.createStatement(); String sql = "Select * from SinhVien"; ResultSet rs = ((java.sql.Statement) stmt).executeQuery(sql); ResultSetMetaData rsmd = rs.getMetaData(); int numberOfColumns = rsmd.getColumnCount(); header = new Object[numberOfColumns]; for (j = 1; j 0) { return false; } } if (row == 0) return false; return true; } public boolean KiemTra_DuLieuVao_GiaoVien() { int row = 0, col; for (int i = 0; i < jtData.getRowCount(); i++) { col = KiemTra_BoDuLieu_GiaoVien(i); if (col == headerGV.length - 1) { row++; } else if (col > 0) { return false; } } if (row == 0) return false; return true; } Họ tên: Bùi Tấn Việt – Lớp: 10T2 – Nhóm 11BPage 39 Báo cáo thực hành lập trình mạng 2014 // Kiểm tra liệu thêm vào có đầy đủ ko? public int KiemTra_BoDuLieu_GiaoVien(int row) { int col = 0; String DATE_FORMAT = "dd/MM/yyyy"; for (int i = 1; i < headerGV.length; i++) { if (i == 3) { // Trường ngày sinh try { DateFormat df = new SimpleDateFormat(DATE_FORMAT); df.setLenient(false); df.parse(jtData.getValueAt(row, i).toString()); col++; } catch (Exception e) { } } else { try { if (!jtData.getValueAt(row, i).toString().equals("")) col++; } catch (Exception e) {} } } return col; } public int KiemTra_BoDuLieu_Phong(int row) { int col = 0; for (int i = 1; i < headerP.length; ++i) { try { if (!jtData.getValueAt(row, i).toString().equals("")) col++; } catch (Exception e) {} } return col; } 2.3 TRUYỀN NHẬN DỮ LIỆU GIỮA CLIENT – SERVER 2.3.1 Bên Client 2.3.1.1 Truyền liệu ban đầu qua Server Thuật toán: B1: Truyền tên file qua Server Chờ nhận phản hồi B2: Truyền kích thước file qua Server Chờ nhận phản hồi B4: Mở luồng đọc file B3: Đọc file vào mảng 1024 byte hết: B3.1: Gửi mảng cho Server Chờ phản hồi B4: Đóng luồng đọc file B4: Gửi số giám thị coi thi qua Server Chờ nhận phản hồi B5: Gửi số lần phân công qua Server Chờ nhận phản hồi Cài đặt: Page 40 public void TransData() throws IOException { long sizeFile; fis = new FileInputStream(file); // Gửi tên file qua server dos.writeUTF(file.getName()); dis.read(); Print_Debug("Tên file: " + file.getName()); // Gửi kích thước file sizeFile = file.length(); dos.writeLong(sizeFile); dis.read(); Print_Debug("Kích thước file: " + sizeFile); int x; x = fis.read(part); // Gửi liệu while (x > -1) { dos.write(part); dis.read(); x = fis.read(part); } fis.close(); // Gửi số giám thị coi thi dos.writeInt(soGiamThi_CoiThi); dis.read(); Print_Debug("Gửi số lần phân công"); GuiSoLan(); } // Hoàn thành việc gửi Print_Debug("Đã hoàn thành việc gửi"); Print_Debug(" "); public void GuiSoLan() throws IOException { RandomAccessFile rf; try { rf = new RandomAccessFile("số lần phân công.txt", "r"); soLanPhanCong = rf.readInt(); } catch (FileNotFoundException e) { soLanPhanCong = 0; } catch (IOException e) { soLanPhanCong = 0; } Print_Debug("Số lần phân công: " + soLanPhanCong); dos.writeInt(soLanPhanCong); dis.read(); } 2.3.1.2 Nhận liệu từ Server Thuật toán: B1: Nhận tên file Gửi xác nhận Họ tên: Bùi Tấn Việt – Lớp: 10T2 – Nhóm 11BPage 41 Báo cáo thực hành lập trình mạng B2: Tạo file với tên file nhận Mở luồng ghi B3: Nhận kích thước file Gửi xác nhận B4: Lặp chưa nhận đủ số byte file: Đọc liệu vào mảng byte 1024 phần tử B4.1: Nếu số byte lại < 1024: B4.1.1: Chỉ nhận số lượng byte lại từ luồng vào B4.1.2: Ghi vào file số byte lại B4.2: Ngược lại: B4.2.1: Nhận đủ số byte mảng từ luồng vào B4.2.2: Ghi vào file số byte vừa nhận B4.3: Gửi xác nhận B5: Đóng luồng ghi file Cài đặt: public void ReceiveFile() throws IOException { long remainSize; String nameFile; int byteRead = 0; long sizeFile; // Nhận tên file nameFile = dis.readUTF(); dos.write(1); Print_Debug("Tên file kết quả: " + nameFile); // Tạo file fileResult = new File(file.getParent() + "\\" + nameFile); fos = new FileOutputStream(fileResult); Print_Debug("Đường dẫn: " + fileResult.getPath()); // Nhận kích thước file sizeFile = dis.readLong(); dos.write(1); Print_Debug("Kích thước file kết quả: " + sizeFile); // Nhận liệu remainSize = sizeFile; while (remainSize > 0) { if (remainSize < 1024) { byteRead = dis.read(part, 0, (int) remainSize); fos.write(part, 0, (int) remainSize); } else { byteRead = dis.read(part); fos.write(part); } remainSize -= byteRead; dos.write(1); } fos.close(); } Page 42 // Hoàn thành việc nhận Print_Debug("Đã hoàn thành việc nhận"); Print_Debug(" "); 2014 2.3.2 Bên Server 2.3.2.1 Nhận liệu từ Client Thuật toán: B1: Nhận tên file Gửi xác nhận B2: Tạo file với tên file nhận Mở luồng ghi B3: Nhận kích thước file Gửi xác nhận B4: Lặp chưa nhận đủ số byte file: Đọc liệu vào mảng byte 1024 phần tử B4.1: Nếu số byte lại < 1024: B4.1.1: Chỉ nhận số lượng byte lại từ luồng vào B4.1.2: Ghi vào file số byte lại B4.2: Ngược lại: B4.2.1: Nhận đủ số byte mảng từ luồng vào B4.2.2: Ghi vào file số byte vừa nhận B4.3: Gửi xác nhận B5: Đóng luồng ghi file B6: Nhận số giám thị coi thi Gửi xác nhận B7: Nhận số lần phân công Gửi xác nhận Cài đặt: public void ReceiveFile() throws IOException { long remainSize, sizeFile; String nameFile; int byteRead = 0; // Nhận tên file nameFile = dis.readUTF(); dos.write(1); Print_Debug("Tên file: " + nameFile); // Tạo trỏ file file = new File(nameFile); fos = new FileOutputStream(file); // Nhận kích thước file sizeFile = dis.readLong(); dos.write(1); Print_Debug("Kích thước: " + sizeFile); // Nhận liệu remainSize = sizeFile; while (remainSize > 0) { if (remainSize < 1024) { byteRead = dis.read(part, 0, (int) remainSize); fos.write(part, 0, (int) remainSize); } else { byteRead = dis.read(part); fos.write(part); } Họ tên: Bùi Tấn Việt – Lớp: 10T2 – Nhóm 11BPage 43 Báo cáo thực hành lập trình mạng 2014 remainSize -= byteRead; dos.write(1); } fos.close(); // Nhận số giám thị coi thi soGiamThi_CoiThi = dis.readInt(); dos.write(1); Print_Debug("Số cán coi thi: " + soGiamThi_CoiThi); // Đọc số lần phân công soLan_PhanCong = dis.readInt(); dos.write(1); Print_Debug("Số lần phân công: " + soLan_PhanCong); Print_Debug(" "); // Hoàn thành việc nhận Print_Debug("Đã hoàn thành việc nhận"); Print_Debug(" "); } 2.3.2.2 Truyền liệu cho Client Thuật toán: B1: Truyền tên file qua Server Chờ nhận phản hồi B2: Truyền kích thước file qua Server Chờ nhận phản hồi B4: Mở luồng đọc file B3: Đọc file vào mảng 1024 byte hết: B3.1: Gửi mảng cho Server Chờ phản hồi B4: Đóng luồng đọc file Cài đặt: public void TransFile() throws IOException { long sizeFile; fis = new FileInputStream(fileResult); // Gửi tên file dos.writeUTF(fileResult.getName()); dis.read(); Print_Debug("Tên file: " + fileResult.getName()); // Gửi kích thước file sizeFile = fileResult.length(); dos.writeLong(sizeFile); dis.read(); Print_Debug("Kích thước file: " + sizeFile); int x; x = fis.read(part); // Gửi liệu while (x > -1) { dos.write(part); dis.read(); x = fis.read(part); } Page 44 // Hoàn thành việc gửi Print_Debug("Đã hoàn thành việc gửi"); Print_Debug(" "); fis.close(); } 2.4 XỬ LÝ CỦA CLIENT Thuật toán: B1: Gửi liệu lên Server B2: Chờ hồi đáp kết từ Server B3: Nếu có kết quả: B3.1: Nhận liệu trả từ Server B3.2: Ghi số lần phân công vào file B4: Nếu không, thông báo lỗi Cài đặt: public void run() { boolean complete = false; int soLan; try { Print_Debug("Gửi file lên server"); TransData(); // Đọc kết trả Print_Debug("Chờ nhận kết quả"); complete = dis.readBoolean(); Print_Debug(" "); if (complete) { Print_Debug("Server xử lý thành công"); Print_Debug("Nhận kết trả "); ReceiveFile(); Luu_SoLanPhanCong(++soLanPhanCong); } else { Print_Debug("Server xử lý không thành công"); Print_Debug(" "); } Print_Debug("Đóng tất kết nối"); Print_Debug(" "); dis.close(); dos.close(); } catch (IOException e) {} } Họ tên: Bùi Tấn Việt – Lớp: 10T2 – Nhóm 11BPage 45 Báo cáo thực hành lập trình mạng 2.5 XỬ LÝ CỦA SERVER Thuật toán: B1: Nhận file từ Client B2: Lấy liệu vào kiểm tra điều kiện đầu vào B3: Nếu điều kiện đầu vào thỏa: B3.1: Phân công danh sách B3.2: Tạo file kết để lưu B3.4 Ghi vào file B3.5: Thông báo cho Client xử lý xong B3.6: Truyền file cho Client B4: Nếu không: B4.1: Thơng báo cho Client thất bại B5: Đóng luồng vào socket Cài đặt: public void run() { try { Print_Debug("Nhận file từ client"); ReceiveFile(); if (GetData() == true) { PhanCong(); fileResult = new File("Danh sách phân công.xls"); GhiVaoFile(); Print_Debug("Đã xử lý xong"); Print_Debug(" "); dos.writeBoolean(true); Print_Debug("Gửi kết cho client"); TransFile(); } else { dos.writeBoolean(false); Print_Debug("Server xử lý không thành công"); Print_Debug(" "); } Print_Debug("Đóng tất kết nối"); Print_Debug(" "); socket.close(); dis.close(); dos.close(); } catch (IOException | WriteException e) { // TODO Auto-generated catch block e.printStackTrace(); } } Page 46 2014 2.6 THUẬT TOÁN PHÂN CÔNG GIÁO VIÊN COI THI 2.6.1 Lưu danh sách giáo viên phòng thi Danh sách giáo viên lưu vào mảng giamThi = new String[][].Thứ tự cột mảng tương ứng với trường danh sách hàng tương ứng với trường danh sách Danh sách phòng thi lưu vào mảng chiều: phongThi = new String[] Thứ tự tương ứng với phòng thi danh sách 2.6.2 Sắp xếp giám thị Sử dụng mảng chiều Xep_GiamThi = new int[] lưu số xếp Các số ánh xạ đến hàng mảng giamThi để lấy thông tin giám thị - Mảng Xep_GiamThi tính từ phần tử thứ → 2n – (n số phòng thi) giám thị chung phịng Phần tử thứ tự chẵn giám thị phần tử thứ tự lẻ giám thị Số lại từ 2n → m – giám thị hành lang (m số giám thị coi thi) Giả sử có 10 giám thị phịng thi Xét phịng thi, phịng thi có 10 lượt giám thị vào Và lần vào phịng lượt giám thị đồng thời khơng giám thị vào phòng lần nên ta có tối đa tổng cộng lần vào phịng Nếu số giám thị 11 có tối đa lần vào phịng, lần có 12 lượt vào phịng nên suy phải có giám thị vào phịng lần Chính ta quan tâm số giám thị chẵn Nếu số giám thị lẻ ta trừ – giám thị làm giám thị hành lang Từ ta rút ra, số cách xếp giám thị vào phịng tối đa có: Tổng số giám thị / cách Ta xếp giám thị sử dụng phương pháp quay vòng: - Giám thị phòng i + qua phòng i Giám thị phòng chuyển giám thị phòng cuối Giám thị phòng i + qua phòng i Giám thị phòng chuyển giám giám thị phòng kế cuối Giám thị phòng thứ chuyển giám thị phòng cuối Giả sử có phịng 10 giám thị Lần Phòng Phòng Phòng Phòng Phòng AB CD EF GH IJ CF EH GJ IB AD EJ GB ID AF CH GD IF AH CJ EB IH AJ CB ED GF AB CD EF GH IJ Với cách xếp xoay vịng ta đảm bảo khơng giám thị coi phịng lần khơng coi với lần Họ tên: Bùi Tấn Việt – Lớp: 10T2 – Nhóm 11BPage 47 Báo cáo thực hành lập trình mạng Cài đặt: public void PhanCong() { int n, n1, n2; n = soGiamThi; if (soGiamThi % == 1) { n; } if (n > 3) { for (int k = 0; k < soLan_PhanCong; k++) { // Đổi vị trị giám thị // Lưu giám thị n1 = Xep_GiamThi[0]; for (int i = 2; i < n; i += 2) { Xep_GiamThi[i - 2] = Xep_GiamThi[i]; } // Đưa giám thị vào vị trí thứ tính từ cuối Xep_GiamThi[n - 2] = n1; // Đổi vị trí giám thị n1 = Xep_GiamThi[1]; n2 = Xep_GiamThi[3]; for (int i = 5; i < n; i += 2) { Xep_GiamThi[i - 4] = Xep_GiamThi[i]; } // Đưa giám thị vào vị trí thứ tính từ cuối Xep_GiamThi[n - 3] = n1; // Đưa giám thị thứ vào vị trí cuối Xep_GiamThi[n - 1] = n2; } } Page 48 } 2014 2.7 DEMO Họ tên: Bùi Tấn Việt – Lớp: 10T2 – Nhóm 11BPage 49 Báo cáo thực hành lập trình mạng Page 50 2014 Họ tên: Bùi Tấn Việt – Lớp: 10T2 – Nhóm 11BPage 51 ... X.maTran[j][k] += m * X.maTran[i][k]; } } for (i = 0; i < X.n; i++) dinhThuc *= X.maTran[i][i]; dinhThuc *= dau; return dinhThuc; Họ tên: Bùi Tấn Việt – Lớp: 10T2 – Nhóm 11BPage 21 } Báo cáo thực... trận khả nghịch B2.1: dinhThuc = Định thức ma trận B; B2.2: Nếu dinhThuc != 0: B2.2.1: Tạo ma trận C[B.n][B.n]; B2.2.1: Nếu B.n == 1: C[0][0] = (1 / C[0][0]) / dinhThuc; B2.2.2: Ngược lại: B2.2.2.1:... DataOutputStream(socket.getOutputStream()); while (true) { String snhan; try { snhan = inputStream.readUTF(); TinhBieuThuc t = new TinhBieuThuc(); kq = t.TinhToan(snhan); outputStream.writeDouble(kq); } catch (IOException ex)