Bài thực hành ngôn ngữ Java

Chia sẻ: La Thai Nguyen | Ngày: | Loại File: DOC | Số trang:26

2
564
lượt xem
270
download

Bài thực hành ngôn ngữ Java

Mô tả tài liệu
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Sơ lược về ngôn ngữ Java: Làm quen với môi trường IDE (Jubuider 9.0).Cài đặt các chương trình ứng dụng đơn giản về ngôn ngữ java. Mời các bạn cùng tham khảo để nắm được kiến thức về ngôn ngữ Java.

Chủ đề:
Lưu

Nội dung Text: Bài thực hành ngôn ngữ Java

  1. Bài 1 SƠ LƯỢC VỀ NGÔN NGỮ JAVA - Làm quen với môi trường IDE (Jubuider 9.0). - Cài đặt các chương trình ứng dụng đơn giản về ngôn ngữ java. + Các bài tập về cấu trúc điều khiển. + Các bài tập về ngoại lệ. + Các bài tập về lớp. + Các bài tập về I/O. I. 1. Cấu trúc điều khiển. I.1.1. Bài tập mẫu: // khai báo thư viện nhập xuất dữ liệu. import java.io.*; public class DemSo { private String s; // Xây dựng phương thức nhập chuỗi từ bàn phím public void nhap() { try { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Nhap mot chuoi tu ban phim"); s=br.readLine(); }catch(IOException ex) {} } // Xây dựng một hàm có dữ liệu trả về là double để đếm tống các số (0->9) xuất hiện trong chuỗi. public double xuLy() { double dem=0; for(int i=0;i
  2. dem++; } } return dem; } // Xây dựng hàm có giá trị trả về là true và false để kiểm tra giá trị nhập vào có nằm trong khoảng số hay không (ký tự 0->9 trong bảng mã ASCII có giá trị kiểu int là 48 ->57). public boolean kiemTra(int x) { if((x>47)&&(x
  3. case '4':dem4++; break; case '5':dem5++; break; case '6':dem6++; break; case '7':dem7++; break; case '8':dem8++; break; case '9':dem9++; break; } } System.out.println("So lan xuat hien so 0 co trong chuoi la: \t"+ dem0); System.out.println("So lan xuat hien so 1 co trong chuoi la: \t"+ dem1); System.out.println("So lan xuat hien so 2 co trong chuoi la: \t"+ dem2); System.out.println("So lan xuat hien so 3 co trong chuoi la: \t"+ dem3); System.out.println("So lan xuat hien so 4 co trong chuoi la: \t"+ dem4); System.out.println("So lan xuat hien so 5 co trong chuoi la: \t"+ dem5); System.out.println("So lan xuat hien so 6 co trong chuoi la: \t"+ dem6); System.out.println("So lan xuat hien so 7 co trong chuoi la: \t"+ dem7); System.out.println("So lan xuat hien so 8 co trong chuoi la: \t"+ dem8); System.out.println("So lan xuat hien so 9 co trong chuoi la: \t"+ dem9); } // Xây dựng hàm main để thực thi các phương thức, hàm có trong lớp public static void main(String[]args) throws IOException { // Biến dc thuộc kiểu DemSo để gọi đến các phương thức, thuộc tính có trong lớp. DemSo dc = new DemSo(); dc.nhap(); System.out.println("TONG CAC SO XUAT HIEN TRONG CHUOI LA \t"+ dc.xuLy()); dc.xuLyCT(); } } I.1.2. Bài tập: Câu 1: Tính tổng số chẵn, lẻ. Ví dụ: Khi nhập vào số 6 thì tổng lẻ là 1+3+5=9, Tổng chẵn là 2+ 4+6=12. Câu 2: In ra 15 số Fibonacci đầu tiên ( Công thức của Fibonacci fib(0) = 0;fib(1) = 1; fib(n) = fib(n-2) + fib(n-1); n>=2 ). Câu 3. Nhập vào một số nguyên (n) sau đó in ra các số nguyên tố trong khoảng từ 1=>n. Câu 4: Nhập độ dài 3 cạnh của một tam giác. Thông báo tam giác đó là tam giác đều, vuông cân, cân, hay tam giác thường.
  4. Câu 5: Cho một số tự nhiên N bất kỳ được nhập vào từ bàn phím. Tính tổng S = 1+ 1/1+2+ 1/1+2+3….+ 1/(1+2+3. . N); Câu 6: Nhập vào hai chuỗi s1, s2 sau đó đếm số lần chuỗi s2 xuất hiện trong chuỗi s1. Câu 7: Nhập vào ba xâu s1, s2, s3 sau đó thay thế tất cả các vị trí xuất hiện của s2 trong xâu s1 bằng xâu s3. Câu 8: Nhập một xâu s và kiểm tra xâu đó có phải xâu đối xứng không? Câu 9: Nhập vào một xâu ký tự sau đó chuẩn hoá xâu này theo quy tắc sau: - Đầu và cuối xâu không được chứa dấu cách - Giữa các từ không thể có nhiều hơn 1 dấu cách - Đầu các từ trong xâu phải là ký tự hoa - Các ký tự không phải là ký đầu tiên của một từ phải là chữ thường. Câu 10: Hãy nhập mảng một chiều a[] có n phần tử từ bàn phím - Xây dựng phương thức tính tổng của mảng. - Xây dựng phương thức tính tổng các giá trị chẵn có trong mảng. - Xây dựng phương thức đếm số lần xuất hiện của x có trong mảng. - Xây dựng phương thức sắp xếp các phần tử trong mảng thành dãy tăng dần. - Xây dựng phương thức hiện các phần tử của mảng. Câu 11: Hãy nhập mảng 2 chiều a[n][m] có n số hàng, m số cột từ bàn phím. - Xây dựng phương thức tính tổng của mảng. - Xây dựng phương thức tính tổng các hàng, các cột. - Xây dựng phương thức tính tổng đường chéo chính, đường chéo phụ. - Xây dựng phương thức hiện các phần tử mảng theo ma trận. I.2. Xử lý ngoại lệ: I.2. 1 Bài tập mẫu: Tính tổng 2 số a, b được nhập từ bàn phím. Yêu cầu xử lý các ngoại lệ có thể xảy ra. // Triển khai thư viện nhập xuất import java.io.*; // Tạo lớp tính tổng public class TinhTong { public static void main(String[]args) { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); float a=0, b=0, tong; try { System.out.println(" Ban hay nhap gia tri cua a "); a = Float.parseFloat(br.readLine());
  5. System.out.println(" Ban hay nhap gia tri cua b "); b=Float.parseFloat(br.readLine()); // Bắt ngoại lệ trong quá trình nhập dữ liệu từ bàn phím }catch(IOException ex) // In ra màn hình thông tin bị lỗi trong quá trình nhập { System.out.println( ex.getMessage()); } // Bắt ngoại lệ khi không thể chuyển kiểu chuỗi thành kiểu số catch(NumberFormatException nfe) // In ra màn hình thông tin bị lỗi trong quá trình chuyển kiểu { System.out.println( nfe.getMessage()); } tong =a+b; System.out.println( a + " + "+ b +":= \t"+ tong); } } I.2.2. Bài tập: Câu 1: Viết chương trình cho phép tính giá trị của biểu thức: A= Yêu cầu xử lý các ngoại lệ có thể xảy ra. Câu 2: Viết chương trình cho phép tạo một mảng 2 chiều cỡ mxn với m,n nhập từ bàn phím. Xây dựng phương thức hiện thị dữ liệu trong mảng. Cài đặt các xử lý ngoại lệ cần thiết. I. 3. Hướng đối tượng: I.3.1. Bài tập mẫu: // Khai báo thư viện nhập xuất dữ liệu. import java.io.*; // Khai báo thư viện collection để tập hợp đối tượng (ArrayList, List, Date. . .) import java.util.*; // Xây dựng một lớp SinhVien public class SinhVien { // Khai báo các thuộc tính của lớp (maSV, tenSV).
  6. private String maSV; private String tenSV; //biến ds thuộc kiểu dữ liệu ArrayList để tập hợp các đối tượng SinhVien để tạo thành một danh sách (biến ds có thể thêm hoặc xóa một đối tượng trong nó) ArrayList ds = new ArrayList(); // Xây dựng phương thức khởi tạo không có đối số. public SinhVien() { } // Xây dựng phương thức khởi tạo có đối số truyền vào public SinhVien(String maSV, String tenSV) { this.maSV=maSV; this.tenSV=tenSV; } // Xây dựng phương thức để nhập n sinh viên vào trong ds. public void nhap() { try { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Nhap so sinh vien"); int n = Integer.parseInt(br.readLine()); for(int i=0;i
  7. { System.out.println("STT \t"+ "MA SINH VIEN \t"+ " TEN SINH VIEN \t"); for(int i=0; i
  8. I.3.2. Bài tập Câu 1 a) Xây dựng lớp Stack để mô phỏng một Stack (giả thiết mỗi phần tử của stack là một số nguyên), bao gồm: - Hàm tạo Stack(int n) để khởi tạo Stack có tối đa n phần tử - Phương thức isEmpty để kiểm tra xem Stack có phần tử nào hay không? - Phương thức isFull để kiểm tra xem Stack đã đầy hay chưa? - Phương thức push để thêm một phần tử vào Stack - Phương thức pop để lấy một phần tử ra khỏi Stack b) Viết một đoạn chương trình để kiểm tra lớp Stack vừa tạo bằng cách: - Tạo ra một Stack có số phần tử tối đa là 5 - Trước khi đưa các phần tử vào Stack, hãy kiểm tra xem Stack có đang rỗng, đầy hay không? - Đưa phần tử 5 vào ngăn xếp, sau đó kiểm tra xem ngăn xếp có đầy, rỗng hay không? - Đưa tiếp các phần tử 1, 6, 8, 9 vào ngăn xếp, sau đó lại kiểm tra lại xem ngăn xếp đầy, rỗng hay không? Câu 2: Sử dụng lớp Stack được viết trong Bài 1 để viết chương trình chuyển một số từ hệ cơ số 10 sang hệ cơ số: 2, 8, 16, một cơ số bất kỳ bằng cách sử dụng phép toán chia liên tiếp. Bài 3: Xây dựng lớp PhanSo để thực hiện các phép toán trên phân số, bao gồm: - Hàm tạo PhanSo() để khởi tạo phân số có tử số bằng 0 và mẫu số bằng 1. - Hàm tạo PhanSo(int ts, int ms) để khởi tạo phân số có tử số bằng ts và mẫu số bằng ms. - Phương thức “cong”, “tru”, “nhan”, “chia” để thực hiện việc cộng , trừ, nhân, chia hai phân số. - Phương thức “nghichDao”, “doiDau”, “toiGian” để thực hiện việc nghịch đảo, đổi dấu và tối giản một phân số. - Phương thức “soSanhBang”, “lonHon”, “nhoHon”… để thực hiện việc so sánh hai phân số. - Phương thức “nhap” dùng để nhập phân số từ bàn phím. I.4. Các bài tập về I/O. I.4.1. Bài tập mẫu: Câu 1: Hãy sao chép file E:\\bien.txt sang D:\\bien.txt. \\ Khai báo thư viện nhập xuất. import java.io.*; // Xây dựng lớp CopyFile public class CopyFile
  9. { // Xây dựng phương thức xuLy() để thực hiện đọc và ghi file sử dụng luồng byte là (FileInputStream, FileOuputStream) public static void xuLy() throws IOException { FileInputStream fis; FileOutputStream fos; try { // biến fis sẽ đọc file bien.txt có trong ổ E fis = new FileInputStream("E:\\bien.txt"); // biến fos sẽ tạo ra file bien.txt ở ổ D để lưu dữ liệu đọc được ở file bien.txt ở ổ E. fos = new FileOutputStream("D:\\bien.txt"); int x; // Đọc dữ liệu trong fis cho đến =-1 hay hết file. while ( (x = fis.read()) != -1) { // fos ghi từng byte dữ liệu nhận được vào file bien.txt trong ổ D. fos.write(x); fos.flush(); } System.out.println("Sao chep file thanh cong"); // Đóng luồng fos.close(); fis.close(); }catch(FileNotFoundException fnfe) {} } // Xây dựng phương thức main để gọi đến phương thức sao chép file. public static void main(String[]args) throws IOException { xuLy(); } } Câu 2: Hãy nhập 3 số nguyên từ bàn phím vào trong tệp tin Tong.txt. Đọc 3 số từ tệp tin Tong.txt và tình tổng của 3 số đó rồi ghi kết quả vào dòng tiếp theo trong tệp tin. // Khai báo thư viện nhập xuất import java.io.*;
  10. // Xây dựng lớp Tong public class Tong { // Xây dựng phương thức main để thực thi các phương thức trong lớp Tong public static void main(String[]args)throws IOException, FileNotFoundException { tinhTong(); } // Xây dựng phương thức tinhTong() để ghi và đọc dữ liệu public static void tinhTong()throws IOException, FileNotFoundException { \\ Biến pw thuộc kiểu dữ liệu PrintWriter để ghi dữ liệu dùng luồng ký tự. PrintWriter pw = new PrintWriter(new FileOutputStream("D:\\Tong.txt")); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); for (int i = 0; i < 3; i++) { System.out.println("So thu " + i); int n = Integer.parseInt(br.readLine()); pw.print(n); pw.print(" "); pw.flush(); } // Biến dis thuộc kiểu dữ liệu DataInputStream đọc luồng dữ liệu nhị phân (Một số kiểu dữ liệu nguyên thủy như int, float, long . .) DataInputStream dis = new DataInputStream(new FileInputStream( "D:\\dayso2.txt")); char[] c = new char[dis.available()]; int x; int i = 0; int tong = 0; while ( (x = dis.read()) != -1) { c[i] = (char) x; i++; } String s = new String(c); String[] s1 = s.split(" "); for(int j=0;j
  11. pw.println(); pw.println(tong); pw.flush(); } } I.4.2. Bài tập Câu 1: Nhập vào một dãy số, ghi dẫy số này ra tệp “dayso.dat”. Đọc lại dẫy số này từ tệp để tìm tất cả các số nguyên tố trong dẫy này và ghi ra tệp “daynn.dat” Câu 2: Cho một tệp văn bản có kích thước nhỏ, viết chương trình kiểm tra xem trong tệp này có chứa xâu s (cho trước) hay không? + Nhập vào một dãy số. ghi dẫy số này ra tệp tin, sau đó tách tệp này thành hai tệp, một tệp chứa toàn các phần tử chẵn, tệp còn lại chứa toàn các phần tử lẻ. Câu 3: Tìm các số Fibonaci nhỏ hơn một số n (cho trước) + Ghi các số tìm được ra tệp theo định dạng như sau: - Hàng đầu tiên của tệp ghi số n - Hàng thứ 2 của tệp lần lượt ghi số tìm được, các số này được cách nhau bỏi một dấu cách Câu 4: + Ghi ma trận này ra tệp mt.dat theo quy tắc sau: - Hàng đầu tiên của tệp ghi số hàng của ma trận - Hàng thứ 2 của tệp ghi số cột của ma trận - Các hàng tiếp theo mỗi hàng ghi một hàng tương của ma trận + Đọc lại ma trận này từ tệp mt.dat I.5. Các bài tập về luồng (Thread). I.5.1 Bài tập mẫu:
  12. II. PIPE II.1.Bài tập mẫu. Câu 1: Xây dựng ứng dụng PipedEcho. - Sử dụng Pipe làm phương tiện giao tiếp giữa Client và Server. - Server là một thread thực thi song song với client. - Nhập các ký tự từ bàn phím và gởi cho Server và hiện thị kết quả nhận được ra màn hình. - Server nhận được ký tự và tăng mỗi ký tự lên 1 đơn vị rồi gởi về cho Client. * Chương trình Server. // Khai báo thư viện nhập xuất dữ liệu. import java.io.*; // Xây dựng lớp PipedEchoServer kế thừa các phương thức và thuộc tính của lớp Thread public class PipedEchoServer extends Thread { //Biến readPipe thuộc kiểu dữ liệu của PipedInputStream dùng để đọc dữ liệu trên ống dẫn, writePipe thuộc kiểu dữ liệu của PipedOutputStream dùng để ghi dữ liệu lên ống dẫn PipedInputStream readPipe; PipedOutputStream writePipe; // Xây dựng phương thức khởi tạo của lớp có hai đối số và trong đó có gọi đến phương thức start để chạy luồng mỗi khi một đối tượng của lớp được tạo ra. PipedEchoServer(PipedInputStream readPipe, PipedOutputStream writePipe) { this.readPipe = readPipe; this.writePipe = writePipe; System.out.println("Server bat đau lăng nghe. . ."); start(); } // Xây dựng Phương thức ghi đè run() để nhận, xử lý dữ liệu để gửi lại cho Client. public void run() { while(true) { try { int ch = readPipe.read()+ 1; writePipe.write(ch); writePipe.flush(); } catch (IOException ie)
  13. { System.out.println("Echo Server bi loi: "+ie ); } } } } * Chương trình Client: // Khai báo thư viện nhập xuất dữ liệu. import java.io.* // Xây dựng lớp PipedEchoClient kế thừa các phương thức và thuộc tính của lớp Thread public class PipedEchoClient extends Thread { PipedInputStream readPipe; PipedOutputStream writePipe; PipedEchoClient(PipedInputStream readPipe, PipedOutputStream writePipe) { this.readPipe = readPipe; this.writePipe = writePipe; System.out.println("Client dang ket noi"); start(); } // Xây dựng phương thức ghi đè run() để gửi và đọc kết quả lên màn hình. public void run() { while(true) { try { int ch=System.in.read(); writePipe.write(ch); ch = readPipe.read(); System.out.print((char)ch); } catch(IOException ie) { System.out.println("Echo Client Error: "+ie ); } } } } * Chương trình PipedEcho. // Khai báo thư viện nhập xuất import java.io.*; public class PipedEcho
  14. { // Xây dựng phương thức main để thực thi ứng dụng PipedEcho là tạo ra 2 ống dẫn giúp Client và Server có thể trao đổi thông tin với nhau. public static void main(String args[]) { try{ PipedOutputStream cwPipe = new PipedOutputStream(); PipedInputStream crPipe = new PipedInputStream(); PipedOutputStream swPipe = new PipedOutputStream(crPipe); PipedInputStream srPipe = new PipedInputStream(cwPipe); PipedEchoServer server = new PipedEchoServer(srPipe,swPipe); PipedEchoClient client = new PipedEchoClient(crPipe,cwPipe); } catch(IOException ie) { System.out.println("Pipe Echo Error:"+ie); } } } // Kết quả Khi chạy PipedEcho Server bat đau lăng nghe. . . Client dang ket noi 123qw 234rx II.2. Bài tập Câu 1: Hãy xây dựng một chương trình ghi một mảng byte cho trước lên ống dẫn Pipe. Đọc dữ liệu từ ống dẫn rồi hiện thị kết quả ra màn hình. Câu 2: Hãy xây dựng một ứng dụng cho dịch vụ phản hồi thông tin bằng ống dẫn (Pipe) theo mô hình Client-Server theo yêu cầu sau: - Client nhập một mảng ký tự từ bàn phím rồi gửi đến Server, đợi nhận kết quả trả về và in ra màn hình. - Server sẽ nhận dữ liệu từ Client gửi sang, kiểm tra ký tự đó nếu là ký tự số sẽ gửi trả về cho Client.
  15. III. SOCKET III.1. Bài tập mẫu. III.1. 1.Lập trình TCP III.1.1.1.Xây dựng chế độ phục vụ tuần tự. Câu 1: Viết chương trình theo mô hình Client-Server sử dụng Socket ở chế độ nối kết(TCP) a) Chương trình phía Server. - Lắng nghe và chấp nhận kết nối tại cổng 1234 - Khi nhận một chuỗi từ Client sẽ chuyển chuỗi đó thành chữ hoa và gửi kết quả trả lại cho Client. - Đóng kết nối b) Chương trình phía máy khách. - Kết nối đến Server có cổng kết nối 1234. - Đọc chuỗi từ bàn phím rồi gởi đến Server chờ và nhận kết quả hiện thị ra màn hình - Đóng kết nối. * Trình tự hoạt động của máy chủ(Server) : import java.io.*; // Khai báo thư viện cho lớp mạng import java.net.*; public class TCPServer { public static void main(String[]args) { try { // Biến sv thuộc kiểu dữ liệu ServerSocket đang lắng nghe tại cổng 1234 ServerSocket sv = new ServerSocket(1234); // sv chấp nhận kết nối Socket client = sv.accept(); // br dùng để đọc dữ liệu trên socket BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream())); // pw ghi dữ liệu lên socket PrintWriter pw = new PrintWriter(client.getOutputStream()); String s1 = br.readLine(); s1=chuHoa(s1); pw.write(s1+ "\n"); pw.flush();
  16. pw.close(); br.close(); client.close(); sv.close(); }catch(IOException ex) {} } // Hàm chuyển đổi chuỗi thành chuỗi hoa public static String chuHoa(String s) { s=s.toUpperCase(); return s; } } * Trình tự hoạt động của máy khách (Client) : import java.io.*; import java.net.*; public class TCPClient { public static void main(String[]args) { try { // Client kết nối đến Server có địa chỉ IP “127.0.0.1”, cổng 1234. Socket client = new Socket("127.0.0.1",1234); BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream())); BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in)); PrintWriter pw = new PrintWriter(client.getOutputStream()); System.out.println("Ban hay nhap mot chuoi vao"); String s; // Gửi chuỗi đến Server while((s=br1.readLine())!="1") { pw.write(s + "\n"); pw.flush(); if(s=="1")break; } System.out.println("chuoi nhan ve la"); String s1 = br.readLine(); System.out.println(s1);
  17. br.close(); pw.close(); client.close(); }catch(IOException ex) {} } } III.1.1.2. Xây dựng Server chế độ phục vụ song song (một nguồn nhiều khách). Câu 1 a) Chương trình phía máy chủ - Lắng nghe và chấp nhận các kết nối đến trên cổng 9999 - Tạo ra mỗi tuyến cho một kết nối riêng biệt để đáp ứng các yêu cầu của các máy khách đồng thời - Khi nhận được một dòng do máy khách gửi đến máy chủ sẽ xử lý như sau: + Nếu dòng nhận được là “quit” (không phân biệt chữ hoa chữ thường) máy chủ sẽ đóng kết nối với máy khách + Nếu dòng nhận được một chuỗi sẽ chuyển chuỗi về chữ hoa sau đó trả về cho Client. b) Chương trình phía máy khách - Kết nối đến chương trình máy chủ đã nêu trong câu a - Đọc một dòng từ bàn phím và gửi dòng đọc được đến máy chủ - Nếu dòng đọc được là “quit” (không phân biệt chữ hoa chữ thường) thì ngắt kết nối với máy chủ và kết thúc chương trình - Đọc kết quả trả về và in ra màn hình * Trình tự hoạt động của Server: // khai báo thư viện nhập xuất import java.io.*; // Khai báo thư viện cho các lớp mạng import java.net.*; // Xây dựng lớp TCPServer // Phần 1 lắng nghe tại cổng 9999, khi có client kết nối thì nó sẽ tạo ra một luồng mới để xử lý yêu cầu của Client. public class TCPServer { public static void main(String[]args) { try { System.out.println("Server lang nghe ket noi tai cong 9999");
  18. ServerSocket svsk = new ServerSocket(9999); // Nếu quá trình lắng nghe tại cổng 9999 của Server là đúng thì lặp lại công việc Chấp nhận kết nối của client và tạo ra luồng mới để xử lý thông điệp mà client gởi đến. while(true) { Socket sk1 = svsk.accept(); MyThread mt = new MyThread(sk1); } }catch(IOException ex) {} } } // Xây dựng lớp MyThread kế thừa từ lớp Thread để nhận và xử lý thông điệp từ Client class MyThread extends Thread { Socket sk; public MyThread(Socket sk) { this.sk=sk; this.start(); } public void run() { try { BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream())); PrintWriter pw = new PrintWriter(sk.getOutputStream()); // Lặp lại quá trình nhận thông tin và xử lý thông tin để gởi trả lại cho Client. while(true) { String s = br.readLine(); String s1 = s.toUpperCase(); if(s.equals("quit"))break; else { pw.println(s1); pw.flush(); }
  19. } // Đóng kết nối br.close(); pw.close(); sk.close(); * Trình tự hoạt động của Client. import java.io.*; import java.net.*; public class TCPClient { public static void main(String[] args) { try { // biến sk thuộc kiểu dữ liệu kiểu Socket để tạo kết nối đến máy chủ tại cổng 9999 Socket sk = new Socket("127.0.0.1",9999); // biến br thuộc kiểu dữ liệu BufferedReader để đọc dữ liệu trên socket BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream())); BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in)); // biến pw thuộc kiểu dữ liệu PrintWriter để ghi dữ liệu lên socket PrintWriter pw = new PrintWriter(sk.getOutputStream()); // Lặp lại quá trình nhập chuỗi để gởi cho Server nếu chuỗi nhập vào là “quit” sẽ thoát khỏi quá trình nhập ngược lại sẽ in kết quả ra màn hình while(true) { System.out.println("ban hay nhap mot chuoi vao"); String s = br1.readLine(); pw.println(s); pw.flush(); if(s.equals("quit"))break; else System.out.println("chuoi nhan ve tu Server la" + br.readLine()); } // Client đóng kết nối br.close(); pw.close(); sk.close();
  20. }catch(IOException ex) {} } } III.1.2. Lập trình với UDP. Bài Tập 1 : Viết chương trình kết nối Client – Server. Sau đó gửi các 1 thông điệp từ máy khách đến máy chủ. Máy chủ hiển thị ra [ IP Address – Port – Thông điệp ] từ máy khách gửi đến? * Trình tự hoạt động của UDPServer. import java.io.*; import java.net.*; class UDPServer { public static void main(String[] args) throws Exception { byte []buffer = new byte[1024]; int port = 2812; try { // Tạo ra một socket của UDP đang lắng nghe kết nối ở cổng port. DatagramSocket socket = new DatagramSocket(port); // Biến packet thuộc kiểu dữ liệu DatagramPacket để đóng gói dữ liệu được chứa trong buffer có độ dài buffer.length. DatagramPacket packet = new DatagramPacket(buffer,buffer.length); // Nhận gói dữ liệu về socket.receive(packet); // Lấy địa chỉ IP của Client. InetAddress ipClient = packet.getAddress(); // Lấy số hiệu cổng của Client int portClient = packet.getPort(); // Chuyển dữ liệu nhận về thành kiểu chuỗi String st = new String(packet.getData(),0,packet.getLength()); // Hiện thị chuỗi nhận về từ client và địa chỉ ip của client. System.out.println("receive : '" + st + "' from " + ipClient); packet.setLength(buffer.length); } catch (UnknownHostException evt) {evt.printStackTrace();} }
Đồng bộ tài khoản