Java - Sockets
Sockets Trong Java các lớp URL và URLConnections cung cấp một cơ chế high-level để truy cập tài nguyên trên Internet. Tuy nhiên đôi khi các chương trình của bạn yêu cầu việc giao tiếp với nhau qua mạng nội bộ, ví dụ như khi bạn muốn viết một ứng dụng client-server. Trong các ứng dụng ...
Sockets
Trong Java các lớp URL và URLConnections cung cấp một cơ chế high-level để truy cập tài nguyên trên Internet. Tuy nhiên đôi khi các chương trình của bạn yêu cầu việc giao tiếp với nhau qua mạng nội bộ, ví dụ như khi bạn muốn viết một ứng dụng client-server.
Trong các ứng dụng client-server, server cung cấp một số dịch vụ, chẳng hạn như xử lý các truy vấn cơ sở dữ liệu hoặc gửi giá cổ phiếu hiện tại. Client sử dụng dịch vụ được cung cấp bởi server, hoặc hiển thị kết quả truy vấn cơ sở dữ liệu cho người dùng hoặc đưa ra đề xuất mua cổ phiếu cho nhà đầu tư. Giao tiếp xảy ra giữa client và server phải đáng tin cậy. Tức là, không có dữ liệu nào có thể bị biến mất và phải đến phía client theo thứ tự mà server đã gửi nó.
TCP(Transmission Control Protocol) cung cấp một kênh truyền thông đáng tin cậy cho phép ứng dụng client-server sử dụng để giao tiếp với nhau. Để có thể giao tiếp với nhau qua TCP, client và server được thiết lập để kết nối với nhau qua Socket.
Socket là gì?
Socket là một điểm cuối(end-point) của liên kết truyền thông hai chiều(two-way communication) giữa hai chương trình chạy trên mạng. Các lớp Socket được sử dụng để biểu diễn kết nối giữa client và server. Gói java.net cung cấp hai lớp - Socket và ServerSocket - thể hiện kết nối giữa client và server.
Các Socket cung cấp kỹ thuật giao tiếp giữa hai máy tính sử dụng TCP. Một chương trình Client tạo một socket trên đầu cuối của giao tiếp và cố gắng để kết nối socket đó tới một Server.
Khi kết nối được tạo, Server tạo một đối tượng Socket trên đầu cuối của giao tiếp. Client và Server bây giờ có thể giao tiếp bằng việc đọc và ghi từ Socket.
Lớp java.net.Socket biểu diễn một Socket, và lớp java.net.ServerSocket cung cấp một kỹ thuật cho chương trình Server để nghe thông tin từ các Client và thành lập các kết nối với chúng.
Các bước sau xảy ra khi thành lập một kết nối TCP giữa hai máy tính sử dụng Socket:
Server khởi tạo một đối tượng ServerSocket, biểu thị số hiệu cổng (port) nào để xuất hiện giao tiếp.
Server gọi phương thức accept() của lớp ServerSocket. Phương thức này đợi tới khi một Client kết nối với Server trên cổng đã cho.
Sau khi Server đang đợi, một Client khởi tạo một đối tượng Socket, xác định tên Server và số hiệu cổng để kết nối tới.
Constructor của lớp Socket cố gắng để kết nối Client tới Server và số hiệu cổng đã xác định. Nếu giao tiếp được thành lập, bây giờ Client có một đối tượng Socket có khả năng giao tiếp với Server.
Trên Server-side, phương thức accept() trả về một tham chiếu tới một socket mới trên Server mà được kết nối với socket của Client.
Sau khi các kết nối được thành lập, giao tiếp có thể xảy ra bởi sử dụng I/O stream. Mỗi Socket có cả một OutputStream và InputStream. OutputStream của Client được kết nối với InputStream của Server, và InputStream của Client được kết nối với OutputStream của Server.
TCP là một giao thức giao tiếp hai chiều, vì thế dữ liệu có thể được gửi qua cả hai luồng tại cùng một thời điểm. Các lớp hữu ích sau đây cung cấp đầy đủ các phương thức để triển khai các Socket.
Ví dụ về Socket
package vuta.socket.example; import java.net.*; import java.io.*; class MyServer { public static void main(String args[]) throws Exception { ServerSocket ss = new ServerSocket(3333); Socket s = ss.accept(); DataInputStream din = new DataInputStream(s.getInputStream()); DataOutputStream dout = new DataOutputStream(s.getOutputStream()); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = "", str2 = ""; while (!str.equals("stop")) { str = din.readUTF(); System.out.println("client says: " + str); str2 = br.readLine(); dout.writeUTF(str2); dout.flush(); } din.close(); s.close(); ss.close(); } }
package vuta.socket.example; import java.net.*; import java.io.*; class MyClient { public static void main(String args[]) throws Exception { Socket s = new Socket("localhost", 3333); DataInputStream din = new DataInputStream(s.getInputStream()); DataOutputStream dout = new DataOutputStream(s.getOutputStream()); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = "", str2 = ""; while (!str.equals("stop")) { str = br.readLine(); dout.writeUTF(str); dout.flush(); str2 = din.readUTF(); System.out.println("Server says: " + str2); } dout.close(); s.close(); } }