java编程基础总结——32.UDP网络编程

DatagramSocket:

DatagramSocket这个接受和发送数据报

 

 UDP网络协议下的Socket对象:

UDP(User Datagram Protocol):  用户数据报协议

追求速度的网络协议

特点:1. 无连接(不需要知道发送方的IP)

           2. 不可靠(只管发送,不管接收)

           3. 不安全
 

创建UDP客户端程序的流程:

1. 创建客户端套接字

2. 发送 / 接收数据

3. 关闭套接字

datagramSocket是java封装的基于UDP网络协议的套接字对象

DatagramPacket进行数据的封装和解封装

1. UDP发送数据案例:

package com.openlab.day27;

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

public class TestUDP {
    public static void main(String[] args) {
        DatagramSocket datagramSocket = null;
        try {
            // 注意,创建一个udp socket对象,默认占据了8080
            datagramSocket = new DatagramSocket(8080);

            String msg = "你好啊,socket对象";
            byte[] bytes = msg.getBytes();
            // 数据报对象
            DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length, new InetSocketAddress("127.0.0.1", 8888));

            // 发送数据
            datagramSocket.send(packet);

            System.out.println("数据已经成功发送");

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            datagramSocket.close();
        }
    }
}

2. UDP发送、接收数据案例:

发送:

package com.openlab.day27;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
import java.util.Scanner;

public class TestUDP03 {

    public static final String DES_IP = "127.0.0.1";
    public static final int DES_PORT = 8888;

    public static void main(String[] args) {

        DatagramSocket socket = null;
        Scanner sc = null;
        try {
            socket = new DatagramSocket(9999);
            sc = new Scanner(System.in);
            while (true) {
                System.out.print("请输入您要发送的数据:");
                String msg = sc.nextLine();
                byte[] buf = msg.getBytes();
                InetSocketAddress address = new InetSocketAddress(DES_IP, DES_PORT);
                DatagramPacket pd = new DatagramPacket(buf,0, buf.length, address);
                socket.send(pd);
                System.out.println("数据发送成功!!");
            }
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            socket.close();
        }


    }
}

接收:

package com.openlab.day27;

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

public class TestUDP02 {
    public static void main(String[] args) {
        DatagramSocket socket = null;
        try {
            socket = new DatagramSocket(8888);
            while (true) {
                byte[] buf = new byte[1024];
                DatagramPacket pd = new DatagramPacket(buf, 0, buf.length);
                System.out.println("正在等待客户端发送数据……");
                // 等待接受数据
                socket.receive(pd);
                System.out.println("接收到数据……");
                // 将数据转换出来
                byte[] msg = pd.getData();
                String sendIP = pd.getAddress().getHostAddress();
                int sendPort = pd.getPort();
                System.out.println("接受到"+ sendIP +":"+ sendPort +"发送过来的数据,数据是:"+ new String(msg));
            }
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            socket.close();
        }


    }
}

3. UDP使用多线程实现收发数据(既能接收数据又能发送数据)

每个启动两个线程,主线程充当一个线程,自己再写一个线程,一个线程用来接收数据,一个线程用来发送数据。模拟两个人,只需改变IP,端口即可互相通信

第一个:

package com.openlab.day27;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
import java.util.Scanner;

public class TestUDPSever02 {

    public static final String DES_IP = "127.0.0.1";
    public static final int DES_PORT = 9999;

    public static void main(String[] args) {
        DatagramSocket socket = null;
        Scanner sc = null;
        try {
            socket = new DatagramSocket(8888);

            // 启动一个接收到线程,来进行数据接受
            UDPRreceiveMsg02 udpRreceiveMsg = new UDPRreceiveMsg02(socket);
            udpRreceiveMsg.start();

            sc = new Scanner(System.in);
            while (true) {
                System.out.print(">");
                String msg = sc.nextLine();
                byte[] buf = msg.getBytes();
                InetSocketAddress address = new InetSocketAddress(DES_IP, DES_PORT);
                DatagramPacket pd = new DatagramPacket(buf,0, buf.length, address);
                socket.send(pd);
            }
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            socket.close();
        }

    }
}

class UDPRreceiveMsg02 extends Thread {
    private DatagramSocket socket;

    public UDPRreceiveMsg02(DatagramSocket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            receiveMsg();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void receiveMsg() throws IOException {
        while (true) {
            byte[] buf = new byte[1024];
            DatagramPacket pd = new DatagramPacket(buf, 0, buf.length);
            // 等待接受数据
            socket.receive(pd);
            // 将数据转换出来
            byte[] msg = pd.getData();
            String sendIP = pd.getAddress().getHostAddress();
            int sendPort = pd.getPort();
            System.out.println("接受到"+ sendIP +":"+ sendPort +"发送过来的数据,数据是:"+ new String(msg));
        }
    }
}

第二个:

package com.openlab.day27;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
import java.util.Scanner;

public class TestUDPSever {

    public static final String DES_IP = "171.211.191.190";
    public static final int DES_PORT = 12340;

    public static void main(String[] args) {
        DatagramSocket socket = null;
        Scanner sc = null;
        try {
            socket = new DatagramSocket(9999);

            // 启动一个接收的线程,来进行数据接收
            UDPRreceiveMsg udpRreceiveMsg = new UDPRreceiveMsg(socket);
            udpRreceiveMsg.start();

            sc = new Scanner(System.in);
            while (true) {
                System.out.print(">");
                String msg = sc.nextLine();
                byte[] buf = msg.getBytes();
                InetSocketAddress address = new InetSocketAddress(DES_IP, DES_PORT);
                DatagramPacket pd = new DatagramPacket(buf,0, buf.length, address);
                socket.send(pd);
            }
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            socket.close();
        }

    }
}

class UDPRreceiveMsg extends Thread {
    private DatagramSocket socket;

    public UDPRreceiveMsg(DatagramSocket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            receiveMsg();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void receiveMsg() throws IOException {
        while (true) {
            byte[] buf = new byte[1024];
            DatagramPacket pd = new DatagramPacket(buf, 0, buf.length);
            // 等待接受数据
            socket.receive(pd);
            // 将数据转换出来
            byte[] msg = pd.getData();
            String sendIP = pd.getAddress().getHostAddress();
            int sendPort = pd.getPort();
            System.out.println("接受到"+ sendIP +":"+ sendPort +"发送过来的数据,数据是:"+ new String(msg));
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值