天天看點

Java 模拟基于UDP的Socket通信

效果圖:

Java 模拟基于UDP的Socket通信
多線程伺服器
Java 模拟基于UDP的Socket通信
用戶端
Java 模拟基于UDP的Socket通信
單線程伺服器

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class UDPMutiThreadServer implements Runnable {
    DatagramPacket datagramPacket;  //資料報包
    byte[] data1;  //存放資料的變量
 

    public UDPMutiThreadServer(DatagramPacket datagramPacket,byte[] data1) {
        this.datagramPacket = datagramPacket;
        this.data1=data1;
    }

    public static void main(String[] args) throws SocketException {
        int count=0; //用于統計用戶端數量
        DatagramSocket datagramSocket = new DatagramSocket(1234);

        System.out.println("```````伺服器已經啟動,等待用戶端發送資料````````");


        while (true) {
            /**
             * 建立資料報包,用于儲存收發的資料,需要定義資料包的大小和長度
             */
            byte[] data = new byte[1024];
            DatagramPacket datagramPacket = new DatagramPacket(data,data.length);
            try {
                datagramSocket.receive(datagramPacket);
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (datagramPacket.getLength() > 0) {
                new Thread(new UDPMutiThreadServer(datagramPacket,data)).start();
                count++;
                System.out.println("用戶端的數量為:" + count);
            }

        }
    }

    @Override
    public void run() {

//        byte[] data=new byte[1024];
        String info = new String(data1,0,datagramPacket.getLength());
        System.out.println("我是伺服器,用戶端發送的資訊是:"+ info);

        /**
         * 響應用戶端資料
         *
         * 從接收的資料包中擷取用戶端的位址和端口
         */
        InetAddress address = datagramPacket.getAddress();
        int port = datagramPacket.getPort();
        //定義響應資料
        byte[] data2 = "伺服器已經收到你的資訊,謝謝!".getBytes();

        //用DatagramPacket把要發送的資料進行打包
        DatagramPacket datagramPacket1 = new DatagramPacket(data2,data2.length,address,port);

        //用datagramSocket把資料包發送給用戶端
        try {
            DatagramSocket datagramSocket= new DatagramSocket();
            datagramSocket.send(datagramPacket1);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

           
import java.io.IOException;
import java.net.*;

public class UDPClient {
    public static void main(String[] args) throws IOException {
        /**
         * 向伺服器發送資料
         *
         * 定義伺服器位址,端口号和資料
         */
        InetAddress address = InetAddress.getByName("localhost");
        int port=1234;
        byte[] data ="我是:admin123,密碼:123456546".getBytes();
        /**
         * 定義一個DatagramPacket,把要發送的資料時行打包
         */
        DatagramPacket datagramPacket = new DatagramPacket(data,data.length,address,port);
        /**
         * 定義一個DatagramSocket,用于發送和接收資料
         */
        DatagramSocket datagramSocket = new DatagramSocket();
        datagramSocket.send(datagramPacket);

        /**
         * 接收伺服器發送的資料
         */
        //定義資料包的容量
        byte[] daaa= new byte[1024];
        DatagramPacket datagramPacket1 = new DatagramPacket(daaa,daaa.length);

        //用DatagramSocket接收資料
        datagramSocket.receive(datagramPacket1);

        //讀取資料包的内容
        String info = new String(daaa,0,datagramPacket1.getLength());
        System.out.println("我是用戶端,你說:"+info);

        datagramSocket.close();
    }
}
           
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class UDPServer {
    public static void main(String[] args) throws IOException {

        /**
         * 接收用戶端資料
         *
         * 建立伺服器端的Socket,用于收發資料,需要指定端口
         */
        DatagramSocket datagramSocket = new DatagramSocket(1234);

        /**
         * 建立資料報包,用于儲存收發的資料,需要定義資料包的大小和長度
         */
        byte[] data = new byte[1024];
        DatagramPacket datagramPacket = new DatagramPacket(data,data.length);

        System.out.println("```````伺服器已經啟動,等待用戶端發送資料````````");
        /**
         * 用Socket收取從用戶端發來的資料,并儲存在Packet資料報包中
         */
        datagramSocket.receive(datagramPacket);
        String info = new String(data,0,datagramPacket.getLength());
        System.out.println("我是伺服器,用戶端發送的資訊是:"+ info);

        /**
         * 響應用戶端資料
         *
         * 從接收的資料包中擷取用戶端的位址和端口
         */
        InetAddress address = datagramPacket.getAddress();
        int port = datagramPacket.getPort();
        //定義響應資料
        byte[] data2 = "伺服器已經收到你的資訊,謝謝!".getBytes();

        //用DatagramPacket把要發送的資料進行打包
        DatagramPacket datagramPacket1 = new DatagramPacket(data2,data2.length,address,port);

        //用datagramSocket把資料包發送給用戶端
        datagramSocket.send(datagramPacket1);

    }
}