Tải bản đầy đủ (.doc) (26 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (225.75 KB, 26 trang )

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<s.length();i++)


{
if(kiemTra((int)s.charAt(i))==true)
{
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<58))
return true;
else
return false;
}
public void xuLyCT()
{
int dem0=0;
int dem1=0;
int dem2=0;
int dem3=0;
int dem4=0;
int dem5=0;
int dem6=0;
int dem7=0;
int dem8=0;
int dem9=0;

for(int i=0; i<s.length();i++)
{
char c = s.charAt(i);
switch(c)
{
case '0':dem0++; break;
case '1':dem1++; break;
case '2':dem2++; break;
case '3':dem3++; break;
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.
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());
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).

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<n; i++)
{
System.out.println("Nhap maSV "+ i);
maSV=br.readLine();
System.out.println("Nhap tenSV "+ i);
tenSV=br.readLine();
SinhVien sv = new SinhVien(maSV,tenSV);
ds.add(sv);

}
}catch(IOException ex)
{}
catch(NullPointerException npe)
{}
}
// Xây dựng phương thức hiện thông tin của sinh viên có trong ds.
public void hien()
{
System.out.println("STT \t"+ "MA SINH VIEN \t"+ " TEN SINH VIEN \t");
for(int i=0; i<ds.size();i++)
{
SinhVien sv =(SinhVien)ds.get(i);
System.out.println(i+ " \t"+ sv.maSV+ " \t\t "+ sv.tenSV);
}
}
// Xây dựng phương thức tìm một sinh viên có trong danh sách sinh viên hay không
public void tim(String s)
{
boolean kt=false;
for(int i=0; i<ds.size(); i++)
{
SinhVien sv = (SinhVien)ds.get(i);
sv.tenSV=sv.tenSV.trim();
String ten=sv.tenSV.substring(sv.tenSV.length()-s.length());
if(s.equals(ten))
{
System.out.println("SINH VIEN "+ s + " CO TRONG DANH SACH VA CO MA
SO \t"+ sv.maSV);
kt=true;

}
}
if(kt==false)
{
System.out.println("SINH VIEN "+ s + " KHONG CO TRONG DANH SACH");
}
}
// Xây dựng phương thức main để thực thi các phương thức có trong lớp
public static void main(String[]args)
{
SinhVien sv = new SinhVien();
sv.nhap();
sv.hien();
String s ="Bien";
sv.tim(s);
}
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
{
// 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.*;
// 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<s1.length;j++)
{
tong+=Integer.parseInt(s1[j]);
}
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:
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)
{ 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
{
// 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.
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();
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);
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");
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();
}
}
// Đó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();
}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();}
}
}
* Trình tự hoạt động của UDPClient.
import java.io.*;
import java.net.*;
class UDPClient
{
public static void main(String[] args) throws Exception
{
BufferedReader in = new BufferedReader(new
InputStreamReader(System.in));
// Tạo ra một s UDPSocket để kết nối đến Server
DatagramSocket socket = new DatagramSocket();
//Lấy địa chỉ ip của máy chủ(“localhost”)
InetAddress ipServer = InetAddress.getByName("localhost");
int port = 2812;
byte []sendData;

System.out.print("\nNhap chuoi bat ky : ");
String st=in.readLine();
sendData = st.getBytes();
// sendPacket để đóng gói dữ liệu với các tham số truyền vào mảng byte
(sendData), số lượng byte(sendData.length), địa chỉ ip của Server, Số cổng của
Server cần kết nối đến(port).
DatagramPacket sendPacket = new
DatagramPacket(sendData,sendData.length,ipServer,port);
// Gửi dữ liệu đến Server
socket.send(sendPacket);
// Đóng kết nối
socket.close();
}
}
III.2. Bài tập:
Câu 1:
a) Chương trình phía máy chủ:
- Lắng nghe và chấp nhận kết nối trên cổng 1234
- 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 “OP DS1 DS2” (Trong đó “OP” là một phép toán số học
có thể là: “+”, “-”, “*”, “/”. DS1, DS2 là đối số của phép toán. Các thành phần cách nhau
bởi một dấu cách) Server sẽ thực hiện phép toán DS1 OP DS2 rồi gửi kết quả trả về
Client.
+ Nếu dòng nhận được là “quit” (không phân biệt là chữ hoa hay chữ thường) máy
chủ sẽ đóng kết nối.
+ Nếu dòng thông điệp nhận được không phải là các trường hợp trên thì máy chủ
sẽ gửi về một dòng thông báo “Unkown command”
b) ch phía máy khách:
- Kết nối ðến máy chủ tại cổng 1234.
- Ðọc một dòng từ bàn phím và gửi ðến cho Server.

- Nếu dòng đọc được là “quit” (không phân biệt là chữ hoa hay chữ thường) Client sẽ
đóng kết nối.
- Đọc kết quả trả về và in ra màn hình
Câu 2:
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à “GetTime” (không phân biệt chữ hoa chữ thường) máy
chủ sẽ lấy về giờ hiện tại của máy và gửi về máy khách
+ Nếu dòng nhận được là “GetDate” (không phân biệt chữ hoa chữ thường) máy
chủ sẽ lấy về ngày hiện tại của máy và gửi về máy khách
+ 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 thông điệp nhận được không phải là các trường hợp trên thì máy chủ
sẽ gửi về một dòng thông báo “Unkown command”
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
Câu 3. Viết chương trình với yêu cầu sau:
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à “GetLength” (không phân biệt chữ hoa chữ thường) máy

chủ sẽ đọc tiếp một dòng và đến xen dòng thông điệp đó gồm có bao nhiêu từ và
trả về cho máy khách
+ 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 thông điệp nhận được không phải là các trường hợp trên thì máy chủ
sẽ gửi về một dòng thông báo “Unkown command”
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 hai dòng lệnh 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
Câu 4: Viết chương trình theo mô hình Client-Server sử dụng Socket ở chế độ không nối
kết:
a) Chương trình phía máy chủ:
- Lắng nghe kết nối trên cổng 1111
- Nhận một chuỗi rồi chuyển kiểu thành (double) tính căn bậc 2 rồi gửi trả về cho client.
- Đóng kết nối.
b) Chường trình phía máy khách:
- Kết nối đến cổng 1111.
- Đọc một chuỗi từ bàn phím, gửi chuỗi đến Server và nhận kết quả trả về hiện trên màn
hình.
- Đóng kết nối.
Câu 5: Viết chương trình chat per to per, cho phép 2 máy tính gửi trực tiếp các thông
điệp
cho nhau
IV. PRC và RMI.
IV.1. Bài tập mẫu:
Bài 1: Xây dựng một ứng dụng tính tổng của 1 mảng được gọi từ xa.
* Xây dựng phương thức được gọi từ xa của các đối tượng.

// Khai báo thư viện của rmi
import java.rmi.*;
\\ Xây dựng lớp Tong được kế thừa từ lớp Remote
public interface Tong extends Remote
{
// Định nghĩa một remote Interface có tên là tong(int[])
public int tong(int[]a) throws RemoteException;
}
* Tạo lớp cài đặt cho giao diện khai báo ()
import java.rmi.*;
public class Tongipl implements Tong
{
// Xây dựng hàm để tính tổng của một mảng.
public int tong(int[]a) throws RemoteException
{
System.out.println("may khach yeu cau");
int tong =0;
for(int i=0; i<a.length;i++ )
{
tong+=a[i];
}
return tong;
}
}
* Xây dựng chương trình phía Server
// Khai báo thư viện cho Server
import java.rmi.server.*;
import java.rmi.*;
public class Server
{

public static void main (String[] args)
{
try
{
// Tạo đối tượng Tongipl thực sự.
Tongipl t=newTongipl ();
// Thông báo sự hiện diện của đối tượng cho máy áo java
UnicastRemoteObject.exportObject(t);
// Đăng ký đối tượng với bộ quán lý của rmi
Naming.bind("rmi://localhost/MyT",t);
System.out.println("Register Thanh cong!");
}
catch(Exception e)
{}
}
}
* Xây dựng chương trình phía Client.
import java.io.*;
public class Client
{
public static void main(String[] args)
{
try
{
System.out.println(" tim doi tuong truy xuat theo ten");
Tong = (Tong)Naming.lookup("rmi://localhost/MyT");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Ban hay nhap so phan tu cua mang vao");
int n = Integer.parseInt(br.readLine());
int[]a= new int[n];

for(int i=0; i<a.length;i++)
{
System.out.println("Nhap phan tu a[ "+i+ "] " );
a[i]=Integer.parseInt(br.readLine());
}
// Gọi phương thức của đối tượng
System.out.println("TONG "+ c.tong(a));
}
catch(IOException ex)
{}
catch(Exception e)
{ System.out.print(e); }
}

×