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 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.
Trang 1MỤ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
Trang 2lớ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
Trang 3Dù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
Trang 4mà 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:
Trang 5Chươ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
Trang 610 m Trong một phòng Mạng cục bộ (LAN)
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ệ
Trang 7thố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
Trang 8Trong 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
Trang 9cá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)
Trang 10Chú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)
Trang 11Sequence 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
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ý
Trang 12Truyề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
Trang 13Mô 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:
Trang 14Xá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
Trang 15Sơ đồ 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
Trang 16thiế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)
- 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
Trang 17Socket 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
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,
Trang 18InputStreamReader) Để 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
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