Lập trình socket trong java - Java Programming
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.
Để tạo 1 ứng dụng sử dụng socket thì cần phải có server và clientSocket (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
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
File ServerPHP Code:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/package socketdaochuoi; import 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());
}
}
}
Để 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 ClientPHP Code:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/package socketdaochuoi; import 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 connectionSocket= ss.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)
{
}
}
}
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
File ThreadSocket: Mỗi 1 client sẽ có 1 thằng này tuơng ứngPHP Code:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/package socketdaochuoi; import 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)
{
}
}
}
Để 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ốiPHP Code:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/package socketdaochuoi;import java.net.Socket; import java.io.*; /**
*
* @author Admin
*/ public class ThreadSocket extends Thread{
Socket socket= null;
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 reverseSentence= reverse(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 input) throws InterruptedException
{
String output="";
StringBuilder strBuilder= new StringBuilder(input);
output=strBuilder.reverse().toString();
return output;
}
}
[ 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
**/
No comments: