80
Chapter 8 Lập trình mạng với Java - TCP Socket GV: Nguyễn Thị Thanh Vân - CNTT 1

Chapter 8.1. network program with java tcp

Embed Size (px)

Citation preview

Page 1: Chapter 8.1. network program with java tcp

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

TCP SocketGV: Nguyễn Thị Thanh Vân - CNTT

1

Page 2: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 2 of 45

Giao tiếp Socket◦Đặc điểm, cấu trúc Socket◦TCP Socket◦UDP Socket

Thiết kế giải thuật server/client Các lớp trong gói java.net Ứng dụng client/server qua TCP socket Ứng dụng client/server qua UDP socket

Objectives

2

Page 3: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 3 of 45

Trong quá trình truyền tin có thể xảy ra nhiều sự cố:◦một hay nhiều gói bị mất hay bị hỏng ◦cần phải truyền lại hay không hoặc ◦các gói tin đến không theo đúng trình tự.

Cần xử lý;◦việc phân chia dữ liệu thành các gói, ◦ tạo các header, phân tích header của các gói đến, ◦quản lý danh sách các gói đã nhận được/ chưa nhận

được… => nhiều công việc cần phải thực hiện, và đòi hỏi rất

nhiều phần mềm phức tạp để xử lý.=> Socket

Giới thiệu

3

Page 4: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 4 of 45

Socket API – Socket Application Programming Interface: ◦ là một cuộc cách mạng của Berkeley UNIX. ◦được giới thiệu ở BSD4.1 UNIX, 1981

Xuất phát từ ý tưởng quan trọng nhất của UNIX: ◦ tất cả các thao tác vào/ra giống như vào ra tệp tin

Socket xem một liên kết mạng như là một luồng mà có thể đọc dữ liệu ra hay ghi dữ liệu vào từ luồng này. ◦Nó che dấu người lập trình khỏi các chi tiết mức thấp

của mạng như môi kiểu đường truyền, các kích thước gói, yêu cầu truyền lại gói, các địa chỉ mạng...

Giới thiệu

4

Page 5: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 5 of 45

Socket: ◦“cơ chế ổ cắm”◦Các máy có khả năng kết nối được với nhau.◦Dùng cơ chế client/server

Cung cấp hai dịch vụ chính chuyển dữ liệu thông qua socket API:◦unreliable datagram (UDP)◦reliable, byte stream-oriented (TCP)

KHÁI NIỆM VỀ SOCKET

5

Page 6: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 6 of 45

Socket trong TCP/IP Model

6

Page 7: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 7 of 45

Socket trong TCP/IP Model

7

Page 8: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 8 of 45

socket được định nghĩa trong hệ điều hành bằng một cấu trúc, được xem như điểm nối để hai procceses giao tiếp với nhau.

Cấu trúc socket gồm 5 fields:◦Family : xác định protocol group◦Type : xác loại socket, stream, datagram hay raw

socket.◦Protocol : kieu gthuc. thường gán giá trị bằng 0◦Local Socket Address và ◦Remote Socket Address : là địa chỉ socket của

process cục bộ và từ xa.

Socket

8

Page 9: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 9 of 45

Cấu trúc socket

9

Page 10: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 10 of 45

Địa chỉ của một socket trên mạng TCP/IP gồm có hai phần:◦Địa chỉ IP: một số nguyên 32 bits xác định duy nhất một

card mạng trên máy tính (host)◦Cổng dịch vụ: một số nguyên 16 bits xác định điểm kết

nối với một ứng dụng trên một host. Các ứng dụng thương mại hay các dịch vụ thông dụng sử dụng các cổng dịch vụ chuẩn đã được đăng ký

Địa chỉ của một socket

10

Page 11: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 11 of 45

Ví dụ mô tả đặc trưng địa chỉ IP và port trong các socket giao tiếp 3 dịch vụ khác nhau

SERVERIP: 192.168.0.1

HTTP-SERVER

FTP-SERVER

SQL-SERVER

Port 80

Port 21

Port 1433

CLIENTIP: 192.168.0.15

Web browser

FTP-client

data application

Kết nối với socket(192.168.0.1, 80)

Kết nối với socket(192.168.0.1, 21)

Kết nối với socket(192.168.0.1, 1433)

Page 12: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 12 of 45

struct sockaddr_in{u_char sin_len;u_short sin_family;u_short sin_port;struct in_addr sin_addr;char sin_zero[8];};

Cấu trúc địa chỉ socket

12

Page 13: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 13 of 45

1. Hàm socket() để tạo mới một socket2. Hàm bind() Đăng ký socket đã khởi tạo với địa chỉ

socket local. Trả về 0 nếu thành công, -1: thất bại.3. Hàm connect() để client kết nối đến server4. Hàm listen() đặt socket ở trạng thái chờ, lắng nghe

kết nối từ phía client5. Hàm accept() : chấp nhận kết nối từ client đến6. Hàm read() để đọc dữ liệu từ socket vào bộ nhớ7. Hàm write() để ghi dữ liệu từ bộ nhớ -> socket8. Hàm sendto() để gởi dữ liệu đến một socket từ xa9. Hàm recvfrom(): nhận dữ liệu đến từ 1 socket từ xa

Các hàm socket (in System Calls Interface )

13

Page 14: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 14 of 45

Stream Socket: dùng cho connection-oriented protocol như TCP.

Datagram Socket: dùng cho connectionless protocol như UDP.

Raw Socket: dùng cho một số protocol của một số ứng dụng đặc biệt, dùng các dịch vụ trực tiếp của lớp IP.

Các loại Socket

14

Page 15: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 15 of 45

Có thể sử dụng để liên lạc theo mô hình client/server

Có 1 đường kết nối ảo giữa 2 phía Server/client

Một trong 2 phía phải đợi tiến trình kia yêu cầu kết nối◦Server lắng nghe và chấp nhận yêu cầu kết nối◦Mỗi thông điệp gửi đều có xác nhận trở về◦Các gói tin chuyển đi tuần tự

TCP socket – đặc điểm

15

Page 16: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 16 of 45

Client phải kết nối đến server ◦ server process phải chạy trước (phần tử thụ động)◦ server phải tạo một socket để lắng nghe và chấp nhận các kết nối

từ client Client kết nối đến server bằng cách:

◦ Khởi tạo TCP socket ở local◦ Xác định IP address, port number của server process và kết nối

đến Sau khi client khởi tạo socket, nó sẽ thiết lập kết nối đến

server Khi server nhận yêu cầu kết nối, nó sẽ chấp nhận yêu cầu

và khởi tạo socket mới để giao tiếp với client.◦ Cho phép server chấp nhận nhiều client tại một thời điểm.

TCP socket – hoạt động

16

Page 17: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 17 of 45

TCP socket - hoạt động

17

Page 18: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 18 of 45

Cung cấp cơ chế truyền không tin cậy các nhóm bytes (datagrams) giữa client và server.

Không cần thiết lập kết nối giữa client với server. Client phải gởi kèm địa chỉ IP và port đích Server khi nhận dữ liệu sẽ phân tích địa chỉ của

client để truyền lại.--

◦Thông điệp có thể gửi nhiều lần◦Người gửi không chắc chắn thông điệp tới người nhận◦Thông điệp sau có thể đến đích trước thông điệp gửi

trước nó

UDP socket – đặc điểm

18

Page 19: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 19 of 45

UDP socket – hoạt động

19

Page 20: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 20 of 45

Một trong 2 quá trình phải công bố số hiệu cổng của socket mà mình sử dụng

Mỗi cổng giao tiếp thể hiện 1 địa chỉ xác định trong hệ thống

Có thể nhận dữ liệu gửi đến cổng giao tiếp này từ các quá trình khác.

Số hiệu cổng của socket

20

Page 21: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 21 of 45

Thiết kế giải thuật cho client/Server. Công cụ viết

◦Dùng các class trong Java Example

Viết các ứng dụng Socket

21

Page 22: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 22 of 45

Giải thuật cho chương trình client/Server dùng TCP

Giải thuật cho chương trình client/Server dùng UDP

Chương trình server có hai loại: ◦Lặp (iterative) ◦Đồng thời (concurrent).

Hai dạng giao thức chương trình server: ◦Connection-oriented (TCP)◦Connectionless. (UDP)

Thiết kế giải thuật cho client/Server

22

Page 23: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 23 of 45

Client1. Xác định địa chỉ server.2. Tạo socket.3. Kết nối đến Server4. Gởi/nhận dữ liệu theo giao thức đã thiết kế.5. Đóng socket.

Server1. Tạo socket 2. Đăng ký với hệ thống3. Lắng nghe kết nối4. Chấp nhận kết nối 5. Gửi nhận dữ liệu theo đúng giao thức đã thiết kế.6. Đóng kết nối sau khi đã hoàn thành và trở lại trạng thái lắng

nghe chờ kết nối mới

Giải thuật cho client/Server TCP

23

Page 24: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 24 of 45

Client1. Xác định địa chỉ server.2. Tạo socket.3. Gởi/nhận dữ liệu theo giao thức đã thiết kế.4. Đóng socket.

Server1. Tạo socket 2. Đăng ký với hệ thống3. Lặp công việc đọc dữ liệu từ client gửi đến và gửi trả kết

quả cho client theo đúng giao thức lớp ứng dụng đã thiết kế.

4. Đóng Socket

Giải thuật cho client/Server UDP

24

Page 25: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 25 of 45

Tạo socket và đăng ký với hệ thống Đặt socket ở chế độ chờ, lắng nghe kết nối. Khi có request từ client, Server sẽ:

◦chấp nhận kết nối, ◦ tạo một process con để xử lý. ◦Quay lại trạng thái chờ, lắng nghe kết nối mới

Công việc của process con:◦Nhận thông tin kết nối của client◦Giao tiếp với client theo giao thức lớp ứng dụng đã thiết

kế◦Đóng kết nối và kết thúc process con.

Đóng socket

Thiết kế giải thuật cho Server – concurrent, connection-oriented (TCP)

25

Page 26: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 26 of 45

Tạo socket và đăng ký với hệ thống Lặp công việc nhận dữ liệu từ client, đối với một dữ

liệu nhận:◦ tạo mới một process để xử lý. ◦Tiếp tục nhận dữ liệu mới từ client

Công việc của process mới:◦Nhận thông tin của process cha chuyển đến, lấy thông tin

socket◦Xử lý và gửi thông tin về cho client theo giao thức lớp ứng

dụng đã thiết kế◦Kết thúc

Thiết kế giải thuật cho Server – concurrent, connectionless (UDP)

26

Page 27: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 27 of 45

Dùng một chương trình, mở một master socket cho cả TCP và UDP.

Dùng hàm hệ thống (select) để chọn lựa TCP socket hay UDP socket sẵn sàng.

Tùy vào protocol (TCP, UDP) để xử lý gửi nhận thông điệp theo đúng giao thức của lớp ứng dụng

Ref RFC 1060

Thiết kế giải thuật server – multi-protocol Server (TCP/UDP)

27

Page 28: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 28 of 45

Gói java.net cung cấp các lớp1. InetAddress2. URL3. URLConnection4. ServerSocket5. Socket6. DatagramSocket7. DatagramPacket

Lập trình mạng trên Java

28

Dùng cho TCP Socket

Dùng cho UDP Socket

Page 29: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 29 of 45

Phục vụ việc quản lý địa chỉ theo IP và tên. Cung cấp các phương thức thông dụng nhất dùng

để chuyển đổi và truy xuất IP Nó bao gồm hai trường thông tin: (không thể truy

xất chúng trực tiếp)◦ hostName (một đối tượng kiểu String) và ◦ address (một số kiểu int).

Lớp InetAddress không có các constructor cho lớp InetAddress

Có các phương thức:

InetAddress class

29

Page 30: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 30 of 45

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: public static InetAddess getLocalHost()throws

UnknownHostExceptiongetByName Trả về InetAddress là IP của local public static InetAddess getByName(String

hostname) throws UnknownHostException: Nhận tên host và trả về InetAddress (name và IP address) public static InetAddess [] getAllByName

(String hostname) throws UnknownHostExceptionNhận địa chỉ host dạng String và trả về tất cả InetAddress tương ứng với host (name và IP address)

InetAddress class

30

Page 31: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 31 of 45

Nhận các trường thông tin của một đối tượng InetAddress: Chỉ có các lớp trong gói java.net có quyền truy xuất tới các

trường của lớp InetAddress. bằng các phương thức:

public byte[] getAddress()Trả về một địa chỉ IP dưới dạng một mảng các byte.

public String getHostAddress()Trả về một địa chỉ IP dưới dạng String "%d.%d.%d.%d"

public String getHostName()Trả về một xâu biểu diễn hostname của một đối tượng

InetAddress. Nếu máy không có hostname, thì sẽ trả về "%d.%d.%d.%d"

InetAddress class

31

Page 32: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 32 of 45

import java.net.*;public class HostInfo {public static void main(String args[]) {try {InetAddress myHost = InetAddress.getLocalHost();System.out.println(myHost.getHostAddress());System.out.println(myHost.getHostName());} catch (UnknownHostException ex) {System.err.println("Cannot find local host");}}}

Ex: In địa chỉ IP và name củalocalhost

32

Page 33: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 33 of 45

import java.net.*; class Print_IP{ public static void main (String args[]) { try { InetAddress[] addresses = InetAddress.getAllByName("www.google.com"); for (int i = 0; i < addresses.length; i++) { System.out.println(addresses[i]); } } catch (UnknownHostException e) { System.out.println("Could not find www.google.edu.vn"); } } }

Ex: In IP của www.google.com

33

Page 34: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 34 of 45

URL(Uniform Resource Locator) là địa chỉ định vị tài nguyên trên mạng,

Một URL thường bao gồm 3 phần: ◦Protocol◦Hostname◦Filename. ◦(port)

Java đóng gói tất cả vào một lớp URL. Đối tượng URL được tạo ra bằng một trong

những phương thức khởi tạo sau:

URL

34

Page 35: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 35 of 45

public URL(String spec) throws MalformedURLException

Tạo một đối tượng URL từ địa chỉ định vị là một chuỗi. (simple) public URL(String pro, String host, int port, String file) throws MalformedURLException

Tạo một địa chỉ định vị tuyệt đối với đầy đủ nghi thức(protocol), máy chủ(server), cổng(port), đường dẫn(file) tới tập tin cần lấy trên máy chủ. public URL(String protocol, String host, String file) throws MalformedURLException Tạo một địa chỉ định vị tuyệt đối với đầy đủ protoccol, server, path file

URL class - Constructors

35

Page 36: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 36 of 45

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ề tên tập tin hay tài liệu nằm trong chuỗi địa chỉ URL có được.

String getHost() :Lấy tên máy chủ (thường là thành phần thức 2 của chuỗi URL)

String getPort() :Lấy về số hiệu cổng. String getProtocol() :Lấy về tên giao thức(thường là

thành phần đầu tiên trong chuỗi URL) String getRef() :Lấy về nội dung chuỗi tham khảo

thêm trong chuỗi URL (được đặt sau dấu # của chuỗi)

Phân tích một URL thành các thành phần

36

Page 37: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 37 of 45

import java.net.*;import java.io.*;

public class GetURLInfor { public static void main(String[] args) throws Exception {

URL aURL = new URL("http://google.com:80/docs/books/tutorial" + "/index.html?name=networking#DOWNLOADING");

System.out.println("protocol = " + aURL.getProtocol()); System.out.println("authority = " + aURL.getAuthority()); System.out.println("host = " + aURL.getHost()); System.out.println("port = " + aURL.getPort()); System.out.println("path = " + aURL.getPath()); System.out.println("query = " + aURL.getQuery()); System.out.println("filename = " + aURL.getFile()); System.out.println("ref = " + aURL.getRef()); }}

URL class - ex

37

Page 38: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 38 of 45

public final InputStream openStream() throws IOException:

kết nối tới một tài nguyên được tham chiếu bởi một URL, thực hiện mở luồng nhập để đọc thông tin trả về từ máy chủ public URLConnection openConnection() throws java.io.IOException:

Mở một socket tới một URL xác định và trả về một đối tượng URL. public final Object getContent() throws java.io.IOException:

Cung cấp cách tải dữ liệu được tham chiếu bởi một URL

Tìm kiếm dữ liệu từ một URL

38

Page 39: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 39 of 45

import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.URL;public class getText { public static void main(String[] argv) throws Exception { URL url = new URL("http://tintuconline.com.vn/vn/index.html"); BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); String str; while ((str = in.readLine()) != null) { System.out.println(str); } in.close(); }}

URL class: ex get text

39

Page 40: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 40 of 45

URLConnection là một lớp trừu tượng biểu diễn một liên kết tích cực tới một tài nguyên được xác định bởi 1 URL.

Ý nghĩa của lớp URLConnection:◦ Cung cấp nhiều khả năng điều khiển hơn thông qua việc tương

tác với một server chứ không phải lớp URL: • kiểm tra các headerMIME được gửi bởi một Http Server. • tải về các tệp nhị phân. • gửi dữ liệu trở lại Web server bằng lệnh POST.

◦ Là một phần của cơ chế quản trị giao thức• phân tích các chi tiết xử lý một giao thức với việc xử lý

các kiểu dữ liệu cụ thể, • cung cấp các giao diện người dùng, và thực hiện các

công việc khác mà một trình duyệt thường làm.

URLConnection class

40

Page 41: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 41 of 45

Một chương trình sử dụng lớp URLConnection trực tiếp theo một dãy các bước cơ bản sau: ◦Xây dựng một đối tượng URL. ◦Gọi phương thức openConnection() của đối tượng

URL để tìm kiếm một đối tượng URLConnection cho URL đó.

◦Cấu hình đối tượng URL. ◦Đọc các trường header. ◦Nhận một luồng nhập và đọc dữ liệu. ◦Nhận một luồng xuất và ghi dữ liệu. ◦Đóng liên kết.

Mở các URLConnection

41

Page 42: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 42 of 45

u= new URL("http://www.microsoft.com"); URLConnection uc; uc=u.openConnection();

Ex, xây dựng 1 URLConnection

42

Page 43: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 43 of 45

public Object getContent() throws IOException chỉ làm việc khi Java có một trình quản lý nội dung cho kiểu nội dung. tải về đối tượng được chọn bởi URL của URLConnection này. public InputStream getInputStream() luồng này cho phép tự đọc và phân tích dữ liệu. public OutputStream getOutputStream() ghi dữ liệu vào một URLConnection. Trả về một luồng OutputStream trên đó có thể ghi dữ liệu để truyền tới một server. Phải gọi phương thức setDoOutput() trước khi yêu cầu một luồng xuất. (URLCon. ko cho phép xuất default)

Methods: read/write data

43

Page 44: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 44 of 45

Các bước tối thiểu cần để tìm kiếm dữ liệu từ một URL bằng cách sử dụng đối tượng URLConnection: ◦Bước 1: Xây dựng một đối tượng URL. ◦Bước 2: Gọi phương thức openConnection() của

lớp URL để tìm kiếm một đối tượng URL Connection cho đối tượng URL đó.

◦Bước 3: Gọi phương thức getInputStream(). ◦Bước 4: Đọc từ luồng nhập bằng cách sử dụng

API.

Đọc dữ liệu từ một server

44

Page 45: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 45 of 45

import java.net.*; import java.io.*; public class getText { public static void main(String[] args) throws MalformedURLException { String thisLine; URL u; URLConnection uc; u =new URL("http://www.hcmute.edu.vn"); try{ uc=u.openConnection(); DataInputStream theHtml = new DataInputStream(uc.getInputStream()); try{ while((thisLine=theHtml.readLine())!=null) System.out.println(thisLine); } catch(Exception e) { System.err.println(e); } } catch(Exception e) { System.err.println(e); } } }

Ex, get source web hcmute.edu.vn

45

Page 46: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 46 of 45

try{ URL u = new URL(http://www.hcmute.edu.vn); URLConnection uc = u.openConnection(); uc.setDoOutput(true); DataOutputStream dos = new DataOutputStream(uc.getOutputStream()); dos.writeByte(“Here is some data”); } catch(Exception e) { System.err.println(e); }

Ex: send data to server

46

Page 47: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 47 of 45

HTTP Server cung cấp một số lượng thông tin đáng kể trong các header MIME trước mỗi đáp ứng.

Thông tin trong các header MIME có thể:◦ cơ chế mã hóa nội dung được sử dụng, ◦ chiều dài của nội dung được trả về bằng byte◦ ngày và giờ truy nhập cuối ◦ ngày hết hạn của nội dung, ◦ ngày mà nội dung được sửa đổi lần cuối.

Có thể truy vấn một URLConnection để tìm ra thông tin MIME nào mà server đã cung cấp.

Ngoài HTTP, rất ít giao thức sử dụng các header MIME.

Phân tích Header

47

Page 48: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 48 of 45

public String getContentType() trả về kiểu nội dung MIME của dữ liệu. Nó phụ thuộc vào web server gửi một header MIME tương ứng. Các kiểu nội dung phổ biến khác bao gồm: text/plain, image/gif, image/jpeg. public int getContentLength() cho biết nội dung có kích thước bao nhiêu byte. public String getContentEncoding() trả về String cho ta biết cách thức mã hóa. Nếu nội dung được gửi không được mã hóa (như trong trường hợp của HTTP server), public long getDate() trả về một số nguyên kiểu long cho bạn biết tài liệu đã được gửi khi nào. Ta có thể chuyển đổi nó sang một đối tượng kiểu java.util.Date. public long getExpiration() public long getLastModified()

Methods

48

Page 49: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 49 of 45

public class GetURLInfor {public static void printinfo(URL url) throws IOException {

URLConnection c = url.openConnection(); // Get URLConnection from URL c.connect(); // Open a connection to URL System.out.println(" Content Type: " + c.getContentType()); System.out.println(" Content Encoding: " + c.getContentEncoding()); System.out.println(" Content Length: " + c.getContentLength()); System.out.println(" Date: " + new Date(c.getDate()));

if (c instanceof HttpURLConnection) { HttpURLConnection h = (HttpURLConnection) c; System.out.println(" Request Method: " + h.getRequestMethod()); System.out.println(" Response Message: " + h.getResponseMessage()); System.out.println(" Response Code: " + h.getResponseCode()); } } public static void main(String[] args) { try { printinfo(new URL(args[0])); } catch (Exception e) { System.err.println(e + " Not found URL"); System.err.println("Usage: java GetURLInfo <url>"); } }}

URL class - ex

49

Page 50: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 50 of 45

Java cung cấp lớp (trong thư viện java.net)◦ ServerSocket (thường dùng cho server) và◦ Socket (thường dùng cho client) có thể được sử

dụng cho server◦Có các phương thức tương ứng với các thao tác

của server và client

Socket trong Java

50

Page 51: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 51 of 45

Dùng để tạo kết nối từ phía client tới Server Các phương thức hỗ trợ:

◦Tạo Socket◦Nhận thông tin từ Socket◦Lấy các thông tin về Socket dạng Stream◦Đóng Socket◦Đóng luồng nhập/xuất từ SOcket

Socket class

51

Page 52: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 52 of 45

Các phương thức tạo Socket:1. public Socket(String host, int port) throws

UnknownHostException, IOException: Tạo 1 socket TCP với host và port x/đ

2. public Socket(InetAddress address, int port) throws IOException:

Tạo 1 socket TCP với 1 host có address được x/đ bởi 1 object InetAddress và port x/đ

Tạo Socket

52

Page 53: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 53 of 45

3. public Socket(InetAddress address, int port, InetAddress interface, int localPort) throws IOException, UnknownHostException: Socket tao ra 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ộ

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

5. public Socket(String host, int port, boolean stream): stream qui định kiểu kết nối (T/F)

Tạo Socket

53

Page 54: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 54 of 45

InetAddress getInetAddress() : trả về địa chỉ (IP và hostname) của host mà

socket kết nối đến. int getPort() :

trả về port của host mà socket kết nối đến. InetAddress getLocalAddress() :

trả về địa chỉ của host cục bộ. int getLocalPort() :

trả về port trên host cục bộ.

Nhận các thông tin về Socket

54

Page 55: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 55 of 45

import java.net.*;import java.io.*;public class getSocketInfo {public static void main(String[] args) {for (int i = 0; i < args.length; i++) {try {Socket Sk = new Socket(args[i], 80);System.out.println( "From port " + Sk.getLocalPort() + " of " +

Sk.getLocalAddress());System.out.println("Connected to " + Sk.getInetAddress() + " on port " + Sk.getPort());

} catch (UnknownHostException e) {System.err.println("I can't find " + args[i]);

} catch (SocketException e) {System.err.println("Could not connect to " +

args[i]);} catch (IOException e) {

System.err.println(e); }} // end for

} // end main} // end getSocketInfo

Ex:Kết nối đến 1 số web server

55

Page 56: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 56 of 45

Việc nhận dữ liệu /ghi dữ liệu với socket được tiến hành thông qua luồng

Đọc /ghi dữ liệu với Socket dạng Stream

56

getOutputStream()

getInputStream()

write

read

Page 57: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 57 of 45

public OutputStream getOutputStream() throws IOExceptionTrả về một output stream cho việc ghi (các byte) dữ liệu từ ứng dụng đến một socket.

public InputStream getInputStream() throws IOExceptionTrả về một input stream cho việc đọc (các byte) dữ liệu từ một socket vào chương trình.

Các phương thức truy xuất luồng dữ liệu nhập/xuất

57

Page 58: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 58 of 45

Socket clientSk = new Socket("localhost", 9999);//Tạo luồ5ng đọc vào từ bàn phímBufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));//Tạo luồ<ng để? ghi dữ liệu từ client đểCn server(sk)DataOutputStream outToServer = New DataOutputStream(clientSk.getOutputStream());//Hoac PrintWriter, dung println() de ghiPrintWriter outToServer = new PrintWriter(new BufferedWriter(new OutputStreamWriter( clientSk.getOutputStream())), true);

// Tạo luồ5ng đểA đọc dữ liệu từ server(sk) gửAi vể5 clientBufferedReader inFromServer = new BufferedReader( newInputStreamReader(clientSk.getInputStream()));

Ex, Lấy các thông tin về Socket dạng Stream

58

Page 59: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 59 of 45

Phương thức:public void close() throws IOException Khi một Socket đã bị đóng lại:

◦Có thể truy xuất tới các trường thông tin qua các phương thức: getInetAddress(), getPort(), getLocalHost(), và getLocalPort().

◦Dùng phương thức getInputStream() hoặc getOutputStream() thì ngoại lệ IOException được đưa ra.

Đóng Socket

59

Page 60: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 60 of 45

Đóng luồng nhập/ xuất từ socket:◦public void shutdownInput() throws IOException

◦public void shutdownOutput() throws IOException

Các phương thức này không thực sự ngắt liên kết. Tuy nhiên, nó chỉ điều chỉnh luồng kết nối tới nó

Kiểm tra các luồng nhập và luồng xuất mở hay đóng ◦public boolean isInputShutdown() ◦public boolean isOutputShutdown()

Đóng luồng nhập/ xuất

60

Page 61: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 61 of 45

Lớp ServerSocket:◦các constructor để tạo các đối tượng

ServerSocket mới, ◦các phương thức để lắng nghe các liên kết trên

một cổng xác định, và ◦các phương thức trả về một Socket khi liên kết

được thiết lập, => có thể gửi và nhận dữ liệu.

ServerSocket class

61

Page 62: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 62 of 45

1. Một ServerSocket mới được tạo ra trên một cổng xác định bằng cách sử dụng một constructor ServerSocket. 2. ServerSocket lắng nghe liên kết đến trên cổng đó bằng cách sử dụng phương thức accept(). Phương thức accept() phong tỏa cho tới khi một client thực hiện một liên kết, phương thức accept() trả về một đối tượng Socket mà liên kết giữa client và server. 3. Tùy thuộc vào kiểu server, hoặc phương thức getInputStream(), getOutputStream() hoặc cả hai được gọi để nhận các luồng vào ra để truyền tin với client. 4. server và client tương tác theo một giao thức thỏa thuận sẵn cho tới khi ngắt liên kết. 5. Server, client hoặc cả hai ngắt liên kết 6. Server trở về bước hai và đợi liên kết tiếp theo.

Server – Hoạt động

62

Page 63: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 63 of 45

public ServerSocket(int port) throws IOException, BindException • Tạo một socket cho server trên cổng xác định. ◦ Nếu port = 0, hệ thống chọn một cổng ngẫu nhiên.khó x/đ

public ServerSocket(int port, int queuelength, InetAddress bindAddress) throws IOException • Tạo một đối tượng ServerSocket trên port xác định với queuelength xác định. ServerSocket chỉ gán cho địa chỉ IP cục bộ bindAddress xác định.

• Constructor này hữu ích cho các server chạy trên các hệ thống có nhiều địa chỉ IP

Tạo Socket cho Server

63

Page 64: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 64 of 45

public class portSrv { public static void main(String[] args) { for(int i=0;i<=1024;i++) { try{ ServerSocket ss= new ServerSocket(i); ss.close(); } catch(IOException e) { System.out.print("Co 1 server tren cong "+i); } } } }

ex

64

Page 65: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 65 of 45

Socket accept() throws IOException : ◦Lắng nghe một kết nối đến socket này và chấp

nhận nó.◦nó dừng quá trình xử lý và đợi cho tới khi client

được kết nối void close() throws IOException :

Đóng socket. Ta sử dụng các phương thức getInputStream() và

getOutputStream() để truyền tin với client.

Chấp nhận và ngắt liên kết

65

Page 66: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 66 of 45

Các phương thức trong ServerSocket◦InetAddress getInetAddress() : trả về địa

chỉ của socketserver◦int getLocalPort() : Trả về port mà server

đang lắng nghe. ◦void setSoTimeout(int timeout) throws SocketException

◦Enable/disable SO_TIMEOUT với khai báo timeout (milliseconds)

Methods

66

Page 67: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 67 of 45

import java.net.*; import java.io.*; class ScanPort { public static void main(String[] args) { try{ ServerSocket theServer = new ServerSocket(5776);

while(true) { Socket con = theServer.accept(); PrintStream p = new PrintStream(con.getOutputStream()); p.println(“Connected to this Server "); con.close();

} } catch(IOException e) { System.err.println(e);

} }

}

Ex: DateTime Server

67

Page 68: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 68 of 45

Tương tác giữa client/server qua socket TCP

68

Page 69: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 69 of 45

Cấu trúc chương trình Client Cấu trúc chương trình Server

Lập trình Socket cho giao thức TCP

69

Page 70: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 70 of 45

Cấu trúc chương trình client

70

Page 71: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 71 of 45

Cấu trúc chương trình server

71

Page 72: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 72 of 45

1) client đọc các dòng văn bản do người dùng gõ từ bàn phím (inFromUser stream) , gửi tới server qua socket (outToServer stream)2) server đọc các dòng gửi từ socket3) server chuyển sang chữ hoa và gửi trả lại cho client4) client đọc và in lại dòng văn bản nhận được từ socket (inFromServer stream)

Ex: viết ứng dụng client/ server bằng TCP Socket

72

Page 73: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 73 of 45

class TCPClient_upcase { public static void main(String argv[]) throws Exception {

String sentence; String modifiedSentence;Socket clientSocket = new Socket("localhost", 9999); //Create Socket//Create inputStream for reading data from keyboardBufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); sentence = inFromUser.readLine();// Create OutputStream for writing byte to Server socketDataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());outToServer.writeBytes(sentence + '\n');// Create inputStream for reading data from ServersocketBufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); modifiedSentence = inFromServer.readLine(); //View data that received from serverSystem.out.println("FROM SERVER: " + modifiedSentence);clientSocket.close();

} }

TCP client

73

Page 74: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 74 of 45

class TCPServer_upcase { public static void main(String argv[]) throws Exception { String clientSentence; String upSentence;System.out.println("Hello, wellcome to Server. Waiting.... ");ServerSocket welcomeSocket = new ServerSocket(9999); //Create Server Socketwhile(true) {

//Create connectionSocket connectionSocket = welcomeSocket.accept();//Create InputStream for reading data from socket clientBufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));clientSentence = inFromClient.readLine();// Create OutputStream for writing data to socket clientDataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());//Process: upcaseupSentence = clientSentence.toUpperCase() + '\n';outToClient.writeBytes(upSentence); System.out.println("Done!!!"); }

}}

TCP Server

74

Page 75: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 75 of 45

D:\Practice_Java\TCP-UDP\bin

output

75

Page 76: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 76 of 45

Using GUI in TCP Socket

76

Page 77: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 77 of 45

TCPSever_SNT, TCPClient_SNT

Exercise: Print Primes

77

Page 78: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 78 of 45

Đa tuyến hay được ứng dụng trong các chương trình Server: ◦cho phép các server làm việc với nhiều client

đồng thời. ◦Server này được gọi là server tương tranh

(concurrent server): server tạo ra một tuyến đoạn để quản lý từng

yêu cầu, sau đó tiếp tục lắng nghe các client khácMô

hình

MultiThread trong các chương trình Server

78

Page 79: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 79 of 45

Thread_TCPServer.java Thread_TCPClient.java Sample:Chuoi, Server, Client (Object) Prime: (Object: int+ Str) Array_Object (Socket+Object) MultiServer: (MultiSrv, cuoiky.cuoiky)

◦Str_Client_Loop, ◦Str_Server1_Loop, ◦Str_Server2_Loop

Example

79

Page 80: Chapter 8.1. network program with java tcp

Java Simplified / Session 22 / 80 of 45

DataOutputStream : dùng - writeBytes(str) để ghi string; - writeInt(num) để ghi số (với all dữ liệu nguyên thủy)… DataInputStream: - readLine(): để đọc string- readInt(num) để đọc số (với all dữ liệu nguyên thủy)… PrintWriter: dùng - println(str) de ghi string InputStreamReader: dùng read(char []) để đọc vào

mảng char. Sau đó in char[] (or->String) BufferredReader: dùng readLine(): để đọc string ObjectI/Ostream: Object: serializable

I/O Stream in Read/ write from/to socket

80