Hungkin’s Blog

Lập trình mạng với TCPSocket (kỳ1)

Posted by hungkin™ on 28/05/2009

Giới thiệu :
Để thuận lợi cho việc tìm hiều về lập trình TCP Socket, bạn cần có những kiến thức cơ bản về java cũng như cơ chế TCP. Bài toán TCP Socket giải quyết các vấn đề giao tiếp giữa các máy trong một hệ thống mạng.

Khái niệm :
Trong bài toán TCP, có hai đối tượng tham gia đó là máy chủ và máy trạm. Máy chủ sẽ cài đặt cổng cho máy trạm có thể giao tiếp được. Lúc chương trình kích hoạt, máy chủ sẽ chờ và không làm gì cả cho đến khi máy trạm đăng nhập và kết nối đến thông qua cổng mà máy chủ  đã cài đặt. Lúc máy trạm đã kết nối được với máy chủ thì cả máy chủ và máy trạm sẽ sử dụng các đối tượng của lớp Socket. Các đối tượng này đều sử dụng các stream output và input đề giao tiếp dữ liệu cho nhau.

Ví dụ
Lớp Socket được cài đặt trong gói java.net. Do đó, có thể khai báo bằng cú pháp “import java.net.*;” ở ngay đầu  tệp java. Ví dụ sau sẽ giới thiệu các phần khác nhau của một bài toán TCP Socket. Trong ví dụ này, máy chủ sử dụng địa chỉ IP là “127.0.0.0” thông qua tên định danh “localhost”. Dó đó, máy trạm sẽ được cài đặt trên cùng một máy với máy chủ.

Đây là đoạn mã của Server.java

import java.lang.*;
import java.io.*;
import java.net.*;
class Server {
public static void main(String args[]) {
String data = “Xin chao cac ban cua may tram TCP Socket!”;
try {
ServerSocket srvr = new ServerSocket(1234);
Socket skt = srvr.accept();
System.out.print(“May chu da duoc ket noi!\n”);
PrintWriter out = new PrintWriter(skt.getOutputStream(), true);
System.out.print(“Du lieu se gui di cho may tram: ‘” + data + “‘\n”);
out.print(data);
out.close();
skt.close();
srvr.close();
}
catch(Exception e) {
System.out.print(“He thong khong lam viec!\n”);
}
}
}
Phần chính của chương trình này được đặt trong khối lệnh try {}.  Đối tượng srvr  của ServerSocket sẽ cài đặt cổng cho máy chủ để máy trạm có thể kết nối đến. Đối tượng skt của Socket sử dụng phương thức accept() của lớp ServerSocket. Phương thức này có nhiệm vụ chờ cho đến khi máy trạm kết nối đến thì trả về một đối tượng skt của lớp Socket. Và đối tượng skt có thể giao tiếp được với máy trạm. skt.getOutputStream() trả về output stream, thông qua đó máy chủ có thể nói chuyện được với máy trạm và skt.getInputStream() trả về input stream, thông qua đó máy chủ có thể nghe được máy trạm.  Trong ví dụ này, đối tượng của PrintWriter sử dụng output stream cho việc gửi dữ liệu cho máy trạm thông qua out.print(data). Sau khi, mọi thứ được thực hiện xong, tất cả stream và socket sẽ được đóng lại trước khi chương trình kết thúc.

Bây giờ, xem đoạn mã của máy trạm
Đây là đoạn mã của Client.java

import java.lang.*;
import java.io.*;
import java.net.*;
class Client {
public static void main(String args[]) {
try {
Socket skt = new Socket(“localhost”, 1234);
BufferedReader in = new BufferedReader(new
InputStreamReader(skt.getInputStream()));
System.out.print(“Du lieu da nhan: ‘”);
while (!in.ready()) {}
System.out.println(in.readLine()); // Doc mot dong va in no ra man hinh
System.out.print(“‘\n”);
in.close();
}
catch(Exception e) {
System.out.print(“He thong khong lam viec!\n”);
}
}
}
Một lần nữa, phần chính của chương trình được đặt trong khối lệnh try{ }. Một kết nối đến máy chủ được thiết lập thông qua đối tượng của lớp Socket. Nó sẽ kết nối đến máy chủ tại địa chỉ localhost thông qua cổng 1234-cùng cổng mà máy chủ đã cài đặt để kết nối máy trạm. Ở đây, phương thức getInputStream() của đối tượng skt được sử dụng để lấy dữ liệu mà máy chủ đã gửi và đưa vào đối tượng in của lớp BufferedReader. Và thông qua đối tương in sẽ dùng phương thức readLine() để đọc dòng dữ liệu trong buffer ra, rồi hiện thị ra màn hình nhờ System.out.println(in.readLine()). Các bạn đã thấy đơn giản chưa?!

Các bước chạy ví dụ trên:

1, Copy hai file Server.java và Client.java vào cùng một máy, ví dụ copy vào thư mục: c:\TCP\

2, Biên dịch file Server.java và Client.java bằng cú pháp: javac *.java     .

3, Chạy lệnh java Server để khởi động máy chủ

4, Chạy lệnh java Client để chạy máy trạm

5, Kết quả: máy trạm sẽ nhận được thông báo “Xin chao cac ban cua may tram TCP Socket!” do máy chủ gửi tới.

6, Có thể chạy Client trên một máy khác với máy chủ bằng cách thay localhost trong file Client.java bởi địa chỉ IP của máy chủ.

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s

 
%d bloggers like this: