Danh sách sinh viên tốt nghiệp Đại học - Cao đẳng Trường Đại học Phú Yên năm ...
Socket
1. Trang 1
Chương 11: Socket
Kết nối socket theo mô hình client- server
Thực hiện: Huỳnh Minh Trí.
I. Khái niệm Socket.
1. Socket.
- Trong lập trình mạng dựa trên socket, ta không truy cập trực tiếp vào các
giao thức mạng để gửi và nhận các gói tin. Thay vào đó, một bộ trung gian
được tạo ra để xử lý các giao tiếp mạng.
- Socket là một thiết bị đầu cuối giao tiếp 2 chiều, cho phép hai máy kết nối
với nhau giữa 2 chương trình chạy trên mạng.
- Các tập tin đặc biệt sử dụng để tham chiếu các kết nối mạng được gọi là
socket. Socket được định nghĩa như sau:
Một miền truyền tin cụ thể.
Một loại thông tin liên lạc cụ thể.
Có một giao thức cụ thể (TCP, UDP).
- Khi một socket được tạo ra, nó phải được gắn một địa chỉ mạng cụ thể và
một port trên hệ thống, hoặc một địa chỉ mạng từ xa và một port. Khi đó
socket có thể gửi và nhận dữ liệu từ mạng.
2. Socket API.
- Dùng cơ chế client/server.
- Cung cấp hai dịch vụ vận chuyển các gói tin thông qua socket API:
Unreliable datagram: Gói tin không đáng tin cậy.
Reliable, byte stream-oriented:
3. Server socket.
- Server socket là một stream, cho phép đọc ghi các dòng dữ liệu tại một địa
chỉ IP và port cụ thể.
- Nó làm đơn giản đi việc xử lý dữ liệu, không phải bận tâm loại dữ liệu là gì
hay kích thước gói tin. Mọi thứ như việc xuất nhập bình thường.
II. Kết nối giữa client và server.
- Phía client: Biết hostname của server đang chạy cùng port mà nó đang lắng
nghe.
2. Trang 2
- Phía server: Chuẩn bị sẳng sàng cho client kết nối tới. Nếu mọi việc suôn sẻ
server cho phép client kết nối.
- Khi kết nối tới server thành công, client có thể sử dụng socket đó để giao
tiếp với server. Khi đó server tạo một socket mới gắn kết với port khác để
gắn phục vụ client kết nối, khi đó server vẫn tiếp tục lắng nghe yêu cầu kết
nối từ các client khác.
III. Câu trúc chung chương trình client- server.
1. Câu trúc chương trình client.
B1: Mở socket.
Socket socket = new Socket(InetAddress.getLocalHost(), port);
B2: Mở luồng đọc.
BufferedReader br = new BufferedReader(new
InputStreamReader(socket.getInputStream()));
B3: Mở luồng ghi.
PrintStream ps = new PrintStream(socket.getOutputStream());
B4: Gửi dữ liệu cho server.
ps.println(String str);
B5: Nhận dữ liệu từ server.
String str = br.readLine();
2. Câu trúc chương trình server.
B1: Mở socket.
ServerSocket server = new ServerSocket(port);
B2: Chờ client kết nối và chấp nhận kết nối.
Socket socket= server.accept();
B3: Mở luồng đọc.
BufferedReader br = new BufferedReader (new
InputStreamReader( socket.getInputStream()
));
B4: Mở luồng ghi dữ liệu.
PrintStream ps = new
PrintStream (socket.getOutputStream(), true);
B5: Lấy dữ liệu từ client.
String request = br.readLine();
B6: Gửi dữ liệu cho client.
Ps.println();
IV.Cấu trúc chương trình client- server Object.
1. Đối tượng.
- Các class, các đối tượng trong java.
- Dùng BufferReader chỉ gửi nhận được thông điệp dạng byte.
3. Trang 3
2. Cấu trúc chương trình client.
B1: Mở socket.
Socket socket = new Socket(InetAddress.getLocalHost(), port);
B2: Mở luồng đọc.
ObjectInputStream ois = new
ObjectInputStream(socket.getInputStream());
B3: Mở luồng ghi.
ObjectOutputStream oos = new ObjectOutputStream(
socket.getOutputStream());
B4: Gửi dữ liệu cho server.
Message m1 = new Message("Chao server", "Gui tien cho toi");
oos.writeObject(m1);
B5: Nhận dữ liệu từ server.
Message m2 = (Message) ois.readObject();
3. Cấu trúc chương trình server.
B1: Mở socket.
ServerSocket server = new ServerSocket(port);
B2: Chờ client kết nối và chấp nhận kết nối.
Socket cs= server.accept();
B3: Mở luồng đọc.
ObjectInputStream ois = new
ObjectInputStream(socket.getInputStream());
B4: Mở luồng ghi dữ liệu.
ObjectOutputStream oos = new ObjectOutputStream(
socket.getOutputStream());
B5: Lấy dữ liệu từ client.
Message m1 = (Message) ois.readObject();;
B6: Gửi dữ liệu cho client.
Message m2 = new Message("Server", "Het tien roi");
oos.writeObject(m2);
V. MultiThread Socket.
- Server phục vụ nhiều client cùng một lúc, nên server phải luôn trong tình
trạng lắng nghe yêu cầu kết nối của client.
- Mỗi client kết nối tới, server tạo ra một thread để phục vụ cho client đó.
Chương trình Server.
public class ServerSerializable {
public void serve() throws IOException {
int port = 1992;
4. Trang 4
ServerSocket server = new ServerSocket(port);
int cout = 0;
while (true) {
System.out.println("Server ready ...");
Socket socket = server.accept();
System.out.println("Client " + cout);
new ServerThread(socket).start();
}
}
Thread server
public class ServerThread extends Thread {
private Socket socket;
public ServerThread(Socket socket) {
this.socket = socket;
}
public void run() {
try {
ObjectInputStream ois;
ois = new ObjectInputStream(socket.getInputStream());
Message m1 = (Message) ois.readObject();
System.out.println("Client gui:");
System.out.println("Title: " + m1.getTitle() + "nBody: "
+ m1.getBody());
// Send
Message m2 = new Message("Server", "Het tien roi");
ObjectOutputStream oos = new ObjectOutputStream(
socket.getOutputStream());
oos.writeObject(m2);
System.out.println("Server gui:");
System.out.println("Title: " + m2.getTitle() + "nBody: "
+ m2.getBody());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}