Trang chủ

lập trình mạng với java – bài 1

 

 

giới thiệu lập trình mạng với java

 

LẬP TRÌNH JAVA TRÊN MẠNG

 

Để lập trình trong java, bạn cần phải biết về TCP(Transfer Control Protocol), UDP(User Datagram Protocol ), Sockets, Datagram và Port

 

Những máy tính trên mạng Internet trao đổi thông tin với nhau thỉ hoặc là dùng TCP hay là UDP.

 

Khi bạn viết một ứng dụng trên mạng bằng java, bạn lập trình ở mức application. Bạn không cần quan tâm đến tầng Transport (TCP và UDP), thay vào đó, bạn sử dụng những lớp thư viện java.net có sẵn trong java. Những lớp này cung cấp những tác vụ truyền thông tin trên mạng và không phụ thuộc vào hệ thống. Tuy nhiên, để quyết định là lớp nào được sử dụng trong ứng dụng của bạn thì bạn phải hiểu rõ được sự khác nhau giữa TCP và UDP.

 

Một trong những điểm mạnh và thích hợp nhất của ngôn ngữ java là khả năng hỗ trợ mạng rất mạnh. Java có được điểm mạnh này là ngay từ đầu, lúc bắt đầu hình thành, thì những nhà phát triển đã có ý là phát triển trong môi trường mạng. Kết quả là bạn có rất nhiều những sự lựa chọn về lãnh vực lập trình mạng trong java. Thế nhưng dù có nhiều sự lựa chọn trong lập trình mạng, nhưng hầu hết những người lập trình đều sử dụng một phương thức đặc biệt trong lập trình mạng java được gọi là Socket và trong phần này ta chỉ xét đến phần sử dụng TCP mà thôi.

lap trinh mang java -3

Trước khi bàn đến Socket, ta hãy nói đến một class có sẵn trong thư viện của Java, cung cấp cho chúng ta một số chức năng rất hữu dụng trong lập trình mạng, đó là class InetAddress

 

  1. 1.     Lớp InetAddress

           Một số phương thức quan trọng:

    • InetAddress getLocalHost() : Trả về đối tượng InetAddress là địa chỉ của máy cục bộ (local host)
    • InetAddress getByName() : Phương thức này nhận địa chỉ của một máy bằng kiễu chuỗi, và trả về đối tượng InetAddress (địa chỉ IP) của địa chỉ này.
    • InetAddress[] getAllByName() : Phương thức này nhận địa chỉ của máy bằng kiểu chuỗi và trả về tất cả các đối tượng InetAddress của địa chỉ này (Một địa hostname có thể có nhiều địa chỉ address khác nhau).
    • Byte[] getAddress() : Trả về địa chỉ IP của đối tượng InetAddress dưới dạng một dãy các bytes.
    • String getHostAddress() : Trả về địa chỉ IP của đối tượng InetAddress dưới dạng một chuỗi được định dạng phân làm 4 nhóm %d.%d.%d.%d (ví dụ 192.168.82.3).

 

Ta hãy xét ví dụ sau:

           Ví dụ1: cho địa chỉ máy chủ, xuất ra tên của máy chủ:

 

 

import java.net.*;

 

public class AddrLookupApp1{

           public static void main(String[] args){

                       try{

                                   InetAddress host = InetAddress.getByName(“192.168.82.1”);

                                   String hostname = host.getHostName();

 

                                   System.out.println(“Ten may chu : ” + hostname);

                       }

                       catch(UnknownHostException e){

                                   System.out.println(“Khong co dia chi nay trong he thong mang!”);

                       }

           }

}

 

Các ví dụ tự làm:

Ví dụ 2: Giống như ví dụ trên, nhưng thay vì ghi sẵn địa chỉ trong code, ta nhập địa chỉ từ tham số dòng lệnh.

 

import java.net.*;

public class AddrLookupApp{

           public static void main(String[] args){

                       if (args.length != 1){

                                   System.out.println(“Sai cu phap!”);

                                   System.out.println(“Cu phap : java AddrLookupApp <dia chi may>!”);

                                   return;

                       }

                       try{

                                   InetAddress host = InetAddress.getByName(args[0]);

                                   String hostname = host.getHostName();

                                   System.out.println(“Ten may chu : ” + hostname);

                       }

                       catch(UnknownHostException e){

                                   System.out.println(“Khong co dia chi nay trong he thong mang!”);

                       }

           }

}

 Ví dụ 3: Giống như ví dụ trên, nhưng là nhập vào tên máy, hệ thống sẽ in ra địa chỉ của máy đó trên mạng.

import java.net.*;

 

public class AddrLookupApp{

           public static void main(String[] args){

                       try{

                                   InetAddress host = InetAddress.getByName(“pc7”);

                                   String hostname = host.getHostName();

 

                                   System.out.println(“Dia chi IP: ” + host.getHostAddress());                     

   }

                       catch(UnknownHostException e){

                                   System.out.println(“Khong co ten may nay trong he thong mang!”);

                       }

           }

}

 

Ví dụ 4: Làm giống với các cách trên nhưng dữ liệu được nhập vào từ dòng lệnh

import java.io.*;

import java.net.*;

public class AddrLookupApp4{

           public static void main(String[] args){

                       try{

                        DataInputStream dataIn = new DataInputStream(System.in);

                        String ServerAddr = dataIn.readLine();

 

                                   InetAddress host = InetAddress.getByName(ServerAddr);

                                   String hostname = host.getHostName();

                                   System.out.println(“Ten may co dia chi IP = \”” + ServerAddr + “\” la \”” + hostname + “\””);

                       }

                       catch(UnknownHostException e){

                                   System.out.println(“Khong co dia chi nay trong he thong mang!”);

                       }

                catch(Exception e){

                  System.out.println(“Loi he thong!”);

                }

           }

}

Chương trình sẽ đọc dữ liệu nhập từ bàn phím bằng kỹ thuật luồng, đó là sử dùng đối tượng DataInputStream.

           Phương thức System.in là một đối tượng đặc biệt ra đời từ lớp InputStream, nó giúp người ta đọc các ký tự được người dùng gõ vào từ bàn phím. Tuy nhiên, phương thức System.in nó chỉ đọc từng ký tự 1, không cho phép ta đọc nguyên một dòng. Vì vậy, để có thể đọc được 1 dòng ký tự (line), ta phải sử dụng luồng DataInputStream. Lớp DataInputStream có khả năng đọc mỗi lần một dòng văn bản bằng lệnh readLine() và trả về một chuỗi.

Lưu ý: Khi ta biên dịch, hệ thống sẽ đưa ra một lời cảnh báo, tuy nhiên nó sẽ không ảnh hưởng gì đến kết quả khi chạy chương trình.

 

  1. 2.     Lớp ServerSocket

Client và server thiết lập những kết nối truyền dữ liệu thông qua Socket. Socket là những endpoints của mạng Internet. Clients tạo những client socket và kết nối với lại server socket. Socket là cơ chết kết hợp với địa chỉ máy chủ (host address) và cổng (port) trên máy chủ đó.

Địa chỉ máy chủ là địa chỉ IP của máy chủ đó, nơi mà chương trình server chạy trên nó.

Địa chỉ cổng (port address) là địa chỉ cổng mà server dùng để nhận và gởi thông tin qua.

Vậy điều cơ bản của lập trình trên mạng là 1 ứng dụng luôn luôn có 2 bản : 1 trên server và 1 chạy dưới client.

Với cơ chế truyền nhận dữ liệu qua socket, thì server luôn phải lắng nghe ở cổng được chỉ định là có tín hiệu nào từ client gởi tới hay không.

 

Sau đây là đoạn chương trình ngắn để minh hoạ :

 

 

Ví dụ 1: Chương trình Client/Server đơn giản: Client connect tới server, server chấp nhận connection

1.1 Server Program :

1    import java.net.*;
2   import java.io.*;

3   class SimpleServer{
4          public static void main(String[] args){
5               ServerSocket serv;
6            System.out.println(“Lang nghe tin hieu tu cong 2345 ….”);
7            try{
8               serv = new ServerSocket(2345);
9                Socket sock;
10               sock = serv.accept();

11               String clientName;
12               clientName = sock.getInetAddress().getHostName();
13               System.out.println(“Da chap nhat ket noi tu may con \”” +
clientName+”\””);
14               sock.close();
}
15            catch(IOException ie){
16               System.out.println(“Loi”);
}
}
}

 

Giải thích :

dòng 1 : import thư viện chứa những lớp ServerSocket, và Socket

dòng 2 : import thu viện chứa những lớp input/output của java

dòng 3 : khai báo lớp và tên lớp chính (chứa hàm main, là hàm sẽ được tự động gọi đầu tiên khi ứng dụng được thực thi). Tên này phải giống y với tên của tập tin lưu trữ nó.

dòng 4 : khai báo hàm main (bắt buộc phải theo cú pháp y vậy)

dòng 5 : Khai báo biến serv là một ServerSocket

dòng 6 : In ra màn hình một dòng thông báo

dòng 7 : try … catch : dùng để bắt lỗi trong java

dòng 8 : tạo một server socket và lấy địa chỉ cổng (port address) là 2345.

dòng 9 : Khai báo một biến thuộc Socket

dòng 10: Đợi tín hiệu kết nối từ clieng

dòng 11: Khai báo một biến thuộc kiểu string

dòng 12: Lấy tên của client vừa connect tới

dòng 13: Xuất thông tin ra màn hình

dòng 14: dóng kết nối lại.

2.2 Client Program :

 

1    import java.net.*;
2   import java.io.*;

3

4   class SimpleClient{
5    public static void main(String[] args){
6         Socket s;
7         try{
8             s = new Socket(“phuc”,2345);
9             String serverName;
10            serverName = s.getInetAddress().getHostName();
11            System.out.println(“Da ket noi duoc voi server \”” +
serverName + “\””);
12        }
13        catch(IOException ie){
}
}

}

 

Giải thích :

dòng 1,2,3,5 : giống trên

dòng 6 : Khai báo biến thuộc kiểu Socket

dòng 7 : try…catch : bắt lỗi trong java

dòng 8 : tạo một connect tới server có tên là phuc qua cổng 2345. Tên là tên của server chạy ứng dụng server trên, còn cổng là do server quy định.

dòng 9 : Khai báo biến thuộc kiểu chuỗi

dòng 10: Lấy tên của server

dòng 11: Xuất thông tin ra màn hình.

dòng 13: Bắt lỗi (nếu có)

 

 

Ghi chú:

            Port : ta có thể lấy một port bất kỳ, nhưng lưu ý là không được trùng với những port mà hệ thống đang sử dụng. Tốt nhất là lấy giá trị của các port > 1024

            Tên Server là tên của máy chạy chương trình server

 

Dưới đây là cửa sổ minh hoạ quá trình biên dịch và chạy chương trình

 

 

lap trinh mang java -1

 

Ở hình trên, cửa sổ bên trái là của Server, cửa sổ bên phải là của Client.

Khi ta run chương trình Server,  Server sẽ đợi các tín hiệu từ port được chỉ định (ở đây là port 2345). Nếu ta không chay chương trình client, hay nói tóm lại là không có bất cứ 1 tín hiệu nào gởi đến port 2345 thì server nó sẽ đợi hoài. Nếu ta chạy chương trình Client, thì nó sẽ gởi lên port 2345 một tín hiệu, Server thấy có tín hiệu gởi tới, in kết xuất ra màn hình câu thông báo và kết thúc (hình dưới).

 

 

lap trinh mang java -2

 

 

Trong ví dụ trên, bạn có thể chỉnh sửa như hiển thị thêm thông tin về client và server như địa chỉ IP của client connect tới, rồii địa chỉ của server connect, ….

 

 

 

 

Ví dụ 2: Chương trình Client/Server đơn giản 2: Client connect tới server, server chấp nhận connection

Vi dụ 2.1:

 

import java.io.*;

import java.net.*;

 

public class SimpleServer2{

public static void main(String args[]){

DataInputStream dataIn;                        //Đọc dữ liệu từ luồng (lớp io)

ServerSocket srvSocket;                                                           //Server socket

Socket server;

try{

//Tao server socket

srvSocket = new ServerSocket(2345);

System.out.println(“Server dang doi ket noi tu cong (port) 2345…”);

server = srvSocket.accept();                                          //Lang nghe nhung ket noi o cong 2345

 

//Khoi tao cac luong nhap xuat

dataIn = new DataInputStream(new BufferedInputStream(server.getInputStream()));

//Doc du lieu tu luong In

System.out.println(“Du lieu nhan : ” + dataIn.readUTF());

 

server.close();

srvSocket.close();

}

catch(IOException ioe){

System.out.println(“Loi”);

}

}

}

 

Chương trình này cũng giống với chương trình ở ví dụ 1, chỉ khác 1 cái là nó sẽ nhận dữ liệu được gởi tới từ máy client, và xuất dữ liệu nhận đó ra màn hình.

           Ở đây sử dụng thêm 1 đối tượng của lớp IODataInputStream

 

 

Tạp Chí Trí Thức & Sáng tạo

  •  

Xem thêm:

Xem thêm

Giảm cân

Mua bán inox, inox 304, inox 201
Xem thêm

Kiến thức y học

Xem thêm

Thông tin giáo dục

Link hữu ích
shop bán váy đầm công chúa đẹp tại TP.HCM
shop bán Thời trang trẻ em cao cấp giao hàng toàn cầu
mua mùn cưa
váy đầm trẻ em | váy đầm công chúa | Sở giáo dục Lâm Đồng 
 |  Thu mua phe lieu
shop bán đầm bé gái đẹp tại TP.HCM

Tuyển chuyên viên thiết kế và may đầm công chúa giỏi :