UDP

2019-07-09 22:33 更新

一、使用udp模擬客戶端與服務(wù)端收發(fā)數(shù)據(jù)案例: 客戶端向服務(wù)端發(fā)送字符串,服務(wù)端接收后打印。 注意:服務(wù)端與客戶端的不同點(diǎn)是DatagramPacket既可以用于作為發(fā)送數(shù)據(jù)包,也可以用于接收數(shù)據(jù)包,只不過發(fā)送數(shù)據(jù)包多了服務(wù)器ip地址和端口信息。 1.服務(wù)端

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


/**
 * 服務(wù)端
 * 1.創(chuàng)建服務(wù)端+接口
 * 2.準(zhǔn)備接收容器
 * 3.封裝成包
 * 4.接收數(shù)據(jù)
 * 5.分析數(shù)據(jù)
 * 6.釋放資源
 */
public class MyServer {
    public static void main(String[] args) throws IOException {
        //1.創(chuàng)建服務(wù)端+接口
        DatagramSocket server = new DatagramSocket(8888);
        //2.準(zhǔn)備接收容器
        byte[] container = new byte[1024];
        //3.封裝成包new DatagramPacket(byte[] buf, int length)用于接收
        DatagramPacket packet = new DatagramPacket(container, container.length);
        //4.接收數(shù)據(jù)
        server.receive(packet);//會被阻塞住,直到接收到數(shù)據(jù)。
        //5.分析數(shù)據(jù)
        byte[] data = packet.getData();
        int len = packet.getLength();
        System.out.println(new String(data, 0, len));
        //6.釋放資源
        server.close();
    }
}

2.客戶端

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
/**
 * 客戶端
 * 1.創(chuàng)建客戶端+端口
 * 2.準(zhǔn)備數(shù)據(jù)
 * 3.打包(發(fā)送的地點(diǎn)及端口)
 * 4.發(fā)送
 * 5.釋放
 */
public class MyClient {
    public static void main(String[] args) throws IOException {
        //1.創(chuàng)建客戶端   +端口
        DatagramSocket client = new DatagramSocket(6666);
        //2.準(zhǔn)備數(shù)據(jù)
        String msg = "hello你好!";
        byte[] data = msg.getBytes();
        //3.打包(發(fā)送的地址及端口)
        //new DatagramPacket(byte buf[], int offset, int length, SocketAddress address)用于發(fā)送
        //DatagramPacket(byte buf[], int length, SocketAddress address)用于發(fā)送
        DatagramPacket packet = new DatagramPacket(data, data.length, new InetSocketAddress("localhost", 8888));
        //4.發(fā)送
        client.send(packet);//不會被阻塞住,發(fā)完就結(jié)束,不保證數(shù)據(jù)一定被接收。
        //5.釋放
        client.close();
    }
}

二、使用udp模擬客戶端與服務(wù)端收發(fā)特定數(shù)據(jù)類型案例: 客戶端發(fā)送double類型數(shù)據(jù),服務(wù)端接收double類型數(shù)據(jù)并打印。 1.服務(wù)端

import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;


/**
 * 服務(wù)端
 * 1.創(chuàng)建服務(wù)端+接口
 * 2.準(zhǔn)備接收容器
 * 3.封裝成包
 * 4.接收數(shù)據(jù)
 * 5.分析數(shù)據(jù)  字節(jié)數(shù)組-->double
 * 6.釋放資源
 */
public class MyServer {
    public static void main(String[] args) throws IOException {
        //1.創(chuàng)建服務(wù)端+接口
        DatagramSocket server = new DatagramSocket(8888);
        //2.準(zhǔn)備接收容器
        byte[] container = new byte[1024];
        //3.封裝成包new DatagramPacket(byte[] buf, int length)用于接收
        DatagramPacket packet = new DatagramPacket(container, container.length);
        //4.接收數(shù)據(jù)
        server.receive(packet);//會被阻塞住,直到接收到數(shù)據(jù)。
        //5.分析數(shù)據(jù)------------------------------->只有這步做了更改。
        double data = convert(packet.getData());
        System.out.println(data);
        //6.釋放資源
        server.close();
    }
    /**
     * 字節(jié)數(shù)組-->double,注意是使用ByteArrayInputStream,當(dāng)成String傳輸也可以。
     */
    public static double convert(byte[] data) throws IOException {
        ByteArrayInputStream bStream = new ByteArrayInputStream(data);
        DataInputStream dStream = new DataInputStream(bStream);
        //獲取數(shù)據(jù)
        double num = dStream.readDouble();
        //關(guān)閉流
        dStream.close();
        bStream.close();
        return num;
    }
}

2.客戶端

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
/**
 * 客戶端
 * 1.創(chuàng)建客戶端+端口
 * 2.準(zhǔn)備數(shù)據(jù)  double-->字節(jié)數(shù)組  字節(jié)數(shù)組輸出流
 * 3.打包(發(fā)送的地點(diǎn)及端口)
 * 4.發(fā)送
 * 5.釋放
 */
public class MyClient {
    public static void main(String[] args) throws IOException {
        //1.創(chuàng)建客戶端   +端口
        DatagramSocket client = new DatagramSocket(6666);
        //2.準(zhǔn)備數(shù)據(jù)--------------------------------->注意只有這步做了更改。
        double num = 3.14;
        byte[] data = convert(num);
        //3.打包(發(fā)送的地址及端口)
        //new DatagramPacket(byte buf[], int offset, int length, SocketAddress address)用于發(fā)送
        //DatagramPacket(byte buf[], int length, SocketAddress address)用于發(fā)送
        DatagramPacket packet = new DatagramPacket(data, data.length, new InetSocketAddress("localhost", 8888));
        //4.發(fā)送
        client.send(packet);//不會被阻塞住,發(fā)完就結(jié)束,不保證數(shù)據(jù)一定被接收。
        //5.釋放
        client.close();
    }
    /**
     * double-->字節(jié)數(shù)組,注意是使用ByteArrayOutputStream,當(dāng)成String傳輸也可以。
     */
    public static byte[] convert(double num) throws IOException {
        byte[] data = null;
        ByteArrayOutputStream bStream = new ByteArrayOutputStream();
        DataOutputStream dStream = new DataOutputStream(bStream);
        //將數(shù)據(jù)寫入ByteArrayOutputStream對象中
        dStream.writeDouble(num);
        //轉(zhuǎn)化并獲取數(shù)據(jù)
        data = bStream.toByteArray();
        //關(guān)閉流
        dStream.close();
        bStream.close();
        return data;
    }
}
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號