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

Dùng Java để xây dựng 1 trương trình Chat qua mạng theo mô hình Client/Server

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 (721.25 KB, 44 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
Trong những năm gần đây, mạng máy tính ngày càng trở nên phổ biến. Việc liên kết
các máy tính trên môi trường mạng cũng như liên kết các mạng lại với nhau đem lại cho
chúng ta nhiều lợi ích trong công việc cũng như trong việc học tập nghiên cứu, giải trí.
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
Chúng ta có thể sử dụng các tài nguyên sẵn có được chia sẻ như file server, printer, máy fax,
môi trường mạng còn là một môi trường thông tin nhanh chóng và tiện lợi nhờ vào các cơ
chế truyền thông trên mạng như : e-mail, www
Bên cạnh đó, tốc độ phát triển của máy tính PC cũng rất nhanh chóng. Các kỹ thuật
hiện đại đã giúp tạo ra các máy PC với tốc độ tính toán nhanh hơn, bộ nhớ lớn hơn và khả
năng xử lý của nó cũng ngày càng đa dạng hơn trong khi giá thành ngày càng rẻ hơn. Một
trong những khả năng ưu việt của máy PC hiện nay là hỗ trợ multimedia. Các máy PC ngày
nay giao tiếp với con người không chỉ bằng text mà còn kết hợp tất cả các phương tiện khác
như tiếng nói, hình ảnh.
Việc đưa kỹ thuật multimedia vào các ứng dụng truyền thông trên mạng giúp chúng
ta tạo ra nhiều ứng dụng phong phú hơn. Chẳng hạn hộp thư điện tử ngày nay có thể không
chỉ là văn bản mà còn bao gồm tiếng nói, hình ảnh. Các trang web trở nên sinh động hơn
hẳn khi kèm theo kỹ thuật multimedia. Bên cạnh đó, chúng ta có thể thiết kế các ứng dụng
tiện ích như Video conference, voice mail
Thông qua chương trình này, người sử dụng có thể trao đổi thông tin với nhau bằng
tiếng nói. Chương trình này đã được hiện thực rất nhiều trong các lĩnh vực thông tin như
điện thoại, viễn thông, máy tính . . . Tuy nhiên nó chưa được áp dụng và phát triển rộng rãi
như trên các lĩnh vực thông tin khác do sự hạn chế của thiết bị. Ngày nay, khi công nghệ
thông tin đã phát triển thì việc hiện thực chương trình này là hoàn toàn có thể. Ứng dụng
trong nhiều lĩnh vực khác nhau như :
 Việc dạy học từ xa.
 Việc chẩn đoán, chữa bệnh từ xa.
 Hội thảo, thảo luận theo nhóm.


 Công cụ trao đổi thông tin bằng hình ảnh và âm thanh.
Mục tiêu của đồ án môn học là tìm hiểu các mô hình và công nghệ truyền âm thanh
trên mạng máy tính, trên cơ sở đó xây dựng ứng dụng truyền thông âm thanh thoại trên
mạng cục bộ. Đồ án sẽ xây dựng thử nghiệm một hệ thống cho phép trao đổi thông tin bằng
tiếng nói thoại.
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
Việc nghiên cứu lý thuyết một cách hệ thống và xây dựng chương trình phần mềm
đòi hỏi phải đầu tư nhiều thời gian. Với thời gian có hạn cho nên bài báo cáo này của nhóm
chúng em không tránh khỏi những thiếu sót, chúng em rất mong được sự chỉ dẫn thêm của
thầy và các bạn.
Nhân đây, chúng em xin chân thành cám ơn đến thầy Nguyễn Bảo Ân, người trực
tiếp hướng dẫn chúng em hoàn thành đồ án này. Nhóm xin chân thành cám ơn các thầy cô
trong khoa Kỹ thuật Công nghệ, bộ môn Công nghệ Thông tin Trường ĐH Trà Vinh, và toàn
thể các bạn đã giúp đỡ chúng em hoàn thành đồ án này.
Chương 1. GIỚI THIỆU
1.1. 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
VoiceChat.
Dùng Java để xây dựng 1 trương trình Chat qua mạng theo mô hình Client/Server.
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
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.
1.2. 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.
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
+ 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 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();
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
Hoạt động của một ứng dụng mạng Client/Server.
Chương 2 : CƠ SỞ LÝ THUYẾT
2.1. SƠ LƯỢC VỀ MẠNG MÁY TÍNH VÀ HỆ PHÂN TÁN
2.1.1. Sơ lược về mạng máy tính.
Mạng máy tính là gì?
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
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ý:
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
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
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.
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
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
2.1.2. 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ệ
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
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
 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.
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.
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
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).
2.2. 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.
2.2.1. 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
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
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
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.
2.2.2. 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).
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.
2.2.3. Giao thức TCP
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
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).
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.
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
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.
2.3. 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ý.
Truyền đáp ứng cho client.
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
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
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
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.
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)
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.

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
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.
2.4. 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:
1. 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 17
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
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
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 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…
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
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.
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.
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
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.
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
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,
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
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
+ 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
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
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
- 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
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
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

GVHD : ThS. Nguyễn Bảo Ân Trang 25

×