1. Khái niệm:
- Socket là một đầu trong kết nối liên lạc hai chiều giữa hai chương trình trên mạng. Gĩi java.net cung cấp lớp Socket để cài đặt kết nối phía client và ServerSocket để cài đặt kết nối phía server.
- SocketServer đợi, lắng nghe yêu cầu kết nối từ SocketClient
Khi chấp nhận kết nối, SocketServer tạo một socket mới kết buộc với một cổng khác để phục vụ cho client đã kết nối, trong khi SocketServer vẫn tiếp tục lắng nghe yêu cầu kết nối từ các client khác.
Sau đĩ server và client sẽ liên lạc với nhau thơng qua socket của chúng. Lưu ý:
+ Client dùng cổng cục bộ trên máy của client.
+ Nếu kết nối tới Web Server thì lớp URL thích hợp hơn lớp Socket, thực ra lớp URL cũng sẽ sử dụng lớp socket
2. Cấu trúc chương trình client
STT Thao tác Sử dụng lệnh
1 Mở socket (dùng để kết nối với
server) Socket cs = new Socket("ServerName", port);
2 Mở luồng đọc (dùng để đọc dl do
server gởi) BufferedReader in = new BufferedReader (new InputStreamReader( cs.getInputStream() ));
3 Mở luồng ghi (dùng để gởi dl cho
server) PrintWriter out = new PrintWriter (cs.getOutputStream(), true); 4 Mở luồng đọc dl từ bàn phím (nếu
cần) BufferedReader BufferedReader stdIn = (new new
InputStreamReader(System.in) );
5 Gởi dl cho server out.println(String str);
6 Lấy dl do server gởi String str=in.readLine();
7 Đĩng các luồng đọc, ghi, đĩng socket in.close();out.close(); sdtIn.close(); cs.close();
Ghi chú:
- Reader, writer: cĩ thể đọc ghi kí tự Unicode qua socket - Đĩng luồng đọc/ghi, sau đĩ mới đĩng socket
32
* Chương trình client mẫu
import java.io.*; import java.net.*;
public class Client
{
public static void main(String[] args) throws IOException
{
Socket cs = new Socket("ServerName", 1234);
PrintWriter out = new PrintWriter(cs.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(
cs.getInputStream() ));
//các lệnh gởi, nhận dữ liệu với server
out.close(); in.close(); cs.close(); }
}
3. Cấu trúc chương trình server
STT Thao tác Sử dụng lệnh
1 Mở socket (dùng để kết nối với client) ServerSocket ss = new
ServerSocket(port); 2 Chờ client kết nối và chấp nhận kết
nối Socket cs= ss.accept();
3 Mở luồng đọc (dùng để đọc dl do
server gởi) BufferedReader in = new BufferedReader (new InputStreamReader( cs.getInputStream() ));
4 Mở luồng ghi (dùng để gởi dl cho
client) PrintWrite out = new PrintWriter (cs.getOutputStream(), true); 5 Tạo luồng đọc dl từ bàn phím (nếu
cần) BufferedReader BufferedReader stdIn = (new new
InputStreamReader(System.in) );
6 Gởi dl cho client out.println(String str);
7 Lấy dl do client gởi String str=in.readLine();
8 Đĩng các luồng đọc/ghi, đĩng các
* Chương trình server mẫu (1 client)
import java.net.*; import java.io.*;
public class Server {
public static void main(String[] args) throws IOException
{
ServerSocket ss = new ServerSocket(1234); Socket cs = ss.accept();
PrintWriter out = new PrintWriter(cs.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(
cs.getInputStream()));
//các lệnh gởi/nhận dữ liệu với một client
out.close(); in.close(); cs.close(); ss.close(); }
}
Để phục vụ nhiều client kết nối đồng thời thì server cần tạo ra các tiểu trình, mỗi tiểu trình sẽ gởi/nhận dữ liệu với một client.
* Chương trình server mẫu (nhiều client)
import java.net.*; import java.io.*;
public class Server
{
public static void main(String[] args) throws IOException
{
ServerSocket ss = new ServerSocket(1234); //cĩ thể thay port khác boolean listening = true;
while (listening) {
Socket cs=ss.accept();
34 }
}
//lớp ServiceThread : tiểu trình phục vụ cho một client
import java.net.*; import java.io.*;
public class ServiceThread extends Thread
{
private Socket socket = null;
public ServiceThread(Socket socket)
{
super("ServiceThread"); this.socket = socket; }
public void run()
{
try {
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader( new InputStreamReader( socket.getInputStream()));
//các lệnh gởi, nhận dữ liệu với một client
out.close(); in.close(); socket.close();
} catch (IOException e) { e.printStackTrace(); } }
}
* Chương trình server mẫu (nhiều client) (cách khác)
import java.net.*; import java.io.*;
public class Server extends Thread
{
private Socket socket = null; public Server(Socket socket)
{
super("ServiceThread"); this.socket = socket; }
public static void main(String[] args) throws IOException
{
ServerSocket ss = new ServerSocket(1234); //cĩ thể thay port khác boolean listening = true;
while (listening) { Socket cs=ss.accept(); new Server(cs).start(); } ss.close(); }
public void run()
{
try {
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader( new InputStreamReader( socket.getInputStream()));
//các lệnh gởi, nhận dữ liệu với một client
out.close(); in.close(); socket.close();
} catch (IOException e) { e.printStackTrace(); } }
}