3 Lập trình socket trong java – Tài liệu text

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 (424.41 KB, 23 trang )

chương trình yêu cầu dịch vụ (được gán nhãn là Client) và một chương trình

cung cấp dịch vụ (được gán nhãn là server) trên mạng hoặc trên cùng một máy

tính.

– Đối với người lập trình, họ nhìn nhận Socket như một giao diện nằm

giữa tầng ứng dụng và tầng khác trong mô hình mạng OSI có nhiệm vụ thực

hiện việc giao tiếp giữa chương trình ứng dụng với các tầng bên dưới của mạng.

Hình 1.2 – Mô hình OSI rút gọn

Hình 1.3 – Mô hình Socket

– Tuy nhiên, các lập trình viên hiện nay gần như luôn luôn bị ngăn cản tạo

socket riêng bằng cách thủ công bởi dù bạn dùng Java, serlet hay CGI, PHP…

có thể bạn sẽ không bao giờ mở được cổng một cách tường minh. Thay vào đó

các lập trình viên sử dụng thư viện socket được hỗ trợ sẵn bởi các ngôn ngữ lập

10

trình. Như vậy các socket vẫn tồn tại để kết nối các ứng dụng của người dùng,

nhưng các chi tiết của socket được ẩn trong những lớp sâu hơn để mọi người

không phải động chạm đến.

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

– Để có thể thực hiện các cuộc giao tiếp, một trong hai 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

một địa chỉ xác định trong hệ thống. Khi quá trình được gán một số hiệu cổng,

nó có thể nhận dữ liệu gửi đến cổng này từ các quá trình khác. Quá trình còn lại

cũng được yêu cầu tạo ra một socket.

Ngoài số hiệu cổng, hai bên giao tiếp còn phải biết địa chỉ IP của nhau.

Địa chỉ IP giúp phân biệt máy tính này với máy tính kia trên mạng TCP/IP.

Trong khi số hiệu cổng dùng để phân biệt các quá trình khác nhau trên cùng một

máy tính.

Số hiệu cổng gán cho Socket phải duy nhất trên phạm vi máy tính đó, có

giá trị trong khoảng từ 0 đến 65535 (16 bit). Trong thực tế thì các số hiệu cổng

từ 0 đến 1023 (gồm có 1024 cổng) đã dành cho các dịch vụ nổi tiếng như: http:

80, telnet:21, ftp:23,…. Nếu chúng ta không phải là người quản trị thì nên dùng

từ cổng 1024 trở lên.

Toàn bộ tiến trình diễn ra như sau:

11

Hình 1.4 Nguyên lý truyền socket

1.3.1.2 Nguyên lý hoạt động

– Ta đã thấy khi hai ứng dụng muốn trao đổi dữ liệu qua mạng, chúng sẽ

tạo ra ở mỗi phía một socket và trao đổi dữ liệu bằng cách đọc/ghi từ socket. Để

hiểu rõ cách thức socket trao đổi dữ liệu chúng ta hãy xem xét nguyên lý hoạt

động của chúng.

– Trước hết chúng ta hãy xem xét làm thế nào các socket có thể xác định

được nhau. Khi một chương trình tạo ra một socket, một định danh dạng số

(định danh dạng số này còn được gọi là số hiệu cổng) sẽ được gán cho socket.

Việc gán số hiệu cổng này cho socket có thể được thực hiện bởi chương trình

hoặc hệ điều hành tùy theo cách socket được sử dụng như thế nào. Trong mỗi

gói tin mà socket gửi đi có chứa hai thông tin để xác định đích đến của gói tin:

+ Một địa chỉ mạng để xác định hệ thống sẽ nhận gói tin.

+ Một số định danh cổng để nói cho hệ thống đích biết socket nào

trên nó sẽ nhận dữ liệu.

– Nhờ hai thông tin này mà gói tin có thể đến được đúng máy tính chứa

socket mà nó cần đến (nhờ địa chỉ mạng) và được phân phối đến đúng socket

đích (nhờ địa chỉ cổng của socket đích).

12

– Chúng ta có thể khái quát quá trình trao đổi dữ liệu thông qua các socket

như sau:

+ Chương trình phía server tạo ra một socket, socket này được

chương trình gắn với một cổng trên server. Sau khi được tạo ra socket này (ta

gọi là socket phía server) sẽ chờ nghe yêu cầu từ phía clients.

+ Khi chương trình phía clients cần kết nối với một server, nó cũng

tạo ra một socket, socket này cũng được hệ điều hành gắn với một cổng.

Chương trình client sẽ cung cấp cho socket của nó (ta gọi là socket phía client)

địa chỉ mạng và cổng của socket phía server và yêu cầu thực hiện kết nối (nếu

chương trình định sử dụng giao thức hướng kết nối) hoặc truyền dữ liệu (nếu

chương trình sử dụng giao thức không hướng kết nối)

+ Chương trình phía server và chương trình phía clients trao đổi dữ

liệu với nhau bằng cách đọc từ socket hoặc ghi vào socket của mình. Các socket

ở hai phía nhận dữ liệu từ ứng dụng và đóng gói để gửi đi hoặc nhận các dữ liệu

được gửi đến và chuyển cho chương trình ứng dụng bởi socket ở cả hai phía đều

biết được địa chỉ mạng và địa chỉ cổng của nhau.

– Ở bước thứ hai chúng ta thấy chương trình ứng dụng phải lựa chọn giao

thức mà nó định sử dụng để trao đổi dữ liệu. Tuỳ theo việc chúng ta sử dụng

giao thức nào (TCP hay UDP) mà cách thức xử lý trước yêu cầu của clients có

thể khác.

– Sau đây chúng ta sẽ xem xét chi tiết cách thức trao đổi dữ liệu của

socket với từng loại giao thức.

Socket hỗ trợ TCP

a. Ở phía Server: Khi một ứng dụng trên server hoạt động nó sẽ tạo ra

một socket và đăng ký với server một cổng ứng dụng và chờ đợi yêu cầu kết nối

từ phía clients qua cổng này.

b. Ở phía clients: Nó biết địa chỉ của máy trên đó server đang chạy vào

cổng và server đang chờ nghe yêu cầu. Do đó khi muốn kết nối đến server, nó

cũng tạo một socket chứa địa chỉ máy client và cổng của ứng dụng trên máy

13

clients đồng thời clients sẽ cung cấp cho socket của nó địa chỉ và cổng của

server mà nó cần kết nối và yêu cầu socket thực hiện kết nối.

Khi server nhận được yêu cầu kết nối từ clients, nếu nó chấp nhận thì

server sẽ sinh ra một socket mới được gắn với một cổng khác với cổng mà nó

đang nghe yêu cầu. Sở dĩ server làm như vậy bởi nó cần cổng cũ để tiếp tục

nghe yêu cầu từ phía clients trong khi vẫn cần một kết nối với clients.

Sau đó chương trình ứng dụng phía server sẽ gửi thông báo chấp nhận kết

nối cho clients cùng thông tin về địa chỉ cổng mới của socket mà nó dành cho

clients.

c. Quay lại phía clients, nếu kết nối được chấp nhận nghĩa là socket của nó

đã được tạo ra thành công và nó có thể sử dụng socket để giao tiếp với server

bằng cách viết và ghi tới socket theo cách giao tiếp với một tài nguyên trên máy

tính thông thường.

Socket hỗ trợ UDP

a. Ở phía Server: Khi một ứng dụng trên server hoạt động nó sẽ tạo ra

một socket và đăng ký với server một cổng ứng dụng và chờ đợi yêu cầu kết nối

từ phía clients qua cổng này.

b. Ở phía Clients: Nó biết địa chỉ của máy trên đó server đang chạy vào

cổng và server đang chờ nghe yêu cầu. Do đó khi muốn giao tiếp với server, nó

cũng tạo ra một socket chứa địa chỉ máy clients và cổng của ứng dụng trên máy

clients đồng thời clients sẽ cung cấp cho socket của nó địa chỉ và cổng của

server mà nó cần kết nối. Khi clients muốn gửi tin đế server nó sẽ chuyển dữ

liệu cho socket của mình, socket này sẽ chuyển thẳng gói tin mà client muốn

gửi tới server dưới dạng một datagram có chứa địa chỉ máy server và cổng mà

server đang chờ nghe yêu cầu. Như vậy không hề có một kết nối nào được thực

hiện giữa client với server và server cũng không cần tạo ra một socket khác để

kết nối với clients thay vào đó server dùng ngay cổng ban đầu để trao đổi dữ

liệu.

CHƯƠNG 2: XÂY DỰNG CHƯƠNG TRÌNH ỨNG DỤNG

2.1. Giới thiệu

14

Trao đổi dữ liệu giữa hai máy tính trong mạng thực chất là sự trao đổi dữ

liệu giữa hai chương trình ứng dụng chạy trên hai máy tính đó. Trong đó, một

chương trình được gán nhãn là server và một chương trình được gán nhãn là

client, có nhiều phương pháp để xây dựng chương trình ứng dụng mạng nhưng

phương pháp sử dụng phổ biến là lập trình ứng mạng dựa trên cơ chế socket.

Trong chương này sẽ trình bầy một ứng dụng của lập trình socket TCP là xây

dựng chương trình truyền file qua mạng giữa hai máy tính bằng Java Socket

TCP.

2.2. Phân tích chương trình

Chương trình ứng dụng được xây dựng theo mô hình clients/server.

Chương trình bao gồm hai mô đun server và client. Người sử dụng có thể truyền

file từ phía client cho server hoặc ngược lại.

Tạo server socket và lắng nghe kết nối từ client

Sai

Chấp nhận

kết nối từ

client

Báo lỗi

Đúng

Sai

Nhận file

END

Đúng

Ghi dữ liệu vào server

Hình 2.1 Mô đun phía server

15

client tạo socket kết nối đến

socket server

kết nối thành

công

sai

báo lỗi

đúng

END

Chọn file cần gửi cho server

Gửi file cho server

đúng

Gửi file mới?

sai

Hình 2.2 Mô đun phía client

2.3 Cơ chế hoạt động của chương trình

Chương trình gồm hai mô đun. Phía server là file chương trình có tên là

FileTransferServer.java, phía client là file chương trình có tên là

FileTransferClient.java. Sau khi biên dịch file .java này ta nhận được các file .class

tương ứng.

Chạy chương trình ở server mode:

Chương trình chạy phía server đã được chỉ định chạy server mode, sau đó

máy tính này sẽ chờ đợi các kết nối từ phía clients đến nó. Ta phải nhập tiếp

port number, ứng với server mode này thì ta có thể chọn bất cứ port number

nào lớn hơn 1024, vì những port number dưới 1024 đã bị giữ trước và sử dụng

bởi hệ thống.

16

Chạy chương trình ở client mode:

Tương tự cho phía bên client, chương trình sẽ yêu cầu nhập vào địa chỉ của

server (host address), ta có thể nhập địa chỉ IP hay nhập vào tên của máy chạy

server mode đều được (trong trường hợp trên hình bên dưới thì tên máy chạy

server mode có địa chỉ IP trong mạng LAN là 192.168.1.43). Tiếp tục ta sẽ nhập

port number (số hiệu cổng) của server socket (đã biết) cần kết nối đến.

2.4 Giao diện chương trình

2.4.1 Giao diện Server

Hình 2.3 Giao diện server

17

2.4.2 Giao diện client

Hình 2.4 Giao diện client

2.5 Chạy thử và kiểm thử

Server chọn đường dẫn lưu rồi mở socket để đợi client kết nối:

18

Hình 2.5 Server chọn đường dẫn lưu rồi mở socket để đợi client kết nối

Client kết nối tới server thành công:

Hình 2.6 Client kết nối tới server thành công

19