Tải bản đầy đủ (.pdf) (66 trang)

Bài giảng lập trình ứng dụng mạng bài 2 GV võ tấn dũng

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 (491.15 KB, 66 trang )

TRƯỜNG CAO ĐẲNG CÔNG NGHỆ THÔNG TIN TP.HCM

LẬP TRÌNH ỨNG DỤNG MẠNG

BÀI 2

GIẢNG VIÊN:

VÕ TẤN DŨNG

GV: Võ Tấn Dũng

L
ẬP TRÌNH SOCKET
LẬP


KHÁI NIỆM SOCKET

„

„

Socket là một phương pháp để thiết lập kết nối truyền
thông giữa một chương trình yêu cầu dịch vụ (client)
và một chương trình cung cấp dịch vụ (server) trên
mạng LAN, WAN hay Internet.
Trước khi yêu cầu dịch vụ từ máy chủ thì máy khách
phải kết nối đến máy chủ. Quá trình kết nối này được
Java thực hiện thông quá một cơ chế trừu tượng
hóa gọi là Socket.


Việc kết nối thông qua Socket cần hai thông tin chủ
yếu đó là địa chỉ của máy cần kết nối và số hiệu
cổng của chương trình dịch vụ.
2

GV: Võ Tấn Dũng

„


PHẦN 1

GV: Võ Tấn Dũng

LLớp
ớp InetAddress
InetAddress
&
ớp URL
& llớp
URL


Lớp InetAddress

„

Lớp InetAddress được sử dụng để biểu diễn các địa
chỉ IP trong một ứng dụng mạng. Lớp này được sử
dụng bởi hầu hết các lớp mạng, bao gồm Socket,

ServerSocket, URL, DatagramSocket,
DatagramPacket,…
Nó bao gồm hai trường thông tin: hostName (một đối
tượng kiểu String) và address (một số kiểu int). Các
trường này không phải là trường public, vì thế ta
không thể truy xất chúng trực tiếp.

4

GV: Võ Tấn Dũng

„


Lớp InetAddress
„

Lớp InetAddress không có các constructor cho lớp
InetAddress. Tuy nhiên, có ba phương thức tĩnh trả về
các đối tượng InetAddress:
– public static InetAddress InetAddress.getByName(String
hostname)
– public static InetAddress[] InetAddress.getAllByName(String
hostname)
– public static InetAddress InetAddress.getLocalHost()

Tất cả các phương thức này đều thực hiện kết nối tới
server DNS cục bộ để biết được các thông tin trong
đối tượng InetAddress.


5

GV: Võ Tấn Dũng

„


Lớp InetAddress
Ví dụ: Phương thức getByName này nhận tên của
hostname làm tham số và trả về đối tượng kiểu
InetAddress
try{
InetAddress dc =InetAddress.getByName(“www.microsoft.com”);
System.out.println(dc);
}
catch(UnknownHostException e)
{
System.err.println(e);
}

6

GV: Võ Tấn Dũng

„


Lớp InetAddress
Ví dụ 1:Viết chương trình nhận hostname từ đối dòng lệnh và in ra địa chỉ IP
tương ứng với hostname đó.

import java.net.*;
public class TimDCIP
{ public static void main(String[] args)
{try{ if(args.length!=1)
{ System.out.println("Cach su dung: java TimDCIP <Hostname>");}
InetAddress host = InetAddress.getByName(args[0]);
String hostName = host.getHostName();
System.out.println("Host name:"+hostName);
System.out.println("Dia chi IP:"+host.getHostAddress());
} catch(UnknownHostException e)
{
System.out.println("Khong tim thay dia chi");
return;
}
}
}
7

GV: Võ Tấn Dũng

„


Lớp InetAddress

8

GV: Võ Tấn Dũng

Có thể đọc các trường của InetAddress bằng cách gọi

phương thức getHostname và getAddress():
„ public String getHostName(): Phương thức này trả
về một chuỗi biểu diễn hostname của một đối tượng
InetAddress. Nếu máy không có hostname, thì nó sẽ
trả về địa chỉ IP của máy này dưới dạng một xâu ký tự.
„ public byte[ ] getAddress() : Nếu bạn muốn biết địa
chỉ IP của một máy, phương thức getAddress() trả về
một địa chỉ IP dưới dạng một mảng các byte.


Lớp InetAddress
Ví dụ: Viết chương trình nhập một hostName từ đối dòng lệnh và in ra dòng thông báo
cho biết địa chỉ IP tương ứng với địa chỉ IP đó thuộc lớp nào.
import java.net.*;
public class PhanLoaiDCIP
{ public static void main(String[] args)
{try{ if(args.length!=1) {System.out.println("Cach su dung: java TimDCIP <Hostname>");}
InetAddress host = InetAddress.getByName(args[0]);
String hostName = host.getHostName();
System.out.println("Host name:"+hostName);
System.out.println("Dia chi IP:"+host.getHostAddress());
byte[] b=host.getAddress();
int i=b[0]>=0?b[0]:256+b[0];
if((i>=1)&(i<=126)) System.out.println(host+" thuoc dia chi lop A");
if((i<=191)&(i>=128)) System.out.println(host+" thuoc dia chi lop B");
if((i<=223)&(i>=192)) System.out.println(host+" thuoc dia chi lop C");
} catch(UnknownHostException e) { System.out.println("Khong tim thay dia chi");
return;
}
}

9
}

GV: Võ Tấn Dũng

„


Lớp URL
Lớp java.net.URL là một khái niệm về bộ định vị tài
nguyên thống nhất. Một URL gồm 3 phần:
– Giao thức (protocol),
– Hosname (có thể là một địa chỉ hay tên máy chủ) và
cổng (port),
– Đường dẫn (path) chỉ đến tên tập tin (filename) hay
mục tài liệu (document section) mà máy client muốn
lấy từ máy chủ về.
Ví dụ: :80/xyz/index.html
10

GV: Võ Tấn Dũng

„


Lớp URL
Đối tượng URL có các constructor sau:
– public URL(String url)
throws MalformedURLException
– public URL(String protocol, String host, String file)

throws MalformedURLException
– public URL(String protocol, String host, int port, String file)
throws MalformedURLException
– public URL(URL u, String s)
throws MalformedURLException

11

GV: Võ Tấn Dũng

„


Lớp URL
„
„

public URL(String url) throws MalformedURLException
Đây là constructor đơn giản nhất; tham số của nó chỉ là một
URL ở dạng chuỗi.

Ví dụ
try{
}
catch(MalformedURLException e)
{
System.err.println(e);
}
12


GV: Võ Tấn Dũng

URL u = new URL(“ />

Lớp URL
public URL(String protocol, String host, String file)
throws MalformedURLException
„ Đối số truyền vào gồm 3 chuỗi tương ứng với: giao
thức, hostname và đường dẫn đến tài nguyên. Không
có đối số port (có nghĩa là dùng cổng mặc định).
Ví dụ
try{
URL u = new URL
(“http”,”/www.sun.com”,”index.html”);
}catch(MalformedURLException e){
System.err.println(e);
}
13

GV: Võ Tấn Dũng

„


Lớp URL
public URL(String protocol, String host, int port, String
file) throws MalformedURLException
„ Constructor này cho phép bạn xác định cổng một cách
rõ ràng kiểu int.
„ Ví dụ:

try{
URL u = new URL(“http”,”/www.sun.com”,80,”index.html”);
}
catch(MalformedURLException e)
{
System.err.println(e);
}
14

GV: Võ Tấn Dũng

„


„
„

„

public URL(URL u, String s) throws MalformedURLException
Ví dụ
URL u1,u2;
try{
URL u1= new URL(“ />URL u2 = new URL(u1,”vendor.html”);
}
catch(MalformedURLException e)
{
System.err.println(e);
}
Tên file sẽ được loại khỏi đường dẫn của u1, và tên file mới

vendor.html được gán vào để tạo lên u2. Constructor này đặc biệt hữu
ích khi bạn muốn duyệt qua một danh sách các file mà tất cả cùng nằm
trong một thư mục.
15

GV: Võ Tấn Dũng

Lớp URL


Một số phương thức khác của lớp URL
„

public final Object getContent(): throws IOException lấy về nội
dung mà kết nối theo địa chỉ URL có được.

„

String getFile(): lấy về thành phần tên tập tin hay tài liệu nằm trong
chuỗi địa chỉ URL.

„

String getHost(): lấy tên máy chủ, thường là thành phần thứ hai
trong chuỗi URL.

„

String getProtocol(): lấy về tên giao thức, là thành phần thứ hai
trong chuỗi URL.


„

String getPort(): lấy về số hiệu cổng.
String getRef(): lấy về nội dung tham khảo

thêm trong chuỗi URL

(nằm sau dấu # trong một URI)

16

GV: Võ Tấn Dũng

„


Ví dụ về lớp URL
Ví dụ: đoạn mã sau đây dùng để lấy về nội dung trang
web index.html từ máy chủ có địa chỉ java.sun.com
try{

//mở kết nối đến trang web theo định vị URL
URL o=new URL( />//tạo luồng nhập để đọc nội dung trang web trả về từ máy chủ
BufferedReader inStream=new BufferedReader(new
InputStreamReader(o.openStream()));
//in nội dung trang web index.html ra màn hình
String line;
while((line=in.readLine())!=null)
{

System.out.println(line);
}
}catch (Exception e)
{
//quá trình mở và kết nối đến trang web bị lỗi
System.out.println(e);
}

17

GV: Võ Tấn Dũng

„


PHẦN 2

GV: Võ Tấn Dũng

C
ác llớp
ớp Socket
Các


Một số lớp Socket và Datagram
„
„
„


„

Lớp Socket
Lớp ServerSocket
Lớp DatagramSocket
Lớp DatagramPackage
Chú ý: Lập trình Socket truyền dữ liệu sẽ liên quan
đến hai giao thức ở tầng Transport (trong mô hình
tham chiếu 7 tầng OSI), đó là giao thức truyền tin cậy
TCP và truyền không tin cậy UDP.

19

GV: Võ Tấn Dũng

„


Socket class cho Client
„
„

Lớp Socket dùng tạo kết nối từ máy khách đến máy chủ
thường được khởi dựng bằng các phương thức sau:
public Socket(String host, int port) throws
UnknownHostException, IOException
Hàm này tạo một socket TCP với host và cổng xác định, và thực hiện
liên kết với host ở xa.

public Socket(InetAddress host, int port)throws IOException

Tương tự như constructor trước, constructor này tạo một socket TCP
với thông tin là địa chỉ của một host được xác định bởi một đối tượng
InetAddres và số hiệu cổng port, sau đó nó thực hiện kết nối tới host.
Nó đưa ra ngoại lệ IOException nhưng không đưa ra ngoại lệ
UnknownHostException. Constructor đưa ra ngoại lệ trong trường hợp
không kết nối được tới host.

20

GV: Võ Tấn Dũng

„


Socket class cho Client
„

public Socket (String host, int port, InetAddress
interface, int localPort) throws IOException,
UnknownHostException
Constructor này tạo ra một socket với thông tin là địa chỉ IP được biểu
diễn bởi một đối tượng String và một số hiệu cổng và thực hiện kết nối
tới host đó. Socket kết nối tới host ở xa thông qua một giao tiếp mạng
và số hiệu cổng cục bộ được xác định bởi hai tham số sau. Nếu
localPort bằng 0 thì Java sẽ lựa chọn một cổng ngẫu nhiên có sẵn nằm
trong khoảng từ 1024 đến 65535.

public Socket (InetAddress host, int port, InetAddress
interface, int localPort) throws IOException,
UnknownHostException

Constructor chỉ khác constructor trên ở chỗ địa chỉ của host lúc này
được biểu diễn bởi một đối tượng InetAddress.
21

GV: Võ Tấn Dũng

„


Socket class cho Client
Một số phương thức hỗ trợ cho lớp Socket:
„ InputStream getInputStream() throws IOException:
lấy về luồng nhập để máy khách có thể đọc dữ liệu trả về từ máy chủ.
„

OutputStream getOutputStream() throws
IOException: lấy về luồng xuất để máy khách có thể ghi dữ liệu
gửi đến máy chủ.

„

InetAddress getInetAddress(): lấy địa chỉ kết nối socket của
máy chủ.

„

int getPort(): lấy về số cổng dùng kết nối của máy chủ.
synchronized void close() throws IOException: cắt
đứt kết nối với máy chủ


22

GV: Võ Tấn Dũng

„


Các VD về Socket cho Client
„

public Socket(String host, int port) throws
UnknownHostException, IOException: hàm này tạo một socket TCP
với host và cổng xác định, và thực hiện liên kết với host ở xa.

Ví dụ:
try{
Socket s = new Socket( “www.vnn.vn”,80);
}
catch(UnknownHostException e){
System.err.println(e);
}
catch(IOException e){
System.err.println(e);
}
23

GV: Võ Tấn Dũng

„



Ví dụ: Viết chương trình để kiểm tra trên 1024 cổng đầu tiên những cổng nào đang có server hoạt động
import java.net.*; import java.io.*;
class PortScanner
{
public static void main(String[] args)
{
String host="localhost";
if(args.length>0){
host=args[0];
}
for(int i=0;i<1024;i++){
try{
Socket s=new Socket(host,i);
System.out.println("Co mot server dang hoat dong tren cong:"+i);
}
catch(UnknownHostException e){
System.err.println(e);
}
catch(IOException e){
System.err.println(e);
}
}
}
}
24

GV: Võ Tấn Dũng

Các VD về Socket cho Client



Các VD về Socket cho Client
Ví dụ: đoạn mã sau sẽ thực hiện kết nối với máy chủ có địa
chỉ “my.testing.server” và mở ra hai luồng xuất nhập để đọc
và gửi thông tin đến máy chủ theo số cổng 1234.
try{
Socket me=new Socket(“my.testing.server”,1234);
//luồng nhập để đọc thông tin trả về từ máy chủ kết nối

DataInputStream in = new
DataInputStream(me.getInputStream());
DataOutputStream out = new
DataOutputStream(me.getOutputStream());
}catch (Exception e) {System.out.println(e); }
25

GV: Võ Tấn Dũng

//luồng xuất để ghi thông tin gửi đến máy chủ


×