[JavaNetwork]Bài 1- Lập trình mạng với java

Chào các bạn!
Hôm nay mình xin giới thiệu tới các bạn cơ bản về truyền nhận dữ liệu theo mô hình Client-Server bằng ngôn ngữ java.

Trước tiên bạn cần làm quen với khái niệm máy khách, máy chủ. Máy khách hay máy chủ thực chất chỉ là hai máy tính thông thường. Tuy nhiên, máy chủ có cấu hình cao hơn rất nhiều lần so với máy khách bởi máy chủ thực hiện nhiều công việc hơn nhằm đáp ứng được cho nhiều máy khách.

Screenshot from 2014-04-24 00:06:42

Port: khái niệm port được hiểu là một cổng giao tiếp dùng để làm đường truyền, nhận dữ liệu. Trong máy tính hiện nay có tối đa xxx cổng(mình không nhớ lắm) và đã có một số cổng được đăng ký riêng để sử dụng truyền dữ liệu như dịch vụ mail, dịch vụ web, dịch vụ chat,…
Host address: Host được hiểu như là một mảnh đất trong một khu phố nào đó.
Domain: Domain là tên miền giống như địa chỉ của ngôi nhà được xây trên mảnh đất.
Ví dụ:
Vietsource.net là một tên miền, khi các bạn truy cập vào website này thì các bạn sẽ thấy nội dung của website đó. Nội dung website được lưu ở host. Như vậy một host có thể sẽ có nhiều tên miền khả dụng.

Vậy khi muốn truyền và nhận dữ liệu giữa hai máy tính ta sẽ coi một máy là máy chủ, một máy là máy khách. Trong đó để bắt đầu quá trình truyền thì máy khách phải chủ động gửi thông tin cho máy chủ để máy chủ thực hiện quá trình truyền. Để gửi được dữ liệu cho máy chủ thì máy khách cần biết địa chỉ host của nó chính là tên miền, đồng thời phải quy định cổng truyền dữ liệu giữa hai máy có giá trị bao nhiêu.

Truyền dữ liệu trong java. Làm quen với khái niệm truyền nhận dữ liệu trong java ta cần tách biệt hai đối tượng client và server. Ta phải viết hai chương trình độc lập, một chương trình chạy trên máy khách sẽ thực hiện chủ động gửi dữ liệu cho máy chủ và lắng nghe kết quả mà máy chủ gửi lại, một chương trình giành riêng cho máy chủ làm nhiệm vụ luôn luôn lắng nghe máy khách cho tới khi nào nhận được một tin nhắn thì xử lý tin nhắn và gửi lại cho máy khách.

Vậy trước hết ta đi vào xây dựng chương trình cho máy khách:

Bắt đầu vào chương trình mình xin giới thiệu qua đối tượng Socket, đối tượng này làm nhiệm tạo kết nối tới máy chủ và cho phép đưa dữ liệu lên đường truyền và thực hiện truyền cho máy chủ.

package opin.connect;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class ClientProcess {
	
	private Socket socket = null;
	
	public ClientProcess(String hostAddress, int port){
		try {
			socket = new Socket(hostAddress, port);
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public boolean sendMSG(Object msg){
		
		if(socket == null)
			return false;
		
		try {
			ObjectOutputStream stream = new ObjectOutputStream(socket.getOutputStream());
			stream.writeObject(msg);
			return true;
		} catch (IOException e) {
			e.printStackTrace();
		}
		return false;
	}

	public Object receiveMSG(){
		
		try {
			ObjectInputStream stream = new ObjectInputStream(socket.getInputStream());
			try {
				return stream.readObject();
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return null;
	}
	
	public static void main(String args[]){
		// thực hiện kết nối tới máy chủ có địa chỉ là localhost theo cổng 345
		ClientProcess client = new ClientProcess("localhost", 9999);
		client.sendMSG(new String("chao cac ban")); // gửi thông tin cho server
		String s = (String) client.receiveMSG(); // nhận thông tin phản hồi từ server
		System.out.printf("Đã nhận một xâu từ máy chủ: " + s);
	}
		
}

Trong chương trình trên, quá trình truyền/nhận dữ liệu mình sử dụng kiểu Object, như vậy bạn có thể truyền và nhận bất kỳ kiểu dữ liệu nào khác chỉ cần ép thành Object và từ Object ép ngược lại cho đúng kiểu là được. Ép kiểu giống với ví dụ mình truyền với kiểu String.

Lưu ý: khi chạy chương trình bạn cần chạy chương trình cho server trước rồi sau đó mới chạy chương trình của máy khách.

Tiếp theo là chương trình giành cho máy chủ. Máy chủ liên tục phải thực hiện lắng nghe thông tin gửi từ máy khách sau đó xử lý thông tin và gửi trả kết quả cho máy khách.
Khi làm việc với Server ta vẫn làm việc với socket nhưng đối tượng này chỉ giành riêng cho server và được định nghĩa là ServerSocket.

 
package opin.connect;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerProcess {
	private Socket socket;
	private ServerSocket serverSocket;	
	
	public ServerProcess(int port){
		try {
			serverSocket = new ServerSocket(port);
			System.out.println("Kết nối thành công tới port " + port);
		} catch (IOException e) {
			e.printStackTrace();
		}	

	}


	public Object receiveMSG(){
		try {
			socket = serverSocket.accept();		// lắng nghe kết nối từ đường truyền
			ObjectInputStream stream = new ObjectInputStream(socket.getInputStream()); // khởi tạo bộ đệm đọc
			try {
				return  stream.readObject();	// đọc dữ liệu từ bộ đệm
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public boolean sendMSG(Object msg){
		
		try {
			// khởi tạo bộ đệm ghi dữ liệu với đầu vào là bộ đệm của socket
			ObjectOutputStream stream = new ObjectOutputStream(socket.getOutputStream());
			stream.writeObject(msg);	// ghi dữ liệu lên bộ đệm của đường truyền
			return true;
		} catch (IOException e) {
			e.printStackTrace();
		}
		return false;
	}
	

	public static void main(String args[]){
		// thực hiện khởi tạo lắng nghe kết nối từ cổng 345
		ServerProcess server = new ServerProcess(9999);
		String s =(String) server.receiveMSG(); // nhận thông tin từ Client
		System.out.printf("Đã nhận một xâu từ máy khách: " + s);
		server.sendMSG("Máy chủ đã nhận dữ liệu thành công"); // gửi thông tin cho Client
	}
}

Share this:

Thích bài này:

Thích

Đang tải…