menu search more_vert

Lập trình socket trong java - Java Programming

Public on January 28, 2015

Lập trình socket trong java

Socket là một phương pháp để thiết lập kết nối truyền thông giữa một chương trình yêu cầu dịch vụ ( client) và một chương trình cung cấp dịch vụ (server) trên mạng LAN, WAN hay Internet và đôi lúc là giữa những quá trình ngay bên trong máy tính. Mỗi socket có thể được xem như một điểm cuối trong một kết nối. Một socket trên máy yêu cầu dịch vụ có địa chỉ mạng được cấp sẵn để “gọi” một socket trên máy cung cấp dịch vụ. Một khi socket đã được thiết lập phù hợp, hai máy tính có thể trao đổi dịch vụ và dữ liệu.

Socket (khe cắm)
–Là một phần mềm trừu tượng hỗ trợ vào – ra của một phiên truyền thông.
–Là kênh truyền thông cụ thể xác định việc truyền dữ liệu qua một cổng riêng biệt.
–Là một kết nối truyền thông giữa hai máy tính
–Một kiểu truyền thông mạng được sử dụng trong lập trình mạng với Java

Lập trình Socket với Java:
– Java định nghĩa các lớp hỗ trợ các dạng truyền thông theo cơ chế Socket
– Các lớp
+ InetAddress
+ ServerSocket
+ Socket
+ DatagramPacket
+ DatagramSocket
+ MulticastSocket
Để tạo 1 ứng dụng sử dụng socket thì cần phải có server và client
Server và client sẽ gửi và nhận dữ liệu thông qua socket cụ thể:
Client sẽ gửi yêu cầu có các tham số đến server , server nhận được các tham số và sẽ xử lý ở server rồi truyền trả lại cho client kết quả

Làm 1 ví dụ đơn giản là :
client sẽ nhập 1 String và gửi nó cho server và server sẽ đảo ngược String đó rồi trả lại cho client , cứ nhập như vậy cho đến khi Client đã chuỗi "quit" thì sẽ thoát

Đầu tiên là sẽ ko dùng MultiThread

Có 2 file là Client.java và Server.java
Sẽ kết nối thông qua cổng 9999

File Client
PHP Code:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package socketdaochuoiimport java.io.*; import java.net.Socket/**
 *
 * @author Admin
 */ 
public class Client {
    public static 
void main(String args[])
    {
        try {
            
String cau1;// Cau duoc gui toi server
            
String ketQua;//Cau duoc server xu ly va tra lai la in hoa
        
            
BufferedReader inFormUser= new BufferedReader(new InputStreamReader(System.in));// Tao input stream
            
Socket clientSocket= new Socket("127.0.0.1",9999);// Tao clinent socket de ket noi toi server
            
DataOutputStream sendToServer= new DataOutputStream(clientSocket.getOutputStream());// Tao output stream ket noi toi socket
            
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

            while(
true)
            {
                
cau1 inFormUser.readLine();// Nhap vao 1 cau
                
sendToServer.writeBytes(cau1+'\n');// gui toi server
                
if (cau1.equalsIgnoreCase("quit"))// Gap chuoi quit
                    
break;
                
ketQua inFromServer.readLine();// Nhan lai tu server
                
System.out.println("FROM SERVER: "+ketQua);
            }
            
clientSocket.close();//Dong ket noi
        
} catch (IOException e) {
            
System.out.println("Exception Client: "+e.getMessage());
        }
    }
}  
File Server

PHP Code:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package socketdaochuoiimport java.io.*; import java.net.*; /**
 *
 * @author Admin
 */ 
public class Server {
    public static 
void main(String args[])
    {
         try {
            
String cau;// Cau tu client gui toi
            
String ketQua "";// Cau sau khi xu ly xong tra ve client
            
ServerSocket ss = new ServerSocket(9999);// Tao cong 9999 de server lang nghe
            
while (true)// Cho client ket noi
            
{
                
// Khong dung multithread
                
Socket connectionSocketss.accept();
                
BufferedReader fromClient= new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));// Tao input stream
                
DataOutputStream sendToClient= new DataOutputStream(connectionSocket.getOutputStream());// Tao output stream
           //     Thread.sleep(5000);// Giả sử server phải xử lý mất 5s
                
while (true)
                {
                    
cau fromClient.readLine();
                    
System.out.println("FROM CLIENT: "+cau);// In ra chuỗi server nhận đc từ client
                    
if (cau.equalsIgnoreCase("quit"))
                        break;

                    
// Dao chuoi nhan duoc
                    
StringBuilder str = new StringBuilder(cau);
                    
ketQua str.reverse().toString();

                    
sendToClient.writeBytes(ketQua '\n');
                }
            
                
// Su dung multithread
                // Khi co 1 client gui yeu cau toi thi se tao ra 1 thread phuc vu client do
                //new ThreadSocket(ss.accept()).start();
            
}
        } catch (
IOException e) {
            
System.out.println("Exception: " e.getMessage());
        }
         
//catch (InterruptedException ie)
        
{
        }
    }
}  
Để chạy thì chạy file server trước ( chuột phải vào file server chọn Run File ) sau đó chạy file Client

Ta có thể thấy ở đây là server sẽ ngồi đợi client tới kết nối. Việc kết nối sẽ ko có gì nếu chỉ có 1 client nhưng khi có nhiều client cùng muốn kết nối vào server cùng một lúc thì cách trên là ko được theo ý mình thì tại cái client đã chiếm mất luồng vào ra của server
nên những client khác không thể kết nối được trừ khi client đầu tiên đã kết thúc

Để giải quyết vấn đề này thì cần phải sử dụng MultiThread, còn để hiểu Thread là gì thì các bạn đọc tài liệu trong file đính kèm để hiểu rõ hơn

Sử dụng MultiThread

Mỗi khi có 1 client kết nối đến server thì sẽ tạo ra 1 Thread để xử lý cho Client đó
như vậy nếu có nhiều client cùng muốn kết nối vs server thì cũng ok

File Client: như trên

File Server

PHP Code:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package socketdaochuoiimport java.io.*; import java.net.*; /**
 *
 * @author Admin
 */ 
public class Server {
    public static 
void main(String args[])
    {
         try {
            
ServerSocket ss = new ServerSocket(9999);// Tao cong 9999 de server lang nghe
            
while (true)// Cho client ket noi
            
{            
                
// Su dung multithread
                // Khi co 1 client gui yeu cau toi thi se tao ra 1 thread phuc vu client do
                
new ThreadSocket(ss.accept()).start();
            }
        } catch (
IOException e) {
            
System.out.println("Exception: " e.getMessage());
        }
         
//catch (InterruptedException ie)
        
{
        }
    }
}  
File ThreadSocket: Mỗi 1 client sẽ có 1 thằng này tuơng ứng

PHP Code:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package socketdaochuoi;import java.net.Socketimport java.io.*; /**
 *
 * @author Admin
 */ 
public class ThreadSocket extends Thread{
    
Socket socketnull;
    public 
ThreadSocket(Socket socket)
    {
        
this.socket=socket;
    }
    public 
void run()
    {
        try {
            
DataOutputStream sendToClient= new DataOutputStream(socket.getOutputStream());// Tao output stream
            
BufferedReader fromClient= new BufferedReader(new InputStreamReader(socket.getInputStream()));//Tao input stream
            
while (true)
            {
                
String sentence=fromClient.readLine();// Chuỗi nhận được từ Client
                
System.out.println("FROM CLIENT: " sentence);
                if (
sentence.equalsIgnoreCase("quit"))
                    break;
                
String reverseSentencereverse(sentence);
                
//Thread.sleep(10000); // Giả sử khi xử lý nó mất khoảng 5s
                
sendToClient.writeBytes(reverseSentence+'\n');
            }
            
        } catch (
Exception e) {
            
e.printStackTrace();
        }
    }
    public 
String reverse(String inputthrows InterruptedException
    
{
        
String output="";
        
StringBuilder strBuilder= new StringBuilder(input);
        
output=strBuilder.reverse().toString();
        return 
output;
    }
}  
Để test trường hợp nhiều client kết nối tới server thì chạy file server trước và chạy vài file client để cùng kết nối


[ Time For Advertisement ]
/**
*  Did you play this game yet, try it now : "Faster Thinking"
*  Download from Google play:  

*  https://play.google.com/store/apps/details?id=com.thanhcs.fasterthinking
**/






[Advertising]Faster Thinking - Speed up your brain


Faster Thinking Game



sentiment_satisfied Emoticon

expand_less