UDP

由 Toniko 创建, 最后一次修改 2019-07-08

一、使用udp模拟客户端与服务端收发数据案例: 客户端向服务端发送字符串,服务端接收后打印。 注意:服务端与客户端的不同点是DatagramPacket既可以用于作为发送数据包,也可以用于接收数据包,只不过发送数据包多了服务器ip地址和端口信息。 1.服务端

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

/**
 * 服务端
 * 1.创建服务端+接口
 * 2.准备接收容器
 * 3.封装成包
 * 4.接收数据
 * 5.分析数据
 * 6.释放资源
 */
public class MyServer {
    public static void main(String[] args) throws IOException {
        //1.创建服务端+接口
        DatagramSocket server = new DatagramSocket(8888);
        //2.准备接收容器
        byte[] container = new byte[1024];
        //3.封装成包new DatagramPacket(byte[] buf, int length)用于接收
        DatagramPacket packet = new DatagramPacket(container, container.length);
        //4.接收数据
        server.receive(packet);//会被阻塞住,直到接收到数据。
        //5.分析数据
        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.创建客户端+端口
 * 2.准备数据
 * 3.打包(发送的地点及端口)
 * 4.发送
 * 5.释放
 */
public class MyClient {
    public static void main(String[] args) throws IOException {
        //1.创建客户端   +端口
        DatagramSocket client = new DatagramSocket(6666);
        //2.准备数据
        String msg = "hello你好!";
        byte[] data = msg.getBytes();
        //3.打包(发送的地址及端口)
        //new DatagramPacket(byte buf[], int offset, int length, SocketAddress address)用于发送
        //DatagramPacket(byte buf[], int length, SocketAddress address)用于发送
        DatagramPacket packet = new DatagramPacket(data, data.length, new InetSocketAddress("localhost", 8888));
        //4.发送
        client.send(packet);//不会被阻塞住,发完就结束,不保证数据一定被接收。
        //5.释放
        client.close();
    }
}

二、使用udp模拟客户端与服务端收发特定数据类型案例: 客户端发送double类型数据,服务端接收double类型数据并打印。 1.服务端

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

/**
 * 服务端
 * 1.创建服务端+接口
 * 2.准备接收容器
 * 3.封装成包
 * 4.接收数据
 * 5.分析数据  字节数组-->double
 * 6.释放资源
 */
public class MyServer {
    public static void main(String[] args) throws IOException {
        //1.创建服务端+接口
        DatagramSocket server = new DatagramSocket(8888);
        //2.准备接收容器
        byte[] container = new byte[1024];
        //3.封装成包new DatagramPacket(byte[] buf, int length)用于接收
        DatagramPacket packet = new DatagramPacket(container, container.length);
        //4.接收数据
        server.receive(packet);//会被阻塞住,直到接收到数据。
        //5.分析数据------------------------------->只有这步做了更改。
        double data = convert(packet.getData());
        System.out.println(data);
        //6.释放资源
        server.close();
    }
    /**
     * 字节数组-->double,注意是使用ByteArrayInputStream,当成String传输也可以。
     */
    public static double convert(byte[] data) throws IOException {
        ByteArrayInputStream bStream = new ByteArrayInputStream(data);
        DataInputStream dStream = new DataInputStream(bStream);
        //获取数据
        double num = dStream.readDouble();
        //关闭流
        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.创建客户端+端口
 * 2.准备数据  double-->字节数组  字节数组输出流
 * 3.打包(发送的地点及端口)
 * 4.发送
 * 5.释放
 */
public class MyClient {
    public static void main(String[] args) throws IOException {
        //1.创建客户端   +端口
        DatagramSocket client = new DatagramSocket(6666);
        //2.准备数据--------------------------------->注意只有这步做了更改。
        double num = 3.14;
        byte[] data = convert(num);
        //3.打包(发送的地址及端口)
        //new DatagramPacket(byte buf[], int offset, int length, SocketAddress address)用于发送
        //DatagramPacket(byte buf[], int length, SocketAddress address)用于发送
        DatagramPacket packet = new DatagramPacket(data, data.length, new InetSocketAddress("localhost", 8888));
        //4.发送
        client.send(packet);//不会被阻塞住,发完就结束,不保证数据一定被接收。
        //5.释放
        client.close();
    }
    /**
     * double-->字节数组,注意是使用ByteArrayOutputStream,当成String传输也可以。
     */
    public static byte[] convert(double num) throws IOException {
        byte[] data = null;
        ByteArrayOutputStream bStream = new ByteArrayOutputStream();
        DataOutputStream dStream = new DataOutputStream(bStream);
        //将数据写入ByteArrayOutputStream对象中
        dStream.writeDouble(num);
        //转化并获取数据
        data = bStream.toByteArray();
        //关闭流
        dStream.close();
        bStream.close();
        return data;
    }
}
以上内容是否对您有帮助:

二维码
建议反馈
二维码