Posts from the ‘Socket’ Category

Lập trình mạng trong JAVA(Phần 9)

Lập trình ứng dụng cho giao thức UDP

2. Lớp DatagramPacket

Các datagram UDP đưa rất ít thông tin vào datagram IP. Header UDP chỉ  đưa tám byte vào header IP. Header UDP bao gồm số hiệu cổng nguồn và đích, chiều dài của dữ liệu và header UDP, tiếp đến là một checksum tùy chọn. Vì mỗi cổng được biểu diễn bằng hai byte nên tổng số cổng UDP trên một host sẽ là 65536. Chiều dài cũng được biểu diễn bằng hai byte nên số byte trong datagram tối đa sẽ là 65536 trừ đi tám 8 byte dành cho phần thông tin header.

Trong Java, một datagram UDP được biểu diễn bởi lớp DatagramPacket:

•  public final class DatagramPacket extends Object

Lớp này cung cấp các phương thức để nhận và thiết lập các địa chỉ nguồn, đích từ header IP, nhận và thiết lập các thông tin về cổng nguồn và đích, nhận và thiết lập độ dài dữ liệu. Các trường thông tin còn lại không thể truy nhập được từ mã Java thuần túy.

DatagramPacket sử dụng các constructor khác nhau tùy thuộc vào gói tin  được sử dụng để gửi hay nhận dữ liệu.

2.1. Các constructor để nhận datagram

Hai constructor tạo ra các đối tượng DatagramSocket mới để nhận dữ liệu từ mạng:

•  public DatagramPacket(byte[] b, int length)

•  public DatagramPacket(byte[] b, int offset, int length)

Khi một socket nhận một datagram, nó lưu trữ phần dữ liệu của datagram  ở trong vùng đệm b bắt đầu tại vị trí b[0] và tiếp tục cho tới khi gói tin được lưu trữ hoàn toàn hoặc cho tới khi lưu trữ hết length byte. Nếu sử dụng constructor thứ hai, thì dữ liệu được lưu trữ bắt đầu từ vị trí b[offset]. Chiều dài của b phải nhỏ hơn hoặc bằng b.length-offset. Nếu ta xây dựng một DatagramPacket có chiều dài vượt quá chiều dài của vùng đệm thì constructor sẽ đưa ra ngoại lệ IllegalArgumentException.  Đây là kiểu ngoại lệ RuntimeException nên chương trình của ta không cần thiết phải đón bắt ngoại lệ này.

Ví dụ, xây dựng một DatagramPacket để nhận dữ liệu có kích thước lên tới 8912 byte

byte b[]=new byte[8912];

DatagramPacket dp=new DatagramPacket(b,b.length);

2.2. Constructor để gửi các datagram Read more…

Lập trình mạng trong JAVA(Phần 8)

Lập trình ứng dụng cho giao thức UDP

1. Tổng quan về giao thức UDP

TCP/IP là một họ các giao thức được gọi là họ giao thức IP, bao gồm bốn tầng. Cần nhớ rằng TCP/IP không phải là một giao thức mà thực sự là một họ các giao thức, và bao gồm các giao thức mức thấp khác như IP, TCP, và UDP. UDP nằm ở tầng giao vận, phía trên giao thức IP. Tầng giao vận cung cấp khả năng truyền tin giữa các mạng thông qua các gateway. Nó sử dụng các địa chỉ IP để gửi các gói tin trên Internet hoặc trên mạng thông qua các trình điều khiển thiết bị khác nhau. TCP và UDP là một phần của họ giao thức TCP/IP; mỗi giao thức có những ưu và nhược điểm riêng của nó.

Giao thức UDP là giao thức đơn giản, phi liên kết và cung cấp dịch vụ trên tầng giao vận với tốc độ nhanh. Nó hỗ trợ liên kết một-nhiều và thường được sử dụng thường xuyên trong liên kết một-nhiều bằng cách sử dụng các datagram multicast và unicast.

Giao thức IP là giao thức cơ bản của Internet. TCP và UDP đều là hai giao thức tầng giao thức vận trên cơ sở của giao thức IP. Hình dưới đây chỉ ra cách ánh xạ mô hình OSI ánh xạ vào kiến trúc TCP/IP và họ giao thức TCP/IP.

1.1. Một số thuật ngữ UDP Read more…

Lập trình mạng trong JAVA(Phần 7)

5. 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 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.

Vòng đời của một server

1. 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.

2. 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.

3. Tùy  thuộc vào kiểu server, hoặc phương thức getInputStream(), getOutputStream() hoặc cả hai được gọi để nhận các luồng vào ra để truyền tin với client.

4.  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.

5.  Server, client hoặc cả hai ngắt liên kết

6. Server trở về bước hai và đợi liên kết tiếp theo. Read more…

Lập trình mạng trong JAVA(Phần 6)

4. Socket cho Client

4.1. 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.

Ví dụ:

try{
Socket s = new Socket( “www.vnn.vn”,80);
}catch(UnknownHostException e){
System.err.println(e);
}catch(IOException e){
System.err.println(e);
}

Trong hàm này tham số host là hostname kiểu String, nếu host không xác định hoặc 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, hoặc 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 Read more…

Lập trình mạng trong JAVA(Phần 5)

Phần 2: Lập trình Socket cho giao thức TCP

1. Mô hình client/server

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 hoặc 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.

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:

1. Truyền một yêu cầu từ tiến trình client tới tiến trình server
2. Yêu cầu được server xử lý
3. 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). Read more…

Lập trình mạng trong JAVA(Phần 4)

3.1. Phân tích Header

HTTP Server cung cấp một số lượng thông tin  đáng kể trong các header MIME trước mỗi đáp ứng. Thông tin trong các header MIME có thể bao gồm cơ chế mã hóa nội dung được sử dụng, ngày và giờ, chiều dài của nội dung được trả về bằng byte, ngày hết hạn của nội dung, ngày mà nội dung được sửa đổi lần cuối. Tuy nhiên, thông tin được gửi phụ thuộc vào server; một server nào đó gửi tất cả các thông tin này cho mỗi yêu cầu, các server khác gửi các thông tin nào đó, và một số ít server không gửi thông tin nào. Các phương thức của mục này cho phép ta truy vấn một URLConnection để tìm ra thông tin MIME nào mà server đã cung cấp.

Ngoài HTTP, rất ít giao thức sử dụng các header MIME. Khi viết lớp con của lớp URLConnection, thông thường cần phải nạp chồng các phương thức này sao cho chúng trả về các giá trị có ý nghĩa. Phần thông tin quan trọng nhất bạn có thể thiếu là kiểu nội dung MIME. URLConnection cung cấp một số phương thức tiện ích nào đó mà trợ giúp bạn đoán nhận ra kiểu nội dung, dựa trên tên file của nó hoặc một số byte đầu tiên của chính dữ liệu. Read more…

Lập trình mạng trong JAVA(Phần 3)

3. Lớp URLConnection

URLConnection là một lớp trừu tượng biểu diễn một liên kết tích cực tới một tài nguyên được xác định bởi một URL.
Lớp URLConnection có hai mục đích khác nhau nhưng liên quan với nhau.

• Thứ nhất, nó cung cấp nhiều khả năng điều khiển hơn thông qua việc tương tác với một server chứ không phải lớp URL. Với URLConnection ta có thể kiểm tra các headerMIME được gửi bởi một Http Server phản ứng tương ứng. Ta cũng có thể sử dụng lớp URLConnection  để tải về các tệp nhị phân. Ngoài ra URLConnection cho phép bạn gửi dữ liệu trở lại Web server bằng lệnh POST. Chúng ta sẽ xem tất cả các kỹ thuật đó trong chương này.

• Thứ hai, URLConnection là một phần của cơ chế quản trị giao thức, cơ chế này còn bao gồm cả lớp URLStreamHandler. Ý tưởng đằng sau các trình quản trị giao thức rất đơn giản: chúng cho phép bạn phân tách các chi tiết xử lý một giao thức với việc xử lý các kiểu dữ liệu cụ thể, cung cấp các giao diện người dùng, và thực hiện các công việc khác mà một trình duyệt thường làm. Lớp cơ sở URLConnection là một lớp trừu tượng; để cài đặt một giao thức cụ thể bạn cần phải viết một lớp con. Các lớp con này có thể được tải bởi các ứng dụng của riêng bạn hay bởi các trình duyệt HotJava; trong tương lai, các ứng dụng Java có thể tải về các trình quản trị giao thức khi cần. Read more…

Lập trình mạng trong JAVA(Phần 2)

2. Lớp URL

Cách đơn giản nhất để một chương trình Java định vị và tìm kiếm dữ liệu là sử dụng một đối tượng URL. Bạn không cần phải lo lắng tới các chi tiết bên trong của giao thức đang được sử dụng, khuôn dạng dữ liệu được nhận, hay làm thế nào để truyền tin với server; bạn chỉ cần cho biết URL, Java sẽ lấy dữ liệu về cho bạn.

Lớp java.net.URL là một khái niệm về bộ định vị tài nguyên thống nhất. Nếu lưu trữ URL dưới dạng một đối tượng String sẽ  không có lợi so với việc tổ chức URL như  một đối tượng với các trường : giao thức (protocol), hosname, cổng (port), đường dẫn (path), tên tập tin (filename), mục tài liệu (document section), mỗi trường có thể  được thiết lập một cách độc lập.

2.1. Tạo các URL

Có bốn constructor, khác nhau về thông tin mà nó cần. Constructor mà bạn sử dụng phụ thuộc vào thông tin mà bạn có, và khuôn dạng trong URL  đó.  Tất cả các constructor này sẽ  đưa ra ngoại lệ MalformedURLException (URL không  đúng khuôn dạng) nếu ta tạo ra một URL cho một giao thức mà nó không được hỗ trợ.URL cung cấp các hàm cấu tử sau:

•  public URL(String url) throws MalformedURLException
Đây là constructor đơn giản nhất; tham số của nó chỉ là một URL ở dạng xâu.   Read more…

Lập trình mạng trong JAVA

Phần I: Lập trình mạng với các lớp InetAddress, URL, và URLConnection

1.Lớp InetAddress

Các thiết bị được kết nối với mạng LAN có địa chỉ vật lý duy nhất. Điều này giúp cho các máy khác trên mạng trong việc truyền các gói tin đến đúng vị trí. Tuy nhiên, địa chỉ này chỉ có ích trong mạng LAN. Một máy không thể xác định được vị trí trên Internet bằng cách sử dụng các địa chỉ vật lý, vì các địa chỉ vật lý không chỉ ra vị trí của máy. Hơn nữa, các máy thường di chuyển từ vị trí này sang vị trí khác, trong trường hợp của máy xách tay hoặc máy palm chẳng hạn.

Những người lập trình mạng không cần phải quan tâm  đến từng chi tiết dữ liệu được định tuyến như thế nào trong một mạng LAN. Hơn nữa, Java không cung cấp khả năng truy xuất tới các giao thức tầng liên kết dữ liệu mức thấp được sử dụng bởi LAN. Việc hỗ trợ như vậy là rất khó khăn. Vì mỗi kiểu giao thức sử dụng một kiểu địa chỉ khác nhau và có các đặc trưng khác nhau, chúng ta cần phải các chương trình khác nhau cho mỗi kiểu giao thức mạng khác nhau. Thay vào đó, Java hỗ trợ giao thức TCP/IP, giao thức này có nhiệu vụ liên kết các mạng với nhau.

Các thiết bị có một kết nối Internet trực tiếp được cung cấp một định danh duy nhất được gọi là địa chỉ IP. Các địa chỉ IP có thể là tĩnh hoặc động. Các địa chỉ IP được cấp phát động thường được sử dụng khi nhiều thiết bị cần truy cập Internet trong khoảng thời gian nhất định. Một địa chỉ IP chỉ có thể gắn với một máy, nó không thể dùng chung. Địa chỉ này được sử dụng bởi giao thức IP để định tuyến các datagram tới đúng vị trí. Không có địa chỉ, ta không thể liên lạc được với máy đó; vì thế tất cả các máy tính đều phải có một địa chỉ IP duy nhất.

Lớp java.net.InetAddress biểu diễn một  địa chỉ Internet. Nó bao gồm hai trường thông tin: hostName (một đối tượng kiểu String) và address (một số kiểu int). Các trường này không phải là trường public, vì thế ta không thể truy xất chúng trực tiếp. Lớp này được sử dụng bởi hầu hết các lớp mạng, bao gồm Socket, ServerSocket, URL, DatagramSocket, DatagramPacket,… Read more…