Tải bản đầy đủ (.docx) (36 trang)

Tìm hiểu và lập trình socket ftp truyền file đơn giản

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 (678.61 KB, 36 trang )

Lập trình ứng dụng phân tán đối tượng Lớp: DA08TTD
MỤC LỤC
LỜI NÓI ĐẦU
Ngày nay cuộc cách mạng công nghệ luận văn - báo cáo - tiểu luận - tài liệu chuyên
ngành Công Nghệ thông tin và viễn thông luận văn - báo cáo - tiểu luận chuyên ngành Viễn
Thông đã phát triển vô cùng mạnh mẽ, những thành tựu của nó đã có những ứng dụng to
GVHD : ThS. Nguyễn Bảo Ân Trang 1
Lập trình ứng dụng phân tán đối tượng Lớp: DA08TTD
lớn, và trở thành một phần quan trọng trong cuộc sống của chúng ta. Mạng viễn thông mà
tiêu biểu là Internet đã kết nối mọi người trên toàn thế giới, cung cấp đa dịch vụ từ Chat, e –
mail, VoIP, hội nghị truyền hình, các thông tin khoa học kinh tế, giáo dục… Truy cập
Internet trở thành nhu cầu quen thuộc đối với mọi người.
Vấn đề trao đổi file là không thể thiếu đối với người dùng đầu cuối . Giao thức FTP
là một giao thức trao đổi file khá phổ biến - tuy nhiên những hoạt động xảy ra trong giao
thức thì không phải ai cũng biết được hết cách thức làm việc của giao thức này.
Xuất phát từ yêu cầu trên nhóm của em đi vào tìm hiểu và lập trình socket ftp truyền
file đơn giản .Nhằm bước đầu hiểu về cách thức lập trình một đối tượng.
Chương 1. GIỚI THIỆU
MỤC TIÊU CỦA ĐỀ TÀI.
Vận dụng tổng hợp những kiến thức đã học để tiến hành xây dựng chương trình ftp.
GVHD : ThS. Nguyễn Bảo Ân Trang 2
Lập trình ứng dụng phân tán đối tượng Lớp: DA08TTD
Dùng Java để xây dựng 1 trương trình truyền file qua mạng theo mô hình Client/Server.
Tạo ra được 1 chương trình mà các Client kết nối được với nhau thông qua Server.
Các Client có thể gửi tin nhắn, hoặc trò chuyện trực tiếp với các Client khác.
GIẢI QUYẾT ĐỀ TÀI.
TCP/IP cho phép các máy tính trong mạng TCP/IP có thể tạo ra các kết nối để trao đổi thông
tin với nhau.Với 1 địa chỉ IP + 1 cổng TCP sẽ tạo thành một cầu nối và Socket chính là một
giao diện lập trình trên các cầu nối đó. (1 IP Address + 1 Port TCP = 1 Socket )
Khi các máy tính muốn trao đổi thông tin với nhau thì các máy phải có cùng một Socket.
Một máy được coi là Server, nó mở ra một Socket và lắng nghe yêu cầu. Các máy còn lại


được coi là Client, nó gọi cho Server Socket để bắt thiết lập một kết nối. Để thiết lập được
kết nối cần có địa chỉ của máy đích (Destination IP Address ) và một cổng TCP (TCP port).
Mô hình Client – Server
Phương thức truyền tin trong Java:
Nó sử dụng phương thức truyền tin có kết nối thông qua 2 đối tượng là: Socket(Client) và
ServerSocket(Server). Tạo 1 Socket sử dụng để kết nối tới 1 SocketServer.
Client Socket được tạo ra thông qua 1 hàm khởi tạo(Contructor) của lớp Socket:
Socket client=new Socket(Destination Address,Port)
Trong đó:
+ Destination Address là địa chỉ của máy muốn kết nối tới.
+ Port là số hiệu cổng TCP đòi hỏi phải có một ServerSocket đang lắng nghe yêu cầu
trên đó.
Để tạo ra một ServerSocket sử dụng câu lệnh sau:
ServerSocket SSocket=new ServerSocket(Port,Number of Connection)
Trong đó:
+ Port là số hiệu cổng sẽ chờ để phục vụ
+ Number of Connection là số kết nối chấp nhận phục vụ cùng một lúc.
Một SocketServer sẽ lắng nghe trên một cổng. Khi nhận được một yêu cầu từ socket (Client
Socket) nó sẽ kiểm tra xem còn chấp nhận được kết nối đó không, chưa vượt quá số kết nối
GVHD : ThS. Nguyễn Bảo Ân Trang 3
Lập trình ứng dụng phân tán đối tượng Lớp: DA08TTD
mà nó có thể phục vụ, nếu được nó sẽ tạo ra một Socket để tạo liên kết với Client yêu cầu
bằng phương thức:
Socket client=SSocket.accept();
Các Socket cung cấp 1 giao diện để đọc ghi dữ liệu thông qua 1 luồng.Khi kết nối đã được
thiết lập 2 máy tính có thể trao đổi dữ liệu thông qua các đối tượng:
BufferedReader in=new BufferedReader(new
InputStreamReader(client.getInputStream()));
PrintWriter out=PrintWriter(client.getOutputStream(),true);
Khi thực hiện xong cần hủy bỏ các liên kết để trả lại tài nguyên cho hệ thống, chúng ta sử

dụng phương thức:
In.close();
Out.close();
Client.close();
Hoạt động của một ứng dụng mạng Client/Server.
GVHD : ThS. Nguyễn Bảo Ân Trang 4
Lập trình ứng dụng phân tán đối tượng Lớp: DA08TTD
Chương 2 : CƠ SỞ LÝ THUYẾT
SƠ LƯỢC VỀ MẠNG MÁY TÍNH VÀ HỆ PHÂN TÁN
Sơ lược về mạng máy tính.
Mạng máy tính là gì?
Mạng máy tính là một tập hợp các máy tính được kết nối với nhau bởi đường truyền
vật lý theo một cấu trúc nào đó để đáp ứng một số yêu cầu của người dùng.
Vai trò của mạng máy tính
Ngày nay với một lượng lớn về thông tin, nhu cầu xử lý thông tin ngày càng cao. Mạng máy
tính hiện nay trở nên quá quen thuộc đối với chúng ta, trong mọi lĩnh vực như khoa học,
quân sự, quốc phòng, thương mại, dịch vụ, giáo dục Hiện nay ở nhiều nơi mạng đã trở
thành một nhu cầu không thể thiếu được. Người ta thấy được việc kết nối các máy tính
thành mạng cho chúng ta những khả năng mới to lớn như:
Sử dụng chung tài nguyên: những tài nguyên của mạng (như thiết bị, chương trình, dữ
liệu) khi được trở thành các tài nguyên chung thì mọi thành viên của mạng đều có thể tiếp
cận được mà không quan tâm tới những tài nguyên đó ở đâu.
Tăng độ tin cậy của hệ thống: người ta có thể dễ dàng bảo trì máy móc và lưu trữ (backup)
các dữ liệu chung và khi có trục trặc trong hệ thống thì chúng có thể được khôi phục nhanh
chóng. Trong trường hợp có trục trặc trên một trạm làm việc thì người ta cũng có thể sử
dụng những trạm khác thay thế.
Nâng cao chất lượng và hiệu quả khai thác thông tin: khi thông tin có thể được sử dụng
chung thì nó mang lại cho người sử dụng khả năng tổ chức lại các công việc với những thay
đổi về chất như:
Ðáp ứng những nhu cầu của hệ thống ứng dụng kinh doanh hiện đại.

Cung cấp sự thống nhất giữa các dữ liệu.
Tăng cường năng lực xử lý nhờ kết hợp các bộ phận phân tán.
Tăng cường truy nhập tới các dịch vụ mạng khác nhau đang được cung cấp trên thế giới.
Phân loại mạng máy tính
Dựa trên khoảng cách địa lý:
Mạng cục bộ (Local Area Network - LAN): có phạm vi hẹp, bán kính khoảng vài chục km
Mạng đô thị (Metropolitan Area Network - MAN): phạm vi rộng hơn, với bán kính nhỏ
hơn 100km
Mạng diện rộng (Wide Area Network - WAN): phạm vi mạng có thể vượt biên giới quốc
gia, lục địa.
Mạng toàn cầu(Global Area Network - GAN): phạm vi trải rộng trên toàn thế giới.
Đường kính mạng Vị trí của máy tính Loại mạng
1 m Trong một mét vuông Mạng khu vực cá nhân
GVHD : ThS. Nguyễn Bảo Ân Trang 5
Lập trình ứng dụng phân tán đối tượng Lớp: DA08TTD
10 m Trong một phòng Mạng cục bộ (LAN)
100 m Trong một tòa nhà
1 km Trong một khu vực
10 km Trong một thành phố Mạng đô thị (MAN)
100 km Trong một quốc gia Mạng diện rộng (WAN)
1000 km Trong một châu lục
10000 km Cả hành tinh Mạng toàn cầu (GAN)
Dựa trên kiến trúc mạng
Mạng kiểu Bus (Bus Topology)
Các máy tính đều được nối vào một đường dây truyền chính
(bus). Đường truyền chính này được giới hạn hai đầu bởi một loại
đầu nối đặc biệt gọi là terminator
Mạng hình Sao (Star Topology)
Đây là mô hình mạng thông dụng nhất. Là dạng đơn giản nhất. Mạng này bao gồm
một thiết bị trung tâm là switch hay hub, hoạt động giống như một tổng đài cho

phép thực hiện việc nhận và truyền dữ liệu từ trạm này tới các trạm khác.
Mạng Vòng tròn (Ring Topology)
Là mô hình mạng mà một node được kết nối chính xác với 2 node khác tạo thành một vòng
tròn tín hiệu: một vòng tròn (ring).
Mỗi gói dữ liệu đều có mang địa chỉ trạm đích, mỗi trạm khi
nhận được một gói dữ liệu nó kiểm tra nếu đúng với địa chỉ của
mình thì nó nhận lấy còn nếu không phải thì nó sẽ phát lại cho trạm
kế tiếp, cứ như vậy gói dữ liệu đi được đến đích
Sơ lược về hệ phân tán.
Hệ phân tán là gì?
Có nhiều định nghĩa cho một hệ phân tán. Tuy nhiên, ta có thể định nghĩa hệ phân tán
là một tập hợp bao gồm các máy tính tự trị được liên kết với nhau qua một mạng máy tính,
và được cài đặt phần mềm hệ phân tán. Phần mềm hệ phân tán cho phép máy tính có thể
phối hợp các hoạt động của nó và chia sẻ tài nguyên của hệ thống như phần cứng, phần
mềm và dữ liệu.
Một số tính chất quan trọng của một hệ phân tán:
Thứ nhất chúng cho phép chúng ta chạy những ứng dụng khác nhau trên nhiều máy
khác nhau thành một hệ thống duy nhất. Một ưu điểm khác của hệ phân tán đó là khi một hệ
GVHD : ThS. Nguyễn Bảo Ân Trang 6
Lập trình ứng dụng phân tán đối tượng Lớp: DA08TTD
thống được thiết kế đúng cách, một hệ phân tán có thể có khả năng thay đổi tuỳ theo quy mô
của hệ thống rất tốt. Tuy nhiên, tất cả mọi thứ đều có hai mặt của nó, một hệ phân tán cũng
vậy bên cạnh những mặt ưu việt thì nó cũng có những nhược điểm đó là tính bảo mật kém.
Những ứng dụng của hệ phân tán:
Cung cấp những thuận lợi cho việc tính toán đa mục đích đến những nhóm người
dùng, tự động hoá công việc ngân hàng và hệ thống truyền thông đa phương tiện, ngoài ra
chúng còn bao quát toàn bộ những ứng dụng thương mại và kĩ thuật. Hệ phân tán đã trở
thành tiêu chuẩn để tổ chức về mặt tính toán. Nó có thể được sử dụng cho việc thực hiện
tương tác hệ thống tính toán đa mục đích trong UNIX và hỗ trợ cho phạm vi rộng của
thương mại và ứng dụng công nghiệp của những máy tính…

Các đặc trưng cơ bản của hệ phân tán
Kết nối người sử dụng với tài nguyên.
Chia sẻ nguồn tài nguyên là một đặc tính cơ bản của hệ thống phân tán, nó là cơ sở
cho những đặc tính khác và nó ảnh hưởng đến những kiến trúc phần mềm có sẵn trong các
hệ phân tán. Các nguồn tài nguyên có thể là mục dữ liệu, phần cứng và các thành phần của
phần cứng. Các nguồn tài nguyên được phân biệt từ một dữ liệu được quản lý với những
quá trình xử lý đơn bởi nhu cầu của vài quá trình xử lý để chia sẻ chúng.
Tính trong suốt (transparency).
Một hệ phân tán được gọi là trong suốt nếu nó có khả năng che dấu tính rời rạc và
những nhược điểm có thể của nó đối với người sử dụng cuối và người lập trình ứng
dụng.Có 8 dạng trong suốt:
Trong suốt truy cập: che dấu cách biểu diễn dữ liệu và cách thức truy cập tài nguyên.
Trong suốt vị trí: che dấu vị trí thực của tài nguyên.
Trong suốt di trú: che dấu khả năng di trú (di chuyển từ nơi này sang nơi khác) của
tài nguyên.
Trong suốt định vị lại: che dấu khả năng tài nguyên có thể di chuyển từ nơi này đến
nơi khác ngay cả khi đang được sử dụng.
Trong suốt bản sao : che dấu các bản sao được nhân ra.
GVHD : ThS. Nguyễn Bảo Ân Trang 7
Lập trình ứng dụng phân tán đối tượng Lớp: DA08TTD
Trong suốt về tương tranh.
Trong suốt về lỗi.
Trong suốt truy cập nhanh.
Tính mở (openess).
Một hệ phân tán được gọi là có tính mở nếu nó có khả năng bổ sung thêm các dịch
vụ mới mà không làm ảnh hưởng xấu đến các dịch vụ đã có.
Tính co dãn (scalability).
Một hệ phân tán được gọi là có tính co dãn nếu nó có thể thích nghi được với những
sự thay đổi qui mô của hệ thống Tính co dãn thể hiện trên 3 khía cạnh.
Dễ dàng bổ sung thêm tài nguyên và người sử dụng.

Hệ thống thay đổi qui mô về mặt địa lý.
Hệ thống thay đổi qui mô về quản trị.
Tính chịu lỗi (Fault tolerance).
Xử lý được những lỗi xảy ra trong quá trình làm việc. Bên cạnh tính chịu lỗi luôn đi
kèm theo là khắc phục lỗi.
Tính an toàn an ninh (security).
CÁC GIAO THỨC MẠNG
Giao thức là gì?
Giao thức hay còn gọi là nghi thức là các phương tiện để làm cho sự thông tin trở nên khả
hữu. Một quyết định phải được thực hiện khi hai hay nhiều máy tính muốn gởi và nhận dữ
liệu.
Giao thức IP
(Internet Protocol - Giao thức Liên mạng) là một giao thức hướng dữ liệu được sử
dụng bởi các máy chủ nguồn và đích để truyền dữ liệu trong một liên mạng chuyển mạch
gói.
Dữ liệu trong một liên mạng IP được gửi theo các khối được gọi là các gói (packet
hoặc datagram). Cụ thể, IP không cần thiết lập các đường truyền trước khi một máy chủ gửi
GVHD : ThS. Nguyễn Bảo Ân Trang 8
Lập trình ứng dụng phân tán đối tượng Lớp: DA08TTD
các gói tin cho một máy khác mà trước đó nó chưa từng liên lạc với. Giao thức IP cung cấp
một dịch vụ gửi dữ liệu không đảm bảo (còn gọi là cố gắng cao nhất ), nghĩa là nó hầu như
không đảm bảo gì về gói dữ liệu. Gói dữ liệu có thể đến nơi mà không còn nguyên vẹn, nó
có thể đến không theo thứ tự (so với các gói khác được gửi giữa hai máy nguồnvà đích đó),
nó có thể bị trùng lặp hoặc bị mất hoàn toàn. Nếu một phần mềm ứng dụng cần được bảo
đảm, nó có thể được cung cấp từ nơi khác, thường từ các giao thức giao vận nằm phía trên
IP. Các thiết bị định tuyến liên mạng chuyển tiếp các gói tin IP qua các mạng tầng liên kết
dữ liệu được kết nối với nhau. Việc không có đảm bảo về gửi dữ liệu có nghĩa rằng các
chuyển mạch gói có thiết kế đơn giản hơn. (Lưu ý rằng nếu mạng bỏ gói tin, làm đổi thứ tự
hoặc làm hỏng nhiều gói tin, người dùng sẽ thấy hoạt động mạng trở nên kém đi. Hầu hết
các thành phần của mạng đều cố gắng tránh để xảy ra tình trạng đó. Đó là lý do giao thức

này còn được gọi là cố gắng cao nhất. Tuy nhiên, khi lỗi xảy ra không thường xuyên sẽ
không có hiệu quả đủ xấu đến mức người dung nhận thấy được). Giao thức IP rất thông
dụng trong mạng Internetcông cộng ngày nay. Giao thức tầng mạng thong dụng nhất ngày
nay là IPv4; phiên bản từ 0 đến 3 hoặc bị hạn chế, hoặc không được sử dụng. Phiên bản 5
được dùng làm giao thức dòng (stream) thử nghiệm. Còn có các phiên bản khác, nhưng
chúng thường dành là các giao thức thử nghiệm và không được sử dụng rộng rãi.
Kề từ khi chính thức được đưa vào sử dụng và được định nghĩa trong kiến nghị
RFC791 năm 1981 đến nay, cho tới bây giờ phiên bản này vẫn đang được sử dụng rộng rãi
và cũng đã góp phần tạo ra sự phát triển bùng nổ của các mạng máy tính.
Giao thức UDP
UDP là giao thức lớp Giao vận đơn giản nhất, được mô tả trong RFC 768. Ứng dụng
gửi bản tin tới socket UDP, sau đó được đóng gói thành một UDP paragram và được truyền
xuống lớp IP để gửi tới đích. Gói tin UDP được truyền mà không đảm bảo rằng nó có thể tới
đích, giữ đúng thứ tự và đến đích một lần. Vấn đề của người lập trình mạng với UDP là đảm
bảo tính tin cậy. Nếu datagram tới đích nhưng trường kiểm tra tổng (checksum) có lỗi hay
gói tin bị drop ở trên mạng thì nó sẽ được truyền lại. Nếu muốn xác định được rằng gói tin
đã tới đích thì cần rất nhiều tính năng trong ứng dụng: ACK từ đầu cuối khác, điều khiển
việc truyền lại, Mỗi một UDP datagram có chiều dài và được truyền lên cùng với dữ liệu
cho lớp ứng dụng. Điều này khác với TCP là giao thức luồng byte (byte-stream protocol).
GVHD : ThS. Nguyễn Bảo Ân Trang 9
Lập trình ứng dụng phân tán đối tượng Lớp: DA08TTD
Chúng ta cũng có thể nói: UDP cung cấp dịch vụ không hướng kết nối. Ví dụ, client UDP có
thể tạo một socket và gửi datagram tới server này và sau đó gửi một datagram khác cũng tới
server khác. Cũng giống như server UDP có thể nhận nhiều datagram trên một socket UDP
từ các client khác nhau.
Giao thức TCP
Là giao thức hướng kết nối, nó cung cấp một hoạt động truyền tin tin cậy. TCP chịu
trách nhiệm phân chia dữ liệu gửi thành các segment tại máy gửi và lắp gép các segment lại
tại máy đích, trong quá trình truyền có thể truyền lại bất cứ segment nào nếu máy đích chưa
nhận được. Gói tin TCP có dạng sau:

Source port: Số hiệu của cổng gọi (16 bits).
Destination Port : Số hiệu của cổng đích (16 bits).
GVHD : ThS. Nguyễn Bảo Ân Trang 10
Lập trình ứng dụng phân tán đối tượng Lớp: DA08TTD
Sequence Number: Chữa số đảm bảo tuần tự chính xác của dữ liệu đến, giống như số
thứ tự (32 bits).
Acknowledgment Number (ACK): dùng trong các gói dữ liệu hồi đáp của máy nhận
cho máy gửi, báo hiệu để máy gửi biết lượng dữ liệu mà máy nhận đã nhận được và yêu cầu
gửi dữ liệu tiếp theo (32 bits).
Header Length: Số lượng các từ 32 bit trong header (32 bits).
Reserved : Set thành zero (6 bits).
Code Bits: Các chức năng điều khiển như là thiết lập và kết thúc một phiên, nó giống
như cờ gồm 6 bits.1.Cờ URG.2.Cờ ACK dùng để xác nhận.3.Cờ PSH (push) yêu cầu xóa
vùng đệm.4.Cờ RST (Reset) tái thiết lập.5.Cờ SYN (Synchronic) đồng bộ.6.Cờ FIN (finish)
Kết thúc, sử dụng khi muốn hủy kết nối.
Window: ghi kích thước cửa sổ của máy gửi báo cho máy nhận biết có gửi tín hiệu
trở lại thì không được vượt quá kích thước này(16 bits).
Checksum: tính từ header và các trường dữ liệu(16 bits).
Urgent: Chỉ ra điểm kết thúc của dữ liệu chuẩn(16 bits).
Options: Một tùy chọn định ra kích thước tối đa hiện hành của gói TCP.
Data: Dữ liệu giao thức của lớp trên.
MÔ HÌNH CLIENT-SERVER
Các ứng dụng mạng thường hoạt động theo mô hình client/server như thư điện tử,
truyền nhận tập tin, game trên mạng, Mô hình này gồm có một chương trình đóng vai trò
là client và một chương trình đóng vai trò là server. Hai chương trình này sẽ giao tiếp với
nhau thông qua mạng. Chương trình server đóng vai trò cung cấp dịch vụ. Chương trình này
luôn luôn lắng nghe các yêu cầu từ phía client, rồi tính toán và đáp trả kết quả tương ứng.
Chương trình client cần một dịch vụ và gởi yêu cầu dịch vụ tới chương trình server và đợi
đáp trả từ server. Như vậy, quá trình trao đổi dữ liệu giữa client/server bao gồm:
Truyền một yêu cầu từ chương trình client tới chương trình server.

Yêu cầu được server xử lý.
GVHD : ThS. Nguyễn Bảo Ân Trang 11
Lập trình ứng dụng phân tán đối tượng Lớp: DA08TTD
Truyền đáp ứng cho client.
Mô hình truyền tin này thực hiện truyền hai thông điệp qua lại giữa client và server
một cách đồng bộ hóa. Chương trình server nhận được thông điệp từ client thì nó phát ra
yêu cầu client chuyển sang trạng thái chờ (tạm dừng) cho tới khi client nhận được thông
điệp đáp ứng do server gửi về. Mô hình client/server thường được cài đặt dựa trên các thao
tác cơ bản là gửi (send) và nhận (receive).
Mô hình được phổ biến nhất và được chấp nhận rộng rãi trong các hệ thống phân tán là mô
hình client/server. Trong mô hình này sẽ có một tập các tiến trình mà mỗi tiến trình đóng vai
trò như là một trình quản lý tài nguyên cho một tập hợp các tài nguyên cho trước và một tập
hợp các tiến trình client trong đó mỗi tiến trình thực hiện một tác vụ nào đó cần truy xuất tới
tài nguyên phần cứng và phần mềm dùng chung. Bản thân các trình quản lý tài nguyên cần
phải truy xuất tới các tài nguyên dùng chung được quản lý bởi một tiến trình khác, vì vậy
một số tiến trình vừa là tiến trình client vừa là tiến trình server. Các tiến trình phát ra các
yêu cầu tới các server bất kỳ khi nào chúng cần truy xuất tới một trong các tài nguyên của
các server. Nếu yêu cầu là đúng đắn thì server sẽ thực hiện hành động được yêu cầu và gửi
một đáp ứng trả lời tới tiến trình client.
Mô hình client/server cung cấp một cách tiếp cận tổng quát để chia sẻ tài nguyên trong các
hệ thống phân tán. Mô hình này có thể được cài đặt bằng rất nhiều môi trường phần cứng và
phần mềm khác nhau. Các máy tính được sử dụng để chạy các tiến trình client/server có
nhiều kiểu khác nhau và không cần thiết phải phân biệt giữa chúng; cả tiến trình client và
tiến trình server đều có thể chạy trên cùng một máy tính. Một tiến trình server có thể sử
dụng dịch vụ của một server khác.
GVHD : ThS. Nguyễn Bảo Ân Trang 12
Lập trình ứng dụng phân tán đối tượng Lớp: DA08TTD
Mô hình truyền tin client/server hướng tới việc cung cấp dịch vụ. Quá trình trao đổi dữ liệu
bao gồm:
Truyền một yêu cầu từ tiến trình client tới tiến trình server

Yêu cầu được server xử lý
Truyền đáp ứng cho client
Mô hình truyền tin này liên quan đến việc truyền hai thông điệp và một dạng đồng bộ hóa
cụ thể giữa client và server. Tiến trình server phải nhận thức được thông điệp được yêu cầu
ở bước một ngay khi nó đến và hành động phát ra yêu cầu trong client phải được tạm dừng
(bị phong tỏa) và buộc tiến trình client ở trạng thái chờ cho tớ khi nó nhận được đáp ứng do
server gửi về ở bước ba.
Mô hình client/server thường được cài đặt dựa trên các thao tác cơ bản là gửi (send) và nhận
(receive) dữ liệu.
Quá trình giao tiếp client và server có thể diễn ra theo một trong hai chế độ: bị phong tỏa
(blocked) và không bị phong tỏa (non-blocked).
Chế độ bị phong tỏa (blocked):
Trong chế độ bị phong tỏa, khi tiến trình client/server phát ra lệnh gửi dữ liệu (send), việc
thực thi của tiến trình sẽ bị tạm ngừng cho tới khi tiến trình nhận phát ra lệnh nhận dữ liệu
(receive).
Tương tự đối với tiến trình nhận dữ liệu, nếu tiến trình nào đó (client *** server) phát ra
lệnh nhận dữ liệu, mà tại thời điểm đó chưa có dữ liệu gửi tới thì việc thực thi của tiến trình
cũng sẽ bị tạm ngừng cho tới khi có dữ liệu gửi tới.
Chế độ không bị phong tỏa (non-blocked)
Trong chế độ này, khi tiến trình client hay server phát ra lệnh gửi dữ liệu thực sự, việc thực
thi của tiến trình vẫn được tiến hành mà không quan tâm đến việc có tiến trình nào phát ra
lệnh nhận dữ liệu đó hay không.
Tương tự cho trường hợp nhận dữ liệu, khi tiến trình phát ra lệnh nhận dữ liệu, nó sẽ nhận
dữ liệu hiện có, việc thực thi của tiến trình vẫn được tiến hành mà không quan tâm đến việc
có tiến trình nào phát ra lệnh gửi dữ liệu tiếp theo hay không.
LẬP TRÌNH SOCKET
Socket là gì?
Sockets cung cấp một interface để lập trình mạng tại tầng Transport. Một socket là
một end-point của một liên kết giữa hai ứng dụng. Ngày nay, Socket được hỗ trợ trong hầu
hết các hệ điều hành như MS Windows (WinSock), Linux và được sử dụng trong nhiều

ngôn ngữ lập trình khác nhau: như C, C++, Java, Visual Basic, C#, . . .Windows Socket
Application Programming Interface (Winsock API) là một thư viện các hàm socket.
Winsock hỗ trợ các lập trình viên xây dựng các ứng dụng mạng trên nền TCP/IP.
Xây dựng ứng dụng Client-Server với Socket
Khi xây dụng một ứng dụng mạng, chúng ta thực hiện các bước sau:
GVHD : ThS. Nguyễn Bảo Ân Trang 13
Lập trình ứng dụng phân tán đối tượng Lớp: DA08TTD
Xác định kiến trúc mạng: Client – Server, Peer-to-Peer.
2. Giao thức sử dụng tầng Transport: TCP, UDP.
3. Các port sử dụng ở Server và Client.
4. Giao thức tầng ứng dụng khi trao đổi dữ liệu giữa hai end-host.
5. Lập trình.
Phần này trình bày các bước cơ bản trong việc xây dựng các ứng dụng mạng theo
kiến trúc Client-Server và giao thức sử dụng ở tầng Transport là TCP bằng Socket.
GVHD : ThS. Nguyễn Bảo Ân Trang 14
Lập trình ứng dụng phân tán đối tượng Lớp: DA08TTD
Sơ đồ tương tác giữa Server - Client theo giao thức TCP
Trong giai đoạn truyền nhận dữ liệu, việc trao đổi dữ liệu giữa Client và Server phải
tuân thủ theo giao thức của ứng dụng.
Ghi chú:
Nếu chúng ta phát triển ứng dụng theo các giao thức đã định nghĩa sẵn, chúng ta phải
tham khảo và tuân thủ đúng những qui định của giao thức (tham khảo trong các tài liệu RFC
(Request For Comments)).
Nếu xây dựng ứng dụng dạng Peer -to-Peer, thì một ứng dụng phải có cả chức năng
client và server trong mô hình trên.
Mô hình truyền tin socket
Khi lập trình, ta cần quan tâm đến chế độ bị phong tỏa, vì nó có thể dẫn đến tình huống một
tiến trình nào đó sẽ rơi vào vòng lặp vô hạn của quá trình gửi và nhận.
Trong chương 1 chúng ta đã biết hai giao thức TCP và UDP là các giao thức tầng giao vận
để truyền dữ liệu. Mỗi giao thức có những ưu và nhược điểm riêng. Chẳng hạn, giao thức

TCP có độ tin cậy truyền tin cao, nhưng tốc độ truyền tin bị hạn chế do phải có giai đoạn
GVHD : ThS. Nguyễn Bảo Ân Trang 15
Lập trình ứng dụng phân tán đối tượng Lớp: DA08TTD
thiết lập và giải phóng liên kết khi truyền tin, khi gói tin có lỗi hay bị thất lạc thì giao thức
TCP phải có trách nhiệm truyền lại,…Ngược lại, giao thức UDP có tốc độ truyền tin rất
nhanh vì nó chỉ có một cơ chế truyền tin rất đơn giản: không cần phải thiết lập và giải phóng
liên kết. Khi lập trình cho TCP ta sử dụng các socket luồng, còn đối với giao thức UDP ta sẽ
sử dụng lớp DatagramSocket và DatagramPacket.
Truyền tin hướng liên kết nghĩa là cần có giai đoạn thiết lập liên kết và giải phóng liên kết
trước khi truyền tin. Dữ liệu được truyền trên mạng Internet dưới dạng các gói (packet) có
kích thước hữu hạn được gọi là datagram. Mỗi datagram chứa một header và một payload.
Header chứa địa chỉ và cổng cần truyền gói tin đến, cũng như địa chỉ và cổng xuất phát của
gói tin, và các thông tin khác được sử dụng để đảm bảo độ tin cậy truyền tin, payload chứa
dữ liệu. Tuy nhiên do các datagram có chiều dài hữu hạn nên thường phải phân chia dữ liệu
thành nhiều gói và khôi phục lại dữ liệu ban đầu từ các gói ở nơi nhận. Trong quá trình
truyền tin có thể có thể có một hay nhiều gói bị mất hay bị hỏng và cần phải truyền lại các
gói tin đến không theo đúng trình tự. Để tránh những điều này, 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 và các gói chưa nhận được,… rất 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.
Thật may mắn, ta không cần phải tự thực hiện công việc này. Socket là một cuộc cách mạng
của Berkeley UNIX. Chúng cho phép người lập trình 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.
Về mặt lịch sử Socket là một sự mở rộng của một trong những ý 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 đối với người lập trình, cho dù ta
đang làm việc với bàn phím, màn hình đồ họa, một file thông thường, hay một liên kết
mạng. Các Socket 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…
Một socket có thể thực hiện bảy thao tác cơ bản:
Kết nối với một máy ở xa (ví dụ, chuẩn bị để gửi và nhận dữ liệu)

- Gửi dữ liệu
- Nhận dữ liệu
- Ngắt liên kêt
- Gán cổng
- Nghe dữ liệu đến
- Chấp nhận liên kết từ các máy ở xa trên cổng đã được gán
Lớp Socket của Java được sử dụng bởi cả client và server, có các phương thức tương ứng
với bốn thao tác đầu tiên. Ba thao tác cuối chỉ cần cho server để chờ các client liên kết với
chúng. Các thao tác này được cài đặt bởi lớp ServerSocket. Các socket cho client thường
được sử dụng theo mô hình sau:
Một socket mới được tạo ra bằng cách sử dụng hàm Socket().
Socket cố gắng liên kết với một host ở xa.
Mỗi khi liên kết được thiết lập, các host ở xa nhận các luồng vào và luồng ra từ socket, và
sử dụng các luồng này để gửi dữ liệu cho nhau. Kiểu liên kết này được gọi là song công
(full-duplex)-các host có thể nhận và gửi dữ liệu đồng thời. Ý nghĩa của dữ liệu phụ thuộc
vào giao thức.
Khi việc truyền dữ liệu hoàn thành, một và cả hai phía ngắt liên kết. Một số giao thức, như
HTTP, đòi hỏi mỗi liên kết phải bị đóng sau mỗi khi yêu cầu được phục vụ. Các giao thức
khác, chẳng hạn FTP, cho phép nhiều yêu cầu được xử lý trong một liên kết đơn.
GVHD : ThS. Nguyễn Bảo Ân Trang 16
Lập trình ứng dụng phân tán đối tượng Lớp: DA08TTD
Socket cho Client
Các constructor
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.
Trong hàm này tham số host là hostname kiểu String, nếu host không xác định và máy chủ
tên miền không hoạt động thì constructor đưa ra ngoại lệ UnknownHostException. Vì một
lý do nào đó mà không thể mở được socket thì constructor sẽ đưa ra ngoại lệ IOException.
Có nhiều nguyên nhân khiến cho một liên kết thất bại: host mà ta đang cố gắng kết nối tới
không chấp nhận liên kết, kết nối Internet có thể bị ngắt, vấn đề định tuyến có thể ngăn

ngừa các gói tin của ta tới đích.
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
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.
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.
Nhận các thông tin về Socket
Đối tượng Socket có một số trường thông tin riêng mà ta có thể truy nhập tới chúng thông
qua các phương thức trả về các thông tin này.
public InetAddress getInetAddress()
Cho trước một đối tượng Socket, phương thức getInetAddress() cho ta biết host ở xa mà
Socket kết nối tới, liên kết đã bị ngắt thì nó cho biết host ở xa mà Socket đã kết nối tới
public int getPort()
Phương thức này cho biết số hiệu cổng mà Socket kết nối tới trên host ở xa.
public int getLocalPort()
Thông thường một liên kết thường có hai đầu: host ở xa và host cục bộ. Để tìm ra số hiệu

cổng ở phía host cục bộ ta gọi phương thức getLocalPort().
public InetAddress getLocalAddress()
Phương thức này cho ta biết giao tiếp mạng nào mà một socket gắn kết với nó.
public InputStream getInputStream() throws IOException
Phương thức geInputStream() trả về một luồng nhập để đọc dữ liệu từ một socket vào
chương trình. Thông thường ta có thể gắn kết luồng nhập thô InputStream tới một luồng lọc
và một luồng ký tự nhằm đưa các chức năng tiện ích (chẳng hạn như các luồng InputStream,
GVHD : ThS. Nguyễn Bảo Ân Trang 17
Lập trình ứng dụng phân tán đối tượng Lớp: DA08TTD
InputStreamReader). Để tâng cao hiệu năng, ta có thể đệm dữ liệu bằng cách gắn kết nó với
luồng lọc BufferedInputStream BufferedReader.
public OutputStream getOutputStream() throws IOException
Phương thức getOutputStream() trả về một luồng xuất thô để ghi dữ liệu từ ứng dụng ra đầu
cuối của một socket. Thông thường, ta sẽ gắn kết luồng này với một luồng tiện lợi hơn như
lớp DataOuputStream OutputStreamWriter trước khi sử dụng nó. Để tăng hiệu quả ghi.
Hai phương thức getInputStream() và getOutputStream() là các phương thức cho phép ta lấy
về các luồng dữ liệu nhập và xuất. Như đã đề cập ở chương 3 vào ra trong Java được tiến
hành thông qua các luồng, việc làm việc với các socket cũng không phải là một ngoại lệ. Để
nhận dữ liệu từ một máy ở xa ta nhận về một luồng nhập từ socket và đọc dữ liệu từ luồng
đó. Để ghi dữ liệu lên một máy ở xa ta nhận về một luồng xuất từ socket và ghi dữ liệu lên
luồng. Dưới đây là hình vẽ để ta hình dung trực quan hơn.
+ InputStream
+ OutputStream
+ Socket
+ Chương trình
Đóng Socket
Đến thời điểm ta đã có đầy đủ các thông tin cần thiết để triển khai một ứng dụng phía client.
Khi viết một chương trình ứng dụng phía client tất cả mọi công việc đều chuyển về việc
quản lý luồng và chuyển đổi dữ liệu từ luồng thành dạng thức mà người sử dụng có thể hiểu
được. Bản thân các socket rất đơn giản bởi vì các phần việc phức tạp đã được che dấu đi.

Đây chính là lý do để socket trở thành một lựa chọn có tính chiến lược cho lập trình mạng.
public void close() throws IOException
Các socket được đóng một cách tự động khi một trong hai luồng đóng lại, khi chương trình
kết thúc, khi socket được thu hồi bởi gabbage collector. Tuy nhiên, thực tế cho thấy việc cho
rằng hệ thống sẽ tự đóng socket là không tốt, đặc biệt là khi các chương trình chạy trong
khoảng thời gian vô hạn. Để đóng một socket ta có thể dùng phương thức close().
Mỗi khi một Socket đã bị đóng lại, ta vẫn có thể truy xuất tới các trường thông tin
InetAddress, địa chỉ cục bộ, và số hiệu cổng cục bộ thông qua các phưong thức
getInetAddress(), getPort(), getLocalHost(), và getLocalPort(). Tuy nhiên khi ta gọi các
phương thức getInputStream() getOutputStream() để đọc dữ liệu từ luồng đọc InputStream
ghi dữ liệu OuputStream thì ngoại lệ IOException được đưa ra.
Các socket đóng một nửa (Half-closed socket)
Phương thức close() đóng cả các luồng nhập và luồng xuất từ socket. Trong một số trường
hợp ta chỉ muốn đóng một nửa kết nối là luồng nhập là luồng xuất. Bắt đầu từ Java 1.3, các
phương thưc shutdownInput() và shutdownOutput() cho phép ta thực hiện điều này.
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ó sao cho.
Trong Java đưa thêm vào hai phương thức các luồng nhập và luồng xuất mở hay đóng
- public boolean isInputShutdown()
- public boolean isOutputShutdown()
Thiết lập các tùy chọn cho Socket
TCP_NODELAY
- public void setTcpNoDelay(boolean on) throws SocketException
GVHD : ThS. Nguyễn Bảo Ân Trang 18
Lập trình ứng dụng phân tán đối tượng Lớp: DA08TTD
- public boolean getTcpNoDelay() throws SocketException
Thiết lập giá trị TCP_NODELAY là true để đảm bảo rằng các gói tin được gửi đi nhanh
nhất có thể mà không quan tâm đến kích thước của chúng. Thông thường, các gói tin nhỏ

được kết hợp lại thành các gói tin lớn hơn trước khi được gửi đi. Trước khi gửi đi một gói
tin khác, host cục bộ đợi để nhận các xác thực của gói tin trước đó từ hệ thống ở xa.
SO_LINGER
- public void setSoLinger(boolean on, int seconds) throws SocketException
- public int getSoLinger() throws SocketException
Tùy chọn SO_LINGER xác định phải thực hiện công việc gì với datagram vẫn chưa được
gửi đi khi một socket đã bị đóng lại. Ở chế độ mặc định, phương thức close() sẽ có hiệu lực
ngay lập tức; nhưng hệ thống vẫn cố gắng để gửi phần dữ liệu còn lại. Nếu SO_LINGER
được thiết lập bằng 0, các gói tin chưa được gửi đi bị phá hủy khi socket bị đóng lại. Nếu
SO_LINGER lớn hơn 0, thì phương thức close() phong tỏa để chờ cho dữ liệu được gửi đi
và nhận được xác thực từ phía nhận. Khi hết thời gian qui định, socket sẽ bị đóng lại và bất
kỳ phần dữ liệu còn lại sẽ không được gửi đi.
SO_TIMEOUT
- public void setSoTimeout(int milliseconds) throws SocketException
- public int getSoTimeout() throws SocketException
Thông thường khi ta đọc dữ liệu từ mộ socket, lời gọi phương thức phong tỏa cho tới khi
nhận đủ số byte. Bằng cách thiết lập phương thức SO_TIMEOUT, ta sẽ đảm bảo rằng lời
gọi phương thức sẽ không phong tỏa trong khoảng thời gian quá số giây quy định.
Các phương thức của lớp Object
Lớp Socket nạp chồng phương thức chuẩn của lớp java.lang.Object, toString(). Vì các
socket là các đối tượng tạm thời và thường chỉ tồn tại khi liên kết tồn tại.
- public String toString()
Phương thức toString() tạo ra một xâu ký tự như sau:
Socket[addr=www.oreilly.com/198.122.208.11,port=80,localport=50055]
Phương thức này thường hữu ích cho việc gỡ rối.
Các ngoại lệ Socket
Hầu hết các phương thức của lớp Socket được khai báo đưa ra ngoại lệ IOException, và lớp
con của lớp IOExcepton là lớp SocketException.
Các lớp SocketAddress
Lớp SocketAddress bắt đầu có từ phiên bản Java 1.4, biểu diễn một đầu cuối của liên kết.

Lớp SocketAddress là một lớp trừu tượng mà không có phương thức nào ngoài construtor
mặc định. Lớp này có thể được sử dụng cho cả các socket TCP và socket không phải là TCP.
Các lớp con của lớp SocketAddress cung cấp thông tin chi tiết hơn thích hợp cho kiểu
socket. Trong thực tế, chỉ hỗ trợ TCP/IP.
Mục đích chính của lớp SocketAddress là cung cấp một nơi lưu trữ các thông tin liên kết
socket tạm thời (như địa chỉ IP và số hiệu cổng) có thể được sử dụng lại để tạo ra socket
mới.
- public SocketAddress getRemoteSocketAddress()
- public SocketAddress getLocalSocketAddress()
Cả hai phương thức này trả về giá trị null nếu socket vẫn chưa kết nối tới.
Lớp ServerSocket
Lớp ServerSocket có đủ mọi thứ ta cần để viết các server bằng Java. Nó có 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
GVHD : ThS. Nguyễn Bảo Ân Trang 19
Lập trình ứng dụng phân tán đối tượng Lớp: DA08TTD
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, vì vậy ta có
thể gửi và nhận dữ liệu.
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.
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.
Tùy thuộc vào kiểu server, phương thức getInputStream(), getOutputStream() cả hai được
gọi để nhận các luồng vào ra để truyền tin với client.
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.
Server, client cả hai ngắt liên kết
Server trở về bước hai và đợi liên kết tiếp theo.
+ Các constructor
Public ServerSocket(int port) throws IOException, BindException
Constructor này tạo một socket cho server trên cổng xác định. Nếu port bằng 0, hệ thống

chọn một cổng ngẫu nhiên cho ta. Cổng do hệ thống chọn đôi khi được gọi là cổng vô danh
vì ta không biết số hiệu cổng. Với các server, các cổng vô danh không hữu ích lắm vì các
client cần phải biết trước cổng nào mà nó nối tới (giống như người gọi điện thoại ngoài việc
xác định cần gọi cho ai cần phải biết số điện thoại để liên lạc với người đó).
+ Chấp nhận và ngắt liên kết
Một đối tượng ServerSocket hoạt động trong một vòng lặp chấp nhận các liên kết. Mỗi lần
lặp nó gọi phương thức accept(). Phương thức này trả về một đối tượng Socket biểu diễn
liên kết giữa client và server. Tương tác giữ client và server được tiến hành thông qua socket
này. Khi giao tác hoàn thành, server gọi phương thức close() của đối tượng socket. Nếu
client ngắt liên kết trong khi server vẫn đang hoạt động, các luồng vào ra kết nối server với
client sẽ đưa ra ngoại lệ InterruptedException trong lần lặp tiếp theo
Public Socket accept() throws IOException
Khi bước thiết lập liên kết hoàn thành, và ta sẵn sàng để chấp nhận liên kết, cần gọi phương
thức accept() của lớp ServerSocket. Phương thức này phong tỏa; nó dừng quá trình xử lý và
đợi cho tới khi client được kết nối. Khi client thực sự kết nối, phương thức accept() trả về
đối tượng Socket. Ta sử dụng các phương thức getInputStream() và getOutputStream() để
truyền tin với client.
Public void close() throws IOException
Nếu ta đã kết thúc làm việc với một đối tượng server socket thì cần phải đóng lại đối tượng
này.
Public void close() throws IOException
Nếu đã hoàn thành công việc với một ServerSocket, ta cần phải đóng nó lại, đặc biệt nếu
chương trình của ta tiếp tục chạy. Điều này nhằm tạo điều kiện cho các chương trình khác
muốn sử dụng nó. Đóng một ServerSocket không đồng nhất với việc đóng một Socket.
Lớp ServerSocket cung cấp một số phương thức cho ta biết địa chỉ cục bộ và cổng mà trên
đó đối tượng server đang hoạt động. Các phương thức này hữu ích khi ta đã mở một đối
tượng server socket trên một cổng vô danh và trên một giao tiếp mạng không
Public InetAddress getInetAddress()
Phương thức này trả về địa chỉ được sử dụng bởi server (localhost). Nếu localhost có địa chỉ
IP, địa chỉ này được trả về bởi phương thức InetAddress.getLocalHost()

Public int getLocalHost()
GVHD : ThS. Nguyễn Bảo Ân Trang 20
Lập trình ứng dụng phân tán đối tượng Lớp: DA08TTD
Các contructor ServerSocket cho phép ta nhận dữ liệu trên cổng không định trước bằng cách
gán số 0 cho cổng. Phương thức này cho phép ta tìm ra cổng mà server đang nhận.
Chương 3: MÔ TẢ ỨNG DỤNG
GIỚI THIỆU ỨNG DỤNG
Ứng dụng được xây dựng nhằm mục đích nhận và truyền dữ liệu của một máy (tạm gọi là
server) và việc gửi và nhận dữ liệu cho một máy của các máy còn lại trong 1 nhóm nhất
định (các máy client).
Client:
Khi các máy client kết nối vào server thì các client sẽ nhận được các luồng dữ liệu
được gửi bởi server và các luồng dữ liệu ở phía client.
Client kết nối vào server tại 1 thời điểm sẽ thấy được thông tin trực tiếp từ các client
khác.
Server:
Server nhận thông tin từ các client và bắt đầu đáp lại (dưới dạng Stream) cho các
client khác.
GVHD : ThS. Nguyễn Bảo Ân Trang 21
Lập trình ứng dụng phân tán đối tượng Lớp: DA08TTD
Server sẽ biết được danh sách các client đang kết nối tới mình (mỗi client kết nối sẽ
được hiển thị lên bảng tại server). Server sẽ biết được thông tin chi tiết của từng Client và
gửi danh sách nick name cho các client còn lại.
Server có quyền đóng kết nối và không cho bất cứ 1 client nào kết nối.
KIẾN TRÚC ỨNG DỤNG
Mô hình tổng thể
Gói server
Lắng nghe và chấp nhận kết nối từ các Client.
Nhận và gửi thông điệp cho các Client.
Gói client

Kết nối và gửi thông điệp cho Server.
MÔ HÌNH THÔNG ĐIỆP GIỮA CLIENT VÀ SERVER
Mô hình Client-Server sử dụng Socket ở chế độ có kết nối (TCP)
Giai đoạn 1: Server tạo Socket, gán số hiệu cổng và lắng nghe các kết nối.
GVHD : ThS. Nguyễn Bảo Ân Trang 22
Lập trình ứng dụng phân tán đối tượng Lớp: DA08TTD
Ta thấy Server đã khởi tạo một Socket gồm IP và port 999 và sẵn sàng nhận kết nối trên
cổng 999 từ Client.
Giai đọan 2: Client tạo Socket, yêu cầu thiết lập một nối kết với Server.
Clie
nt yêu cầu khởi tạo một socket để sử dụng các dịch vụ của tầng vận chuyển, hệ thống sẽ
kiểm tra xem port nào còn trống sẽ tự động gán cho socket của Client.
GVHD : ThS. Nguyễn Bảo Ân Trang 23
Lập trình ứng dụng phân tán đối tượng Lớp: DA08TTD
Client gởi yêu cầu kết nối đến Server có địa chỉ IP và port xác định:
Sau khi Server chấp nhận kết nối của Client, khi đó một kênh giao tiếp ảo được hình thành,
Client và Server có thể trao đổi thông tin với nhau.
Giai đoạn 3: Trao đổi thông tin giữa Client và Server.
Sau khi chấp nhận yêu cầu kết nối, Server đợi Client gởi yêu cầu đến. Ở đây, Client
gởi lần lượt các byte của dữ liệu lên Server.
Sau khi nhận được dữ liệu từ Client, Server tiến hàng chuyển đổi dữ liệu nhận được
là các byte dữ liệu thành tên của file mà Client đã gởi và dữ liệu của file. Trong quá trình
này, giữa Client và Server sẽ liên tục trao đổi thông tin với nhau về các các dữ liệu đã nhận
được, tuân thủ theo các quy tắc của giao thức đã xác lập từ trước.
Giai đoạn 4: Kết thúc phiên làm việc
GVHD : ThS. Nguyễn Bảo Ân Trang 24
Lập trình ứng dụng phân tán đối tượng Lớp: DA08TTD
Sau khi dữ liệu đã gởi xong, client sẽ gởi yêu cầu hủy kết nối và kênh ảo kết nối với
Server sẽ bị đóng. Như vậy, toàn bộ quá trình sẽ diễn ra như sau.
Chương 4. CÀI ĐẶT VÀ KẾT QUẢ THỬ NGHIỆM

CÀI ĐẶT
Quá trình lựa chọn ngôn ngữ.
Java là một công nghệ xây dựng các ứng dụng phần mềm có vị trí rất lớn trong
những năm cuối thế kỉ 20, đầu thế kỉ 21. Nó được coi là công nghệ mang tính cách mạng và
khả thi nhất trong việc tạo ra các ứng dụng có khả năng chạy thống nhất trên nhiều nền tảng
GVHD : ThS. Nguyễn Bảo Ân Trang 25

×