Udp的使用和应用

目录

    • 目录
    • 入门
      • 1 发送端
      • 2 接收端
    • 给通讯软件发送信息
    • 多人聊天的实现
      • 1 发送端
      • 2 接收端
      • 3 调用端

1.入门


1.1. 发送端

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

/**
 * 测试udp通讯(发送端)
 * @date 2018年2月5日
 */
public class Sender {

    /**
     * udp面向无连接
     * 用到的类:DatagramSocket,DatagramPacket
     * @param args    
     * @throws SocketException
     */
    public static void main(String[] args) throws Exception {
        //1.建立udp连接
        DatagramSocket datagramSocket = new DatagramSocket();
        //2.封装数据包
        String data = "第一个socket例子";
        byte datas[] = data.getBytes();
        DatagramPacket datagramPacket = new DatagramPacket(datas, datas.length, InetAddress.getLocalHost(), 9090);
        //3.调用udp的服务发送数据
        datagramSocket.send(datagramPacket);
        //4.关闭资源(释放端口号)
        datagramSocket.close();
    }
}

1.2. 接收端

import java.net.DatagramPacket;
import java.net.DatagramSocket;

/**
 * 测试udp通讯(接收端)
 * @date 2018年2月5日
 */
public class Receive {

    public static void main(String[] args) throws Exception {
        //1.建立udp连接,监听9090端口
        DatagramSocket socket = new DatagramSocket(9090);
        //2.准备一个空的数据包
        byte buf[] = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buf,buf.length);
        //3.调用udp的服务接收数据
        socket.receive(packet);//receive是非阻塞性的,如果接收不到数据会一直等待
        System.out.println("接收端接收到的数据: "+new String(buf,0,packet.getLength()));//getLength()接收到的数据长度
        //4.关闭资源
        socket.close();
    }
}

2.给通讯软件发送信息


import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**
 * 给FeiQ发送信息
 * @date 2018年2月5日
 */
public class SendFeiQ {

    public static void main(String[] args) throws Exception {
        DatagramSocket socket = new DatagramSocket();
        //封装数据包
        byte buf[] = getFeiQData("Hi FeiQ!").getBytes();
        DatagramPacket packet = new DatagramPacket(buf, buf.length, InetAddress.getLocalHost(), 2425);
        socket.send(packet);
        socket.close();
        }
        /**
         * 任何网络通讯软件都会有自己的处理数据格式,不符合格式就当垃圾数据处理
         * feiQ处理数据格式:
         * version:time:sender:ip:flag:content
         *  版本号:时间:发送人:IP地址:标识符(32):真正的内容;
         * @param data
         * @return    
         */
        public static String getFeiQData(String centent){
        StringBuilder data = new StringBuilder();
        data.append("1.0:");
        data.append(System.currentTimeMillis()+":");
        data.append("习近平:");
        data.append("192.168.0.107:");
        data.append("32:");
        data.append(centent);
        return data.toString();
    }
}

3.多人聊天的实现


3.1. 发送端

/**
 * udp多人聊天(发送端)
 * @date 2018年2月5日
 */
public class CharSender extends Thread{

    @Override
    public void run() {
        DatagramSocket socket = null;
        BufferedReader reader = null;
        try {
            socket = new DatagramSocket();
            //键盘录入
            reader = new BufferedReader(new InputStreamReader(System.in));
            String line = null;
            DatagramPacket packet = null;
            while ((line = reader.readLine()) != null) {//群聊地址(局域网前面3位.255)
                packet = new DatagramPacket(line.getBytes(), line.getBytes().length,InetAddress.getByName("192.168.0.255"),9090);
                socket.send(packet);
            }
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                socket.close();
            }
        }
    }
}

3.2. 接收端

import java.net.DatagramPacket;
import java.net.DatagramSocket;

/**
 * udp多人聊天(接收端)
 * @date 2018年2月5日
 */
public class CharRecevice extends Thread{
    @Override
    public void run() {
        DatagramSocket socket = null;
        try {
            socket = new DatagramSocket(9090);
            byte buf[] = new byte[1024];
            DatagramPacket packet = new DatagramPacket(buf,buf.length);
            while (true) {
                socket.receive(packet);
                System.out.println(packet.getAddress().getHostAddress()+"说:"+new String(buf,0,packet.getLength()));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            socket.close();
        }
    }
}

3.3. 调用端

public class ChatMain {

    public static void main(String[] args) {
        //之所以用线程是让一条线程跑接收端,一条线程跑发送端
        ChatRecevice recevice = new ChatRecevice();
        ChatSender sender = new ChatSender();
        recevice.start();
        sender.start();
    }
}

你可能感兴趣的:(socket)