tài liệu tham khảo lập trình mạng với java
Trang 2Nội dung ôn tập
Ngôn ngữ Java căn bản
Lớp và đối tượng trong Java
Trang 3Ngôn ngữ Java
Java là ngôn ngữ lập trình hướng đối tượng
Một chương trình Java thường bắt đầu bằng một khai
báo lớp (class); trong đó, có phương thức main – là
điểm bắt đầu thực thi của chương trình:
public static void main (String[] agrs)
Java hỗ trợ các cấu trúc điều khiển:
Java cung cấp ba câu lệnh break,continue và
return cho phép chuyển điều khiển từ đoạn lệnh này
sang đoạn khác.
Trang 5Chuyển đổi kiểu dữ liệu [1]
Trang 6Chuyển đổi kiểu dữ liệu [2]
Có hai cách chuyển đổi kiểu dữ liệu: tự động chuyển đổi kiểu dữ liệu và phép ép kiểu dữ liệu
Khi dữ liệu ,với một kiểu dữ liệu cho trước, được gán cho một biến có kiểu dữ liệu khác, quá trình chuyển đổi kiểu dữ liệu tự động thực hiện nếu thõa các điều kiện sau:
Hai kiểu dữ liệu tương thích nhau
Kiểu dữ liệu đích lớn hơn kiểu dữ liệu nguồn
Ép kiểu dữ liệu là sự chuyển đổi dữ liệu tường minh
Nó có thể làm mất thông tin
Trang 7Các luật mở rộng kiểu dữ liệu
Tất cả các giá trị kiểu byte and short được mở
Nếu một toán hạng có kiểu double, kiểu dữ liệu
của toàn biểu thức sẽ được mở rộng thành kiểu
double
Trang 11if (biểu_thức_điều_kiện) {
Trang 12khối_lệnh_2; break;
default:
khối lệnh_n;
}
Trang 13for (nhóm_lệnh_khởi_tạo;
bthức_điều_kiện;
nhóm_lệnh_tăng_giảm_giá_trị) {
khối_lệnh_lặp;
}
Trang 14while
while (biểu_thức_điều_kiện) {
khối_lệnh_lặp;
}
Trang 15do {
khối_lệnh_lặp; } while (condition);
Trang 16Lớp và đối tượng
Lớp định nghĩa một kiểu dữ liệu mới
Đối tượng thuộc một lớp trong Java luôn được cấp
Trang 17Phương thức
Khai báo
access_specifier modifier kiểu_dữ_liệu
tên_phương_thức (danh_sách_tham_số) {
Trang 18Phương thức [2]
Nguyên tắc truyền tham số vào phương thức:
Kiểu dữ liệu là kiểu cơ sở: truyền bằng tham số trị
Kiếu dữ liệu là kiểu tham chiếu: truyền bằng tham
chiếu.
Phương thức trong lớp có thể overloading: nhiều
phương thức có cùng tên nhưng khác danh sách
tham số
Các phương thức overriding là các phương thức
giống nhau nhưng được khai báo trong các lớp khác nhau có quan hệ kế thừa
Trang 20Phương thức khởi tạo
Có cùng tên với tên lớp và không có kiểu trả về
Được tự động gọi thực hiện ngay khi đối tượng thuộc lớp được tạo ra.
Có hai loại phương thức khởi tạo: có tham số và không tham số (phương thức khởi tạo mặc định) Tùy thuộc vào cách khởi tạo đối tượng mà phương thức khởi tạo tương ứng được gọi thực hiện.
Trang 21 Nếu trong phương thức khởi tạo của lớp dẫn xuất
không gọi (tường minh) phương thức khởi tạo của lớp cơ sở thì phương thức khởi tạo mặc định của lớp
cơ sở luôn được tự động gọi thực hiện
Phạm vi truy cập của các phương thức trong lớp dẫn xuất phải bằng hoặc rộng hơn trong lớp cơ sở
Trang 24Từ khóa super
Từ khóa super được sử dụng để gọi thực hiện
phương thức khởi tạo của lớp cơ sở
super(); // gọi constructor của lớp cơ sở
Từ khóa super có thể được sử dụng để tham chiếu
đến các thuộc tính hoặc gọi thực hiện các phương thức của lớp cơ sở
super.f( ); // gọi phương thức f() của lớp cơ sở
Trang 25Từ khóa static [1]
Có thể đặt trước một khai báo thuộc tính hay phương thức
static int i;
public static void f ( ) { }
Thuộc tính static là thuộc tính duy nhất được chia
sẻ bởi tất cả các đối tượng thuộc lớp
Phương thức static chỉ truy xuất được các thuộc tính static.
Các thành viên static có thể được truy xuất thông
qua tên lớp
System.out.println( … );
Trang 26A obj1= new A();
A obj2= new A();
A obj3= new A();
A.p= 10; //Error
A.t=5;
}
obj1.p= 1; obj1.t= 2;
Trang 27Tham chiếu [1]
Tham chiếu, hình thành khi đối tượng được tạo ra, được sử dụng để truy xuất các thuộc tính của đối
tượng
Khi gán một đối tượng vào một biến nhớ, hoặc
truyền đối tượng vào phương thức, chỉ có tham chiếu của đối tượng được truyền vào
Trang 28 Để so sánh giá trị các đối tượng, sử dụng phương
thức equals() Như vậy, các lớp đối tượng cần cài đặt phương thức equals () để thực hiện so sánh
giá trị của hai đối tượng thuộc lớp
Ví dụ
String str1= new String(“abc”);
String str2= new String(“abc”);
String str3= str1;
Trang 29Wrapper Classes
Nằm trong gói java.lang
Đóng gói các kiểu dữ liệu cơ sở dưới dạng các lớp
Được sử dụng khi cần dùng một đối tượng biểu diễn một kiểu cơ sở
Các wrapper class dùng cho kiểu số: Double,
Float, Byte, Short, Integer và Long
Lớp Character là wrapper class dùng cho kiểu dữ liệu char.
Lớp Boolean là wrapper class dùng cho kiểu dữ liệu
boolean.
Trang 30 int length(): xác định chiều dài của một String.
int indexOf(String): tìm một chuỗi con trong
Trang 31Lớp String [2]
String s1= “abc”;
int len= s1.length();// len = 3
int pos= s1.indexOf(“a”);// pos=0
pos= s1.indexOf(“g”); //pos=-1
String s2= s1.toUpperCase(); // s2= “ABC” String s3= s2.toLowerCase(); // s3= “abc”
Trang 32Lớp String [3]
Mỗi khi thực hiện thay đổi trên một String, một đối tượng String mới sẽ được tạo nên với những thay
đổi trong đó Chuỗi ký tự ban đầu không thay đổi
Toán tử == và != cũng được áp dụng trên các đối tượng thuộc lớp String.
Để so sánh nội dung của hai String, sử dụng
phương thức equals(String)
Ví dụ
String str1= new String (“abc”);
String str2= new String (“abc”);
[ str1 == str2; str1.equals(str2); ]
Trang 33Exception
Các exception trong Java có thể được xử lý trong
chương trình bằng các từ khóa: try, catch,
throw, throws, và finally.
} finally {
Khối_lệnh_kết_thúc;
Trang 34Các lớp Exception
Trang 35Xử lý exception [1]
Có hai cách xử lý exception trong Java:
Xử lý exception trong khối lệnh catch.
Khai báo phương thức ném ra exception tương ứng – không xử lý exception.
void f() throws IOException { … }
catch block finally
Exception
finally
No exception
try block
Trang 37Nhập / xuất dữ liệu
Sử dụng các luồng nhập xuất trong gói java.io
Có hai loại luồng nhập/xuất trong Java:
Các luồng dữ liệu kiểu byte:
Xử lý dữ liệu nhập/xuất theo từng byte.
Hai lớp cơ sở là: InputStream và OutputStream
Các luồng dữ liệu kiểu ký tự:
Xử lý dữ liệu theo từng ký tự
Hai lớp cơ sở là: Reader và Writer
Trang 38Filter OutputStream OutputStreamByteArray
Buffered OutputStream
DataOutput Stream Print
Stream
Trang 39String str= new String(data, 0, len); System.out.println(str);
} catch (IOException ex) {
ex.printStackTrace();
}
Trang 41Đọc dữ liệu từ tập tin
Đọc dữ liệu, sử dụng lớp đối tượng FileInputStream
FileInputStream fis= new FileInputStream(…); byte buffer[]= new byte[128];
Trang 42Ghi dữ liệu ra tập tin
Xuất dữ liệu, sử dụng lớp đối tượng FileOutputStream
Trang 44Internet Address
Lớp InetAddress đóng gói địa chỉ IP và tên miền
của một máy tính
Lớp InetAddress không có hàm khởi tạo Để tạo ra
đối tượng thuộc lớp này, sử dụng các phương thức:
Trang 45 Có hai loại socket
TCP (Transmission Control Protocol)
UDP (User Datagram Protocol)
Trang 46 Các hàm khởi tạo của lớp Socket
1 public Socket (String host, int port)
throws UnknownHostException, IOException
2 public Socket (InetAddress address, int
port) throws IOException
3 public Socket (String host, int port, InetAddress localaddr, int localPort)
throws IOException
4 public Socket (InetAddress addr, int
localport, boolean b ) throws IOException
Trang 47Socket [2]
Các phương thức thao tác trên Socket
1 public InputStream getInputStream()
Trang 48ServerSocket [1]
Các hàm khởi tạo của lớp ServerSocket
1 public ServerSocket ( int port) throws
IOException
2 public ServerSocket ( int port, int
count) throws IOException
3 public ServerSocket ( int port, int
count, InetAddr localaddr) throws
IOException
Trang 49ServerSocket [2]
Các phương thức thao tác trên ServerSocket
1 public Socket accept() throws
IOException
2 public void close() throws IOException
Trang 50giao tiếp với Client.
Lấy InputStream và OutputStream để nhận và
gửi dữ liệu với Client
Gửi và nhận dữ liệu với Client, sử dụng các phương
thức read() và write() của các lớp đối tượng
InputStream và OutputStream.
Đóng Socket và ServerSocket
Kết thúc chương trình
Trang 51Server TCP
ServerSocket ssk = new ServerSocket(1234);
Socket sk= ssk.accept();
InputStream is= sk.getInputStream();
OutputStream os= sk.getOutputStream();
byte[] buffer= new byte[128];
int len= is.read(buffer);
System.out.println(new String(buffer,0,len)); sk.close();
ssk.close();
Trang 52Lập trình Client TCP
Tạo Socket kết nối đến Server
Lấy InputStream và OutputStream để nhận và
gửi dữ liệu với Server
Gửi và nhận dữ liệu với Server, sử dụng các phương
thức read() và write() của các lớp đối tượng
InputStream và OutputStream.
Đóng Socket
Kết thúc chương trình
Trang 54 Các hàm khởi tạo của lớp DatagramSocket
1 public DatagramSocket( int port) throws
SocketException
2 public DatagramSocket() throws
SocketException
Trang 55DatagramSocket [2]
Các phương thức thác tác trên DatagramSocket
1 public void send(DatagramPacket p)
throws IOException
2 public void receive(DatagramPacket p)
throws IOException
3 public void close()
4 public int getLocalPort()
Trang 56DatagramPacket[1]
Java cung cấp lớp đối tượng DatagramPacket để
tạo những gói tin sử dụng cho UDP socket
Các hàm khởi tạo của lớp DatagramPacket
1 public DatagramPacket ( byte [] buffer,
int length)
2 public DatagramPacket ( byte [] buffer,
int length, InetAddress addr, int port)
Trang 57DatagramPacket [2]
Các phương thức thao tác trên gói tin UDP
1 public byte [] getData()
2 public int getLength()
3 public InetAddress getAddress()
4 public int getPort()
Trang 58Lập trình Server UDP
Tạo UDP Socket
Tạo DatagramPacket để nhận dữ liệu
Nhận dữ liệu từ Client
Đóng UDP Socket
Kết thúc chương trình
Trang 60Lập trình Client UDP
Tạo UDP Socket
Tạo DatagramPacket để gửi dữ liệu
Gửi dữ liệu đến Server
Đóng UDP Socket
Kết thúc chương trình
Trang 61DatagramPacket pk= new DatagramPacket(
msg.getBytes(), msg.length(), addr, 1234); dsk.send(pk);
dsk.close();
Trang 62RMI
Trang 63Library & Tools
Trang 64B1 RMI Object Interface
Interface này phải public
Kế thừa interface Remote, interface Remote này không khai báo hàm nào cả
Khai báo các phương thức gọi từ xa; các phương thức này phải khai báo có khả năng gây ra ngoại lệ
RemoteException, đây chính là lớp cơ sở cho hầu hết các ngoại lệ khác mà RMI sử dụng.
Trang 66B2 RMI Object Class
Lớp này phải thi công interface ở xa vừa tạo ở B1
Cài đặt phương thức gọi từ xa đã được khai báo trong
interface ở xa
Đối tương thuộc lớp này phải được “xuất khẩu” trước khi
có thể phục vụ RMI Do đó, lớp này hoặc phải kế thừa lớp
UnicastRemoteObject hoặc chúng ta phải “xuất khẩu” đối tượng thuộc lớp sau khi tạo ra bằng hàm exportObject( )
Nếu lớp này kế thừa lớp UnicastRemoteObject , thì chúng ta phải cài đặt hàm khởi tạo cho lớp này để đối tượng thuộc lớp có thể gọi thực hiện hàm khởi tạo của lớp
UnicastRemoteObject tự động.
Trang 67public class CalendarImpl extends
UnicastRemoteObject implements iCalendar {
public CalendarImpl ( ) throws
RemoteException { } public Date getDate ( ) throws
RemoteException { return new Date( );
}
}
Trang 68B3 Server
Tạo đối tượng phục vụ RMI
Có thể tạo bộ đăng ký RMI Registry cục bộ của chương
trình hoặc chạy chương trình tiện ích rmiregistry.exe
Đăng ký đối tượng phục vụ RMI với RMI Registry
Trang 69Cài đặt Server
import java.rmi.*;
import java.rmi.registry.LocateRegistry;
public class CalendarServer {
public static void main (String[] args){
LocateRegistry.createRegistry( 1099 ); CalendarImpl cal = new CalendarImpl( ); Naming.bind(“rmi://localhost/
CalendarImpl”,cal );
System.out.println(“Ready for RMI’s.”); }
}
Trang 71Cài đặt Client
import java.rmi.*;
public class CalendarUser {
public static void main ( String args[] ) {
long t1=0, t2=0;
iCalendar remoteCal=
(iCalendar) Naming.lookup(
rmi://localhost/CalendarImpl”); t1= remoteCal.getDate( ).getTime( );
t2= remoteCal.getDate( ).getTime( );
System.out.println ( “This RMI call
took “ + (t2 – t1) + “ms”); }