66
Lập trình mạng với Java

Lap Trinh Mang Voi Java

Embed Size (px)

DESCRIPTION

học java cơ bả

Citation preview

Page 1: Lap Trinh Mang Voi Java

Lập trình mạng với Java

Page 2: Lap Trinh Mang Voi Java

Nội dung

Ngôn ngữ Java căn bản Lớp và đối tượng trong Java Exception Nhập / xuất trong Java Lập trình Socket Lập trình RMI

Page 3: Lap Trinh Mang Voi Java

Ngô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: if-else switch for while do-while

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.

Page 4: Lap Trinh Mang Voi Java

Cách thi hành 1 chương trình Java

javac myProgram.java

java myProgram

Page 5: Lap Trinh Mang Voi Java

Kiểu dữ liệu

byte char boolean short int long float double

Array

Class

Interface

Page 6: Lap Trinh Mang Voi Java

Chuyển đổi kiểu dữ liệu [1]

float c = 34.89675f;int b = (int)c + 10;c = b;

Trong quá trình chuyển đổi kiểu dữ liệu, một kiểu dữ liệu sẽ được chuyển đổi sang một kiểu dữ liệu khác.

Ví dụ

Page 7: Lap Trinh Mang Voi Java

Chuyể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

Page 8: Lap Trinh Mang Voi Java

Cá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ở rộng thành kiểu int

Nếu một toán hạng có kiểu long, kiểu dữ liệu của toàn biểu thức sẽ được mở rộng thành kiểu long

Nếu một toán hạng có kiểu float, kiểu dữ liệu của toàn biểu thức sẽ được mở rộng thành kiểu float

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

Page 9: Lap Trinh Mang Voi Java

BIẾN Biến trong Java có 3 loại: static variable,

instance varible và local variable. static/instance variable: có thể được sử

dụng mà không cần khởi tạo giá trị (được tự động gán giá trị mặc định).

local varible: bắt buộc phải khởi tạo giá trị trước khi sử dụng. Nếu không sẽ tạo ra lỗi khi biên dịch.

class test{ static int a; public static void main(String[] args){

int b;System.out.println(a);

System.out.println(b); }}

Page 10: Lap Trinh Mang Voi Java

Biến Có ba thành phần trong một khai báo biến:

Kiểu dữ liệu Tên biến Giá trị khởi gán ( tùy ý )

Cú phápkiểu_dữ_liệu tên_biến [= giá_trị];

Ví dụdouble d = 5.5;

Page 11: Lap Trinh Mang Voi Java

Mảng Có ba cách khai báo mảng

kiểu_dữ_liệu tên_biến [];

kiểu_dữ_liệu tên_biến []=new kiểu_dữ_liệu [số_ptử];

kiểu_dữ_liệu tên_biến [] = {gtrị1, gtrị2,…., gtrịN};

Ví dụint a[];

int a[] = new int [10];

float af[] = {5.3, 7.6, 8.9, 3.0};

Page 12: Lap Trinh Mang Voi Java

Các cấu trúc điều khiển Cấu trúc rẽ nhánh

if-else switch-case

Cấu trúc lặp while do-while for

Page 13: Lap Trinh Mang Voi Java

Tham số của chương trình Xét đoạn CTclass ArgsTest { public static void main(String[] args) {

for(int i=0;i<args.length;++i) {System.out.print("args["+ i +"] = "+args[i]+”\t”);

} }} Thực thi CT: java ArgsTest this is test Kết quả:

args[0]=this args[1] = is args[2]=test

Page 14: Lap Trinh Mang Voi Java

if-elseif (biểu_thức_điều_kiện)

{

khối_lệnh_1;

}

else

{

khối_lệnh_2;

}

Page 15: Lap Trinh Mang Voi Java

switch-caseswitch (biểu_thức){case giá_trị_1:

khối_lệnh_1; break;case giá_trị_2:

khối_lệnh_2; break;...default:

khối lệnh_n;}

Page 16: Lap Trinh Mang Voi Java

for

for (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;

}

Page 17: Lap Trinh Mang Voi Java

while

while (biểu_thức_điều_kiện)

{

khối_lệnh_lặp;

}

Page 18: Lap Trinh Mang Voi Java

do-while

do

{

khối_lệnh_lặp;

} while (condition);

Page 19: Lap Trinh Mang Voi Java

Lớ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 phát động, sử dụng từ khóa new Biến có kiểu dữ liệu là một lớp có thể tham

chiếu đến một đối tượng thuộc lớp Ví dụ

My_Class object;

object = new My_Class( );

Page 20: Lap Trinh Mang Voi Java

Phươ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ố)

{

} access_specifier: public, protected,

none (default), private modifier: static, final, abstract

Page 21: Lap Trinh Mang Voi Java

Phươ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.

Page 22: Lap Trinh Mang Voi Java

Phương thức [3]

void f ( int i ) { … }

void g ( Object o ) { … }

________

int k=5;

f ( 5 );

f ( k ); // truyền tham trị________

g ( obj ); // truyền tham chiếu

Page 23: Lap Trinh Mang Voi Java

Phươ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.

Page 24: Lap Trinh Mang Voi Java

LỚP TRỪU TƯỢNG Lớp trừu tượng là lớp chỉ có thể dùng để

khai báo biến. Đề khai báo lớp trừu tượng dùng từ khóa

abstract: abstract class Number { . . . }

một lớp trừu tượng có thể chứa các phương thức trừu tượng.

Lớp trừu tượng không thể final.

Page 25: Lap Trinh Mang Voi Java

Interfaces interface là tập hợp các khai báo hàm và

các hằng. lớp cài đặt interface có nghĩa là lớp định

nghĩa các hàm được khai báo trong interface.

interface không tham gia vào cấu trúc phân cấp lớp. 2 lớp không liên quan có thể cài đặt cùng 1 interface.

Page 26: Lap Trinh Mang Voi Java

Khai báo Interface

Cú pháp: interface{…} thân interface chứa các khai báo hàm. các hàm

này mặc định là public và abstract. interface có thể chứa khai báo biến. các biến

này mặc định là là public, static, và final.

Page 27: Lap Trinh Mang Voi Java

Packages

Packages cấu trúc thư mục chứa các lớp và

interface cơ chế để gọi tên các lớp/interface.

Để tạo package thêm lệnh sau vào dòng đầu tiên của “compilation unit”package <package name>;

Để sử dụng lớp/interface trong package, sử dụng lệnh import.

Page 28: Lap Trinh Mang Voi Java

Kế thừa lớp[1] Lớp dẫn xuất kế thừa tập các thuộc tính được

khai báo trong lớp cơ sở.

Lệnh gọi thực thi phương thức khởi tạo của lớp cơ sở phải là câu lệnh đầu tiên trong hàm khởi tạo của lớp dẫn xuất.

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ở.

Page 29: Lap Trinh Mang Voi Java

Kế thừa lớp [2]class A {A () {}A (int i) {}

} // end class A

class B extends A {B () {

[super();]...

}

B (int i, int j) {

super(i);...

}B (int k) {

...}

} // end class B

Page 30: Lap Trinh Mang Voi Java

Kế thừa lớp [3]

class A {

void f () { ... }

public void g (int i) { ... }

} // end class A

class B extends A {

void f () { ... } //[none],protected,public

___ void g (int i) { ... } // public only

} // end class B

Page 31: Lap Trinh Mang Voi Java

Từ 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ở

Page 32: Lap Trinh Mang Voi Java

Kế thừa Interface

Để khai báo 1 lớp cài đặt interface dùng từ khóa implements.

1 lớp có thể cài đặt cùng 1 lúc nhiều interface.

Interface chỉ chứa khai báo hàm. 1 lớp cài dặt interface phải cài đặt tất cả các khai báo hàm.

Các hàm trong interface phải được cài đặt với từ khóa public

Page 33: Lap Trinh Mang Voi Java

Từ 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 xẻ 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

Page 34: Lap Trinh Mang Voi Java

Wrapper 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.

Page 35: Lap Trinh Mang Voi Java

Lớp String [1] Trong Java, một chuỗi ký tự là một đối tượng

thuộc lớp String. Lớp String cung cấp các phương thức để thao

tác trên các chuỗi ký tự 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

một chuỗi. String toLowerCase(): chuyển đổi thành chuỗi

thường. String toUpperCase(): chuyển đổi thành chuỗi

hoa. …

Page 36: Lap Trinh Mang Voi Java

Lớ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”

Page 37: Lap Trinh Mang Voi Java

Lớ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); ]

Page 38: Lap Trinh Mang Voi Java

Exception 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.

try {

Khối_lệnh_cần_thực_hiện;} catch ( ) {

Khối_lệnh_xử_lý_exception;} catch ( ) {

...

} finally {

Khối_lệnh_kết_thúc;}

Page 39: Lap Trinh Mang Voi Java

Các lớp Exception

Page 40: Lap Trinh Mang Voi Java

Xử 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 finallyException

finallyNo exception

try block

Page 41: Lap Trinh Mang Voi Java

Xử lý exception [2]try { byte[] buffer= new byte[128];int len=System.in.read(buffer);System.out.println(

new String(buffer, 0, len) );

} catch ( IOException e ) { e.printStackTrace();

} finally { System.out.println(“Finally.”);

}

Page 42: Lap Trinh Mang Voi Java

Nhậ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

Page 43: Lap Trinh Mang Voi Java

Các lớp và interfaceObject

File FileDescriptor

RandomAccessFileDataInput DataOutput

DataInputStream

BufferedInputStream

LineNumberInputStream

PushBackInputStream

FilterInputStrea

m

InputStream

ByteArrayInputStream

FileInputStream

OutputStream

FileOutputStream

FilterOutputStream

ByteArrayOutputStream

BufferedOutputStream

DataOutputStream

PrintStream

Page 44: Lap Trinh Mang Voi Java

Đọc dữ liệu từ Console[1] Sử dụng đối tượng System.in

try {

byte data[]= new byte[128];

System.out.print(“Enter a string: “);

int len= System.in.read(data);

String str= new String(data, 0, len);

System.out.println(str);

} catch (IOException ex) {

ex.printStackTrace();

}

Page 45: Lap Trinh Mang Voi Java

Đọc dữ liệu từ Console[2] Sử dụng lớp đối tượng BufferedReader

try {

BufferedReader br= new BufferedReader( new InputStreamReader(System.in));

System.out.print(“Enter a string: “);

String str= br.readLine();

System.out.println(str);

} catch (IOException ex) {

ex.printStackTrace();

}

Page 46: Lap Trinh Mang Voi Java

Đọ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];

int len=0;

while (len != -1) {

len= fis.read(buffer);

}

fis.close();

Page 47: Lap Trinh Mang Voi Java

Ghi dữ liệu ra tập tin Xuất dữ liệu, sử dụng lớp đối tượng FileOutputStream

FileOutputStream fos=

new FileOutputStream(…);

String str= “hello”;

fos.write(str.getBytes());

fos.close();

Page 48: Lap Trinh Mang Voi Java

Lập trình Socket Các máy tính trên mạng Internet trao đổi thông

tin sử dụng bộ giao thức TCP/IP. Transport: TCP , UDP Network: IP

Page 49: Lap Trinh Mang Voi Java

Internet 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: getLocalHost(), getByName(String), getAllByName(String).

Ví dụ InetAddress add1=

InetAddress.getLocalHost(); InetAddress add2=

InetAddress.getByName(“localhost”);

Page 50: Lap Trinh Mang Voi Java

Lập trình Socket Máy truyền và máy nhận thiết lập một kết nối

TCP bằng socket.

Socket cho phép truyền nhận dữ liệu trên mạng TCP/IP

Có hai loại socket TCP (Transmission Control Protocol) UDP (User Datagram Protocol)

Page 51: Lap Trinh Mang Voi Java

Socket [1] Java cung cấp hai lớp đối tượng để lập trình

socket java.net.Socket java.net.ServerSocket

Các hàm khởi tạo của lớp Socket1. public Socket (String host, int port) throws UnknownHostException, IOException2. public Socket (InetAddress address, int port) throws IOException3. public Socket (String host, int port, InetAddress localaddr, int localPort) throws IOException4. public Socket (InetAddress addr, int localport, boolean b ) throws IOException

Page 52: Lap Trinh Mang Voi Java

Socket [2] Các phương thức thao tác trên Socket

1. public InputStream getInputStream() throws IOException

2. public OutputStream getOutputStream() throws IOException

3. public void close() throws IOException

Page 53: Lap Trinh Mang Voi Java

ServerSocket [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

Page 54: Lap Trinh Mang Voi Java

ServerSocket [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

Page 55: Lap Trinh Mang Voi Java

Lập trình Server TCP Tạo ServerSocket Gọi thực thi phương thức accept() để chấp

nhận thiết lập kết nối với Client => nhận được Socket giao 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

Page 56: Lap Trinh Mang Voi Java

Server 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();

Page 57: Lap Trinh Mang Voi Java

Lậ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

Page 58: Lap Trinh Mang Voi Java

Client TCP

Socket sk = new Socket(“10.0.0.1”, 1234);

InputStream is= sk.getInputStream();

OutputStream os= sk.getOutputStream();

String msg=“hello”;

os.write(msg.getBytes());

sk.close();

Page 59: Lap Trinh Mang Voi Java

DatagramSocket [1] UDP là giao thức cho phép gửi/nhận từng gói

tin đơn lẻ Java cung cấp lớp java.net.DatagramSocket

để lập trình UDP socket 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

Page 60: Lap Trinh Mang Voi Java

DatagramSocket [2] Các phương thức thác tác trên DatagramSocket1. public void send(DatagramPacket p) throws IOException

2. public void receive(DatagramPacket p) throws IOException

3. public void close()

4. public int getLocalPort()

Page 61: Lap Trinh Mang Voi Java

DatagramPacket[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 DatagramPacket1. public DatagramPacket (byte[] buffer, int length)

2. public DatagramPacket (byte[] buffer, int length, InetAddress addr, int port)

Page 62: Lap Trinh Mang Voi Java

DatagramPacket [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()

Page 63: Lap Trinh Mang Voi Java

Lậ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.

Page 64: Lap Trinh Mang Voi Java

Server UDP

DatagramSocket dsk= new DatagramSocket(1234);byte[] buffer= new byte[128];DatagramPacket pk= new DatagramPacket(

buffer, 128);dsk.receive(pk);System.out.println(“Client: ” + pk.getAddress() + ”:” + pk.getPort());

System.out.println(new String(buffer, 0, pk.getLength()));

dsk.close();

Page 65: Lap Trinh Mang Voi Java

Lậ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.

Page 66: Lap Trinh Mang Voi Java

Client UDP

DatagramSocket dsk= new DatagramSocket();

String msg= “abc”;

InetAddress addr= InetAddress.getByName(“10.0.0.1”);

DatagramPacket pk= new DatagramPacket(

msg.getBytes(), msg.length(), addr, 1234);

dsk.send(pk);

dsk.close();