Thứ Năm, 15 tháng 8, 2013

Thiết lập một Server và Client đơn giản sử dụng Stream Sockets

Bước thứ nhất: Tạo một ServerSocket

Thiết lập một server đơn giản yêu cầu 5 bước  . Bước 1 là tạo một ServerSocket object. Một lời gọi tới ServerSocket constructor, ví dụ như

    ServerSocket server = new ServerSocket( portNumber, queueLength);

đăng ký môt TCP port number  có sẵn và chỉ rõ số lượng clients cực đại có thể chờ để kết nối đến server (ví dụ như, queue length) . Port number được sử dụng bởi client để xác định vị trí của ứng dụng server trên máy server. Nó thường được gọi là handsharke point. Nếu queue bị đầy, server sẽ từ chối các kết nối của client. Constructor thiết lập port nơi server chờ các kết nối đến từ clients -- một quá trình được biết đến như là binding the server to the port. Mỗi client sẽ yêu cầu để kết nối đến server trên port này. Duy nhất một ứng dụng tại một thời điểm có thể được gán để một port xác định trên server.

Note: Port numbers có thể nằm giữa 0 và 65,535. Hầu hết các hệ điều hành dành riêng các port được đánh số nhỏ hơn 1024 cho các dịch vụ hệ thống (ví dụ, email và World Wide Web servers). Nói chung, những port dưới 1024 không được xác định như là các ports kết nối trong các chương trình người dùng. Thực tế, một vài hệ điều hành yêu cầu các đặc quyền truy nhập đặc biệt để gán các chỉ số port dưới 1024.

Bước 2: Chờ đợi một kết nối

Các chương trình quản lý mỗi kết nối client với một Socket object. Trong Bước 2, server lắng nghe một cách không giới hạn (hoặc các khối) cho một nỗ lực kết nối đến từ client. Để lắng nghe một kết nối client, chương trình gọi phương thức accept từ ServerSocket, như sau:

    Socket connection = server.accept();

sau khi thực hiện dòng lệnh phía trên ta thu được kết quả là một Socket khi một kết nối với một client được thiết lập. Socket này cho phép server tương tác với client. Những sự tương tác với client thực sự diễn ra tại một server port khác với handshake point. Nó cho phép port được chỉ định trong Bước 1 được sử dụng lại trong một server đa luồng để chấp nhận một kết nối client khác.

Bước 3: Lấy I/O Streams của Socket
Bước 3 là lấy OutputStream  và InputStream objects để giúp server giao tiếp với client bằng các hành động như gửi và nhận bytes. Server gửi thông tin tới client thông qua một OutputStream và nhận thông tin từ client thông qua một InputStream. Server gọi phương thức getOutputStream trên socket để có được một tham chiếu tới OutputStream của Socket và gọi phương thức getInputStream trên Socket để có được một tham chiếu tới InputStream của Socket 

Stream objects có thể được sử dụng để gửi hoặc là nhận từng bytes hoặc một chuỗi bytes với phương thức write của OutputStream và phương thức read của InputStream tương ứng. Thông thường, sẽ là hữu dụng để gửi và nhận các giá trị của các kiêu nguyên thủy (ví dụ, int double) hoặc Serializable objects (ví dụ, Strings hoặc các kiểu serializable khác) hơn là gửi bytes. Chúng ta sử dụng các kiểu stream khác (ví dụ như ObjectOutputStream và ObjectInputStream) xung quanh OutputStream InputStream kết hợp với Socket. Ví dụ,

    ObjectInputStream input = 
         new ObjectInputStream( connection.getInputStream() );

    ObjectOutputStream output = 
         new ObjectOutputStream( connection.getOutputStream() );

Vẻ đẹp trong việc thiết lập các mối quan hệ như trên đó là bất cứ thứ gì server writes tới ObjectOutputStream  được gửi thông qua OutputStream và là available tại InputStream của client, và bất cứ thứ gì client writes tới OutputStream của nó (với một ObjectOutputStream tương ứng) là available với InputStream phía server.

Bước 4: Thông hiện việc xử lý
Bước 4 là một chặng xử lý, xử lý những gì mà server và client giao tiếp thông qua OutputStream InputStream objects.

Bước 5: Đóng kết nối 
Trong Bước 5, khi việc truyền dữ liệu giữa hai bên hoàn tất, server đóng kết nối thông qua việc gọi phương thức close trên các streams và trên Socket.


Thiết Lập Một Client Đơn Giản Sử Dụng Stream Sockets

Thiết lập một client đơn giản trong Java yêu cầu 4 bước.

Bước 1: Tạo một Socket để kết nối tới Server
Trong Bước 1, chúng ta tạo một Socket để kết nối đến server. Socket constructor thiết lập kết nối. Cho ví dụ, statement sau:

    Socket connection = new Socket( serverAddress, port);

sử dụn Socket constructor với 2 arguments  --- Địa chỉ của server (serverAddress) và port number. Nếu việc kết nối là thành công, statement này sẽ trả về một Socket. Một nỗ lực kết nối thất bại có thể ném ra một thể hiện (instance) cả subclass của IOException., vì vậy nhiều chương trình đơn giản bắt IOException. Một UnknownHostException xảy ra hệ thống không thể được server name được chỉ định trong một lời gọi tới Socket constructor tới một địa chỉ IP tương ứng.

Bước 2: Lấy I/O Streams của Socket
Trong Bước 2, client sử dụng các phương thức getInputStream getOutputStream của Socket để có được các tham chiếu tới InputStream OutputStream của Socket. Cũng như trong bước 2 đối với phía server, chúng ta có thể sử dụng các kĩ thuật với các kiểu stream khác xung quanh InputStream OutputStream được kết hợp với Socket. Nếu server đang gửi thông tin trong dạng của các kiểu thực sự, client nên nhận thông tin trong cùng một định dạng. Do vậy, nếu server gửi các giá trị với ObjectOutputStream , client nên đọc các giá trị này với ObjectInputStream. 

Bước 3: Thực hiện việc xử lý
Bước 3 là một chặng xử lý các dữ liệu trong giao tiếp giữa client và server thông qua InputStream OutputStream objects.

Bước 4: Đóng kết nối
Trong Bước 4, client đóng kết nối khi việc trao đổi dữ liệu hoàn tất thông qua việc gọi phương thức close trên các streams và trên Socket. Client phải xác định khi nào server hoàn tất việc gửi thông tin vì vậy nó có thể gọi close để đóng kết nối Socket. Cho ví dụ, phương thức read của  InputStream trả về giá trị -1 khi nó tìm thấy end-of-stream (còn được gọi là EOF - end of file). Nếu một ObjectInputStream đọc thông tin từ server, một EOFException xảy ra khi client cố gắng đọc một giá trị từ một stream những gì end-of-stream được phát hiện.

Không có nhận xét nào:

Đăng nhận xét