IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> JAVA udp 使用示例 -> 正文阅读

[网络协议]JAVA udp 使用示例

JAVA udp 使用示例

说明

udp是面向无连接的通信,优点是短小精悍,速度快;缺点是可能丢包。个人觉得放内网通信,且能容忍丢失请求,是个很好的选择。

接收端

接收端接收到数据包后,根据数据包中的发送者的SocketAddress,给发送者回复信息;DatagramSocket 可接收,可发送,并无服务端和客户端的明细区分。

import java.io.IOException;
import java.net.*;
import java.nio.charset.Charset;

/**
 * @author wenjs
 */
public class UdpReceive {

    //本地ip端口
    SocketAddress localAddr = new InetSocketAddress("localhost", 1688);
    DatagramSocket udpSocket;

    public void receive() {

        try {
            if (udpSocket == null) {
                udpSocket = new DatagramSocket(localAddr);
            }

            while (true) {
                byte[] buffer = new byte[1024]; 
                // 创建接据包对象
                DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
                // 阻塞等待数据到来
                udpSocket.receive(packet);

                // 得到发送方的IP和端口
                SocketAddress address = packet.getSocketAddress();
                // 转换接收到的数据为字符串
                String msg = new String(packet.getData(), Charset.defaultCharset()).trim();

                // 接收到后,打印出收到的数据长度
                System.out.println("receive is:" + msg + " ;" );

                byte[] rebuffer = ("hello " + msg).getBytes(Charset.defaultCharset());

                DatagramPacket repacket = new DatagramPacket(rebuffer, rebuffer.length,address);
                udpSocket.send(repacket);
            }

        } catch (SocketException e) {
            return;
        } catch (IOException ex) {
            return;
        }

    }

    public static void main(String[] args) {
        UdpReceive receive= new UdpReceive ();

        receive.receive();
    }

发送端

upd是面向无连接的,发送端只管发,不管接收端是否能收到信息;本次发送端代码 还定义了接收线程,用于接收其他发送端发送的数据


import java.io.IOException;
import java.net.*;
import java.nio.charset.Charset;

/**
 * @author wenjs
 */
public class UpdClient {

    public UpdClient(){
        init();
    }
    //定义发送端的端口
    SocketAddress localAddr = new InetSocketAddress("localhost", 1687);
    //目标ip端口
    SocketAddress destAdd = new InetSocketAddress("localhost", 1688);
    DatagramSocket udpSocket = null;

    public void init() {
        try {
            if (udpSocket == null) {
                udpSocket = new DatagramSocket(localAddr); 
                  
                //定义接收信息
                Thread thread = new Thread(new Receive());
                thread.start();
            }
        } catch (SocketException e) {
            return;
        }
    }

    public void send(String data) throws IOException {
        byte[] buffer = data.getBytes(Charset.defaultCharset());
        send(buffer);
    }

    public void send(byte[] buffer) throws IOException {
        DatagramPacket dp = new DatagramPacket(buffer, buffer.length, destAdd);
        //发送数据包
        udpSocket.send(dp);
    } 
    
    //定义接收线程,接收其他发送方的数据
    public class Receive implements Runnable {

        @Override
        public void run() {
            while (true) {
                try {
                    //发送缓冲区
                    byte[] rebuffer = new byte[1024]; //
                    //数据包
                    DatagramPacket packet = new DatagramPacket(rebuffer, rebuffer.length);
                    udpSocket.receive(packet); // 6.在此等待接收对方发的UDP包 
                    // 得到发送方的IP和端口
                    SocketAddress address = packet.getSocketAddress();
                    // 转换接收到的数据为字符串
                    String msg = new String(packet.getData(), Charset.defaultCharset()).trim();

                    // 接收到后,打印出收到的数据长度
                    System.out.println("receive is:" + msg + " ; from:" + address);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    public static void main(String[] args) throws IOException {
        UpdClient client = new UpdClient();

        byte[] readBuffer = new byte[1024];
        while (System.in.read(readBuffer) != -1) {
            client.send(readBuffer);
            readBuffer = new byte[1024];
        } 
    }
}

演示

启动发送端和接收到,在发送端发送wenjs,接收到接收到信息,且给发送端发送hello wenjs;

发送端控制台

wenjs
receive is:hello wenjs ; from:/127.0.0.1:1688

接收端控制台

receive is:wenjs ;

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-08-11 12:47:32  更:2021-08-11 12:49:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 19:41:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码