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