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++)
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
- 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
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);
}
}
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?
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.
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:
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;
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.
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;
- Đọ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)
{}
}
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());
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;
- 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
// 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
{
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); }
}