Hiển thị các bài đăng có nhãn Lập trình mạng. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn Lập trình mạng. Hiển thị tất cả bài đăng

Java: Xây dựng chương trình Client - Server ở chế độ KHÔNG kết nối (UDP)

Người đăng: share-nhungdieuhay on Thứ Hai, 15 tháng 7, 2013


Chương trình UDPEchoServer cài đặt Echo Server ở chế độ không nối kết, cổng mặc định là 7. Chương trình chờ nhận từng gói tin, lấy dữ liệu ra khỏi gói tin nhận được và gởi ngược dữ liệu đó về Client.

1. UDPEchoServer.java
import java.net.*;
import java.io.*;
public class UDPEchoServer {
    public final static int port = 7; // Cong mac dinh cua Server
    public static void main(String[] args) {
        try {
            DatagramSocket ds = new DatagramSocket(port); // Tao socket voi cong la 7
            byte[] buffer = new byte[6000]; // Vung dem chua du lieu cho goi tin nhan 
            while(true) {    // Tao goi tin nhan
                DatagramPacket incoming = new DatagramPacket(buffer,buffer.length);
                ds.receive(incoming); // Cho nhan goi tin gui den
                 // Lay du lieu khoi goi tin nhan
                String theString = new String(incoming.getData(),0,incoming.getLength());   
                //  Tao goi tin gui chua du lieu vua nhan duoc
                DatagramPacket outsending = new DatagramPacket(theString.getBytes(), 
                incoming.getLength(),incoming.getAddress(), incoming.getPort()); 
                ds.send(outsending);
            }
        }
        catch (IOException e) {
            System.err.println(e);
        } 
    }
}
        Chương trình EDPEchoClient sẽ cho phép người sử dụng nhận các chuỗi từ bàn phím, gởi chuỗi sang EchoServer ở chế độ không nối kết ở cổng số 7, chờ nhận và in dữ liệu từ Server gởi về ra màn hình.

2. UDPEchoClient.java

import java.net.*;
import java.io.*;
public class UDPEchoClient extends Object{
        public final static int serverPort = 7; // Cong mac dinh cua Echo Server
        public static void main(String[] args) {
        try {
            if (args.length ==0) { //Kiem tra tham so, là dia chi cua Server
                System.out.print("Syntax: java UDPClient HostName"); 
            return;
            }
            DatagramSocket ds = new DatagramSocket();     // Tao DatagramSocket
            InetAddress server = InetAddress.getByName(args[0]);   // Dia chi Server
            while(true) {
                InputStreamReader isr = new InputStreamReader(System.in);      
                BufferedReader br = new BufferedReader(isr);                        
                String theString = br.readLine();                                            
                byte[] data = theString.getBytes();     // Doi chuoi ra mang bytes
                // Tao goi tin gui
                DatagramPacket dp = new DatagramPacket(data,data.length,server, serverPort); 
                ds.send(dp); // Send goi tin sang Echo Server 
                byte[] buffer = new byte[6000];     // Vung dem cho du lieu nhan
                // Goi tin nhan
                DatagramPacket incoming = new DatagramPacket(buffer, buffer.length); 
                ds.receive(incoming); // Cho nhan du lieu tu EchoServer gui ve
                // Doi du lieu nhan duoc dang mang bytes ra chuoi và in ra man hinh
                System.out.println(new String(incoming.getData(), 0, incoming.getLength())); 
            }
        }
        catch (IOException e) {
            System.err.println(e);
        }
    }
}
        Chú ý: khi thực hiện chương trình UDPEchoClient phải đưa vào đối số là địa chỉ của máy tính đang thực thi chương trình UDPEchoServer. Trong ví dụ trên, Server và Client cùng chạy trên một máy nên  địa chỉ của UDPEchoServer là  localhost (hay 127.0.0.1). Nếu UDPEchoServer chạy trên máy tính khác thì khi thực thi, ta phải biết được địa chỉ IP của máy tính  đó và cung cấp vào  đối số của chương trình. Chẳng hạn, khi UDPEchoServer  đang phục vụ trên máy tính  ở  địa chỉ 172.18.250.211, ta sẽ thực thi UDPEchoClient theo cú pháp sau:

        java UDPEchoClient 172.18.250.211
More about

Java: Xây dựng chương trình Client - Server ở chế độ có nối kết (TCP)

Người đăng: share-nhungdieuhay

         
 Dịch vụ Echo được thiết kế theo kiến trúc Client-Server sử dụng Socket làm phương tiện giao tiếp. Cổng mặc định dành cho Echo Server là 7, bao gồm cả hai chế độ có nối kết và không nối kết.
Chương trình TCPEchoClient sẽ nối kết đến EchoServer ở chế độ có nối kết, lần lượt gửi đến Echo Server 10 ký tự từ ‘0’ đến '9', chờ nhận kết quả trả về và hiển thị chúng ra màn hình.

1. Lớp TCPEchoClient.java
import java.io.*;
import java.net.Socket;
public class TCPEchoClient{
        public static void main(String args[]){
               try{
                       Socket s = new Socket(args[0],7);
                       InputStream is = s.getInputStream();
                       OutputStream os = s.getOutputStream();
                       for(int i='0';i<='9';i++){
                              os.write(i);
                              int ch = is.read();
                              System.out.print((char)ch);
                       }                      
               }
               catch(IOException ie){
                       System.out.print("Error: " +ie);
               }
        }
} 
        Chương trình STCPEchoServer cài  đặt một Echo Server phục vụ tuần tự  ở chế  độ có nối kết. Server lắng nghe trên cổng mặc định số 7.

2. Lớp STCPEchoServer.java  (Server phục vụ tuần tự)
import java.net.*;
import java.io.*;
public class STCPEchoServer{
        public final static int defaultPort = 7;
        public static void main(String[] args){
        try{
               ServerSocket ss = new ServerSocket(defaultPort);
                while (true) {
                    try { 
                        Socket s = ss.accept(); 
                        OutputStream os = s.getOutputStream();
                        InputStream is = s.getInputStream();
                        int ch=0;
                        while(true) { 
                            ch = is.read();
                            if(ch == -1) break;
                            os.write(ch);
                      } 
                        s.close(); 
                    } 
                    catch (IOException ie) {
                        System.err.println("Connection Error: "+ie);
                    } 
                } 
         }
         catch (IOException ie) {
               System.err.println("Server Creation Error:"+ie);
         }
        }
}   
        Hai chương trình này có thể nằm trên hai máy khác nhau. Trong trường hợp đó khi thực hiện chương trình TCPEchoClient phải chú ý nhập đúng địa chỉ IP của máy tính đang chạy chương trình STCPEchoServer. Xem địa chỉ IP của một máy tính Windows bằng lệnh ipconfig.
3. Lớp PTCPEchoServer.java (Server phục vụ song song)
import java.net.*;
import java.io.*;
public class PTCPEchoServer {
    public final static int defaultPort = 7; // Cong mac dinh
    public static void main(String[] args) {
        try {
            ServerSocket ss = new ServerSocket(defaultPort); //Tao socket cho server
            while (true) {
                try {
                    Socket s = ss.accept(); // Lang nghe cac yeu cau ket noi
                    RequestProcessing rp = new RequestProcessing(s); // Tao phan xu ly 
                    rp.start(); // Khoi dong phan xu ly cho Client hien tai
                } 
                catch (IOException e) {
                    System.out.println("Connection Error: "+e);
                } 
            }
        }
        catch (IOException e) {
            System.err.println("Create Socket Error: "+e);
        } 
    } 
}
class RequestProcessing extends Thread {
    Socket channel; //Socket cua kenh ao noi voi Client hien tai
    public RequestProcessing(Socket s){
        channel = s; // Nhan Socket cua kenh ao noi voi Client
    }
    public void run() {
        try {
            OutputStream os = channel.getOutputStream();
            InputStream is = channel.getInputStream();
            while (true) {
                int n = is.read();        // Nhan ky tu tu Client
                if (n == -1) break;    // Thoat neu kenh ao bi xoa
                os.write(n);              //  Gui ky tu nhan duoc ve Client
            }
        }
        catch (IOException e) {
            System.err.println("Request Processing Error: "+e);
        }
    }
}
Biên dịch và thực thi chương trình. Sau đó mở thêm 2 của sổ DOS khác để thực thi chương trình TCPEchoClient nối kết tới PTCPEchoServer. Ta sẽ nhận thấy rằng PTCPEchoServer có khả năng phục vụ đồng thời nhiều Client. 
More about