Lập trình Socket UDP
Lập trình Socket UDP
Chúng ta sẽ bàn tiếp về lập trình Socket
Phần này chúng ta sẽ bàn về UDP
Như phần trước đã đề cập, chúng ta sẽ dùng DatagramSocket để lập trình một mạng theo giao thức UDP.
Dù là TCP hay UDP thì về nguyên tắc bạn cần :
- Một chương trình Server đóng vai trò như ổ cắm nên phải khai báo cổng.
- Một chương trình Client đóng vai trò như phích cắm
- Client muốn gửi gì đến Server thì phải tìm đúng cổng
Cụ thể với lập trình mạng UDP
-Dù là Server hay Client ta cũng sử dụng DatagramSocket để tạo một socket:
DatagramSocket socket= new DatagramSocket();
-Phần dữ liệu thì chúng ta sử dụng DatagramPacket để “đóng gói” dữ liệu lại.
DatagramPacket packet = new DatagramPacket();
-Sau khi đã có socket và các “gói dữ liệu” ta dùng method send() hay receive() để gửi hay nhận dữ liệu
socket.send(packet);
socket.receive(packet);
Tóm lược quá trình tạo một ứng dụng mạng kiểu UDP:
Server
- Tạo UDP Socket
- Tạo DatagramPacket để nhận dữ liệu
- Nhận dữ liệu từ Client.
- Đóng UDP Socket
- Kết thúc chương trình.
Client
- Tạo UDP Socket
- Tạo DatagramPacket để gửi dữ liệu
- Gửi dữ liệu đến Server.
- Đóng UDP Socket
- Kết thúc chương trình.
Chúng ta sẽ làm một ứng dụng nhỏ với [JosObfuscator] W9VUuNsDYEin|P
[JosObfuscator] K;PUY;|D4P.`} ,SS`iD,eo}^JrH9vwaeH+4`r
Bạn tham khảo ở đây
Chúng ta sẽ làm một Server trên nền một Frame. Điều này sẽ thuận lợi và dể sử dụng hơn các ví dụ mà bạn thường thấy trong sách. Bạn sẽ dễ dàng kiểm soát, theo dõi Server của bạn hơn.
Trước hết bạn mở [JosObfuscator] :EUFSTec(R?olIPdG0ihpE+Nsbe và tạo một [JosObfuscator] 1tU7/FjSzr9Yahum]@e đơn giản, đặt tên là UDPServer như sau
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
class UDPServer extends Frame implements ActionListener
{
TextArea ta1=new TextArea();
Button b1 = new Button(“Start”);
Button b2 = new Button(“Stop”);
public UDPServer(String title)
{
super(title);
setLayout(new FlowLayout());
add(ta1);
add(b1);
add(b2);
b1.addActionListener(this);
b2.addActionListener(this);
}
public void actionPerformed(ActionEvent ae)
{
if (ae.getSource()==b1)
{
}
if (ae.getSource()==b2)
{
}
}
public static void main(String args[])
{
UDPServer f=new UDPServer(“I am a UDP Server!”);
f.setSize(600,600);
f.setVisible(true);
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent we){
System.exit(0);
}
});
}
}
Nếu quên về Frame thì bạn tham khảo ở đây
Hướng tiếp theo của chúng ta là
- Nếu click vào Start button: Sẽ chạy một [JosObfuscator] BdqOTHrWhw:g)/r>delaF:ild|,Naj ST_yh7rOV-qHeWOd9raPU^Zd này chính là sự “nghe ngóng” của Server, tức là một Socket mới sẽ được tạo và chờ đợi thông tin từ Client.
- Nếu click vào Stop button: Ta sẽ ngưng Thread.
Từ đó ta sẽ có một cái khung của chương trình như sau
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
class UDPServer extends Frame implements ActionListener
{
TextArea ta1=new TextArea();
Button b1 = new Button(“Start”);
Button b2 = new Button(“Stop”);
Thread thread;
DatagramSocket socket;
public class StartThread implements Runnable{
StartThread(){
}
public void run(){
}
}
public UDPServer(String title)
{
super(title);
setLayout(new FlowLayout());
add(ta1);
add(b1);
add(b2);
b1.addActionListener(this);
b2.addActionListener(this);
}
public void actionPerformed(ActionEvent ae)
{
if (ae.getSource()==b1)
{
new StartThread();
}
else if (ae.getSource()==b2)
{
socket.close();
}
}
public static void main(String args[])
{
UDPServer f=new UDPServer(“I am a UDP Server!”);
f.setSize(600,600);
f.setVisible(true);
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent we){
System.exit(0);
}
});
}
}
Vậy là coi như xong.
Công việc tiếp theo là viết [JosObfuscator] -i>m%cg04V4o->=|d5U4ve_a5x 4VcBE}>.hOo@1k[ i@^rRUuVnE9(>SZ)*U. Căn bản sẽ giống như đã thảo luận trong phần trước.
Và đây là code:
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
class UDPServer extends Frame implements ActionListener
{
TextArea ta1=new TextArea();
Button b1 = new Button("Start");
Button b2 = new Button("Stop");
Thread thread;
DatagramSocket socket;
public class StartThread implements Runnable{
StartThread(){
thread = new Thread(this);
thread.start();
b1.setEnabled(false);
b2.setEnabled(true);
}
public void run(){
try{
byte[] buffer = new byte[1024];
int port = 8080;
try{
socket = new DatagramSocket(port);
while(true){
try{
ta1.append(“Server is started\n”);
//Receive request from client
DatagramPacket packet = new DatagramPacket(buffer, buffer.length );
socket.receive(packet);
InetAddress client = packet.getAddress();
int client_port = packet.getPort();
ta1.append(” Received “+new String(buffer)+” from “+client);
}
catch(UnknownHostException ue){}
}
}
catch(java.net.BindException b){}
}
catch (IOException e){
System.err.println(e);
}
}
}
public UDPServer(String title)
{
super(title);
setLayout(new FlowLayout());
add(ta1);
add(b1);
add(b2);
b1.addActionListener(this);
b2.addActionListener(this);
}
public void actionPerformed(ActionEvent ae)
{
if (ae.getSource()==b1)
{
new StartThread();
}
else if (ae.getSource()==b2)
{
thread.interrupted();
socket.close();
ta1.append(“Server is stopped\n”);
b1.setEnabled(true);
b2.setEnabled(false);
}
}
public static void main(String args[])
{
UDPServer f=new UDPServer(“I am a UDP Server!”);
f.setSize(600,600);
f.setVisible(true);
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent we){
System.exit(0);
}
});
}
}
UDP Client
Chúng ta sẽ viết code để chạy dưới dạng dòng lệnh. Code rất đơn giản nên chúng ta sẽ không phân tích
import java.io.*;
import java.net.*;
class UDPClient
{
public static void main(String args[]) throws Exception
{
BufferedReader inFromUser =
new BufferedReader(new InputStreamReader(System.in));
DatagramSocket clientSocket = new DatagramSocket();
InetAddress IPAddress = InetAddress.getByName(“localhost”);
byte[] sendData = new byte[1024];
byte[] receiveData = new byte[1024];
String sentence = inFromUser.readLine();
sendData = sentence.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 8080);
clientSocket.send(sendPacket);
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
clientSocket.receive(receivePacket);
clientSocket.close();
}
}
Vậy là xong. Bây giờ bạn chạy thử chương trình.
Đầu tiên bạn chạy UDPServer như thông thường. Tiếp theo bạn click vào UDPClient tab để chạy tiếp Client. Hoặc bạn làm như sau:
Click vào Start button
Sau đó bạn click vào mũi tên bên cạnh Run button trên Toolbar của Eclipse, tiếp tục click vào UDPClient để chạy UDPClient.

Khi Client chạy, bạn nhập vài chữ vào bên dưới. Bạn sẽ thấy kết quả.

Vậy là chúng ta đã hoàn tất ứng dụng. Bạn thử ứng dụng bằng cách nhập vài từ vào phần trống phía dưới của Eclipse như hình trên, sau đó nhấn Enter. Bạn sẽ thấy kết quả trong TextArea của Server.
Phần sau chúng ta sẽ làm một ứng dụng TCP
Chúc bạn một ngày vui vẻ.
Nguồn vn4000.com

--/
Tags: 










sugiatinhyeu_thantinhyeu3
manlivo
manlivo@gmail.com