java使用UDP实现点对点通信

 更新时间:2022年06月15日 12:11:53   作者:Orange#  
这篇文章主要为大家详细介绍了java使用UDP实现点对点通信,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了java使用UDP实现点对点通信的具体代码,供大家参考,具体内容如下

整体的结构思路:

Stu和Tea是收发消息的两端;

Stu和Tea类都是通过启动两个线程完成通信的,这两个线程分别是发消息线程和收消息线程;

Stu类中启动的两个线程分别写在两个类里,Tea也是这样做。

Stu端及其收发消息代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
 
public class Stu {
 
    public static void main(String[] args) throws IOException {
        new Thread(new StuSendThread("127.0.0.1", 8888)).start();
        new Thread(new StuReceiverThread(8889)).start();
    }
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
 
 
public class StuReceiverThread implements Runnable{
 
    private int port;
 
    public StuReceiverThread(int port) {
        this.port = port;
    }
    
    @Override
    public void run() {
        // 创建接收方
        DatagramSocket socket;
        try {
            socket = new DatagramSocket(port);
            while(true) {
                // 准备容器
                byte[] buf = new byte[1024];
                DatagramPacket dPacket = new DatagramPacket(buf, buf.length);
                // 阻塞式接受数据
                try {
                    socket.receive(dPacket);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                // 分析数据
                System.out.println(new String(buf));
                if (new String(buf).equals("exit")) {
                    break;
                }
            }
            // 释放资源
            socket.close();
        } catch (SocketException e1) {
            e1.printStackTrace();
        }        
    }    
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
 
public class StuSendThread implements Runnable{
 
    private DatagramSocket socket;
    private BufferedReader br;
    String IP;
    int port;
    
    public StuSendThread(String IP, int port) throws SocketException {
        socket = new DatagramSocket();
        br = new BufferedReader(new InputStreamReader(System.in));
        this.IP = IP;
        this.port = port;
    }
    
    @Override
    public void run() {        
        while(true) {
            // 准备数据
            br = new BufferedReader(new InputStreamReader(System.in));
            String msg;
            try {
                msg = br.readLine();
                byte[] data = msg.getBytes();
                // 封装数据
                DatagramPacket dPacket = new DatagramPacket(data, data.length, InetAddress.getByName(IP), port);
                // 发送数据
                socket.send(dPacket);
                if(msg.equals("exit")) {
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            
        }
        
        // 关闭资源
        try {
            br.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }
 
}

Tea端及其收发消息代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
 
public class TeaSendThread implements Runnable{
    private DatagramSocket socket;
    private BufferedReader br;
    String IP;
    int port;
 
    public TeaSendThread(String IP, int port) throws SocketException {
        socket = new DatagramSocket();
        br = new BufferedReader(new InputStreamReader(System.in));
        this.IP = IP;
        this.port = port;
    }
 
    @Override
    public void run() {
        while (true) {
            // 准备数据
            br = new BufferedReader(new InputStreamReader(System.in));
            String msg;
            try {
                msg = br.readLine();
                byte[] data = msg.getBytes();
                // 封装数据
                DatagramPacket dPacket = new DatagramPacket(data, data.length, InetAddress.getByName(IP), port);
                // 发送数据
                socket.send(dPacket);
                if (msg.equals("exit")) {
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
 
        }
 
        // 关闭资源
        try {
            br.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
    }
 
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
 
public class TeaReceiverTread implements Runnable{
    private int port;
 
    public TeaReceiverTread(int port) {
        this.port = port;
    }
    
    @Override
    public void run() {
        // 创建接收方
        DatagramSocket socket;
        try {
            socket = new DatagramSocket(port);
            while(true) {
                // 准备容器
                byte[] buf = new byte[1024];
                DatagramPacket dPacket = new DatagramPacket(buf, buf.length);
                // 阻塞式接受数据
                try {
                    socket.receive(dPacket);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                // 分析数据
                System.out.println(new String(buf));
                if (new String(buf).equals("exit")) {
                    break;
                }
            }
            // 释放资源
            socket.close();
        } catch (SocketException e1) {
            e1.printStackTrace();
        }        
    }    
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
 
public class TeaSendThread implements Runnable{
    private DatagramSocket socket;
    private BufferedReader br;
    String IP;
    int port;
 
    public TeaSendThread(String IP, int port) throws SocketException {
        socket = new DatagramSocket();
        br = new BufferedReader(new InputStreamReader(System.in));
        this.IP = IP;
        this.port = port;
    }
 
    @Override
    public void run() {
        while (true) {
            // 准备数据
            br = new BufferedReader(new InputStreamReader(System.in));
            String msg;
            try {
                msg = br.readLine();
                byte[] data = msg.getBytes();
                // 封装数据
                DatagramPacket dPacket = new DatagramPacket(data, data.length, InetAddress.getByName(IP), port);
                // 发送数据
                socket.send(dPacket);
                if (msg.equals("exit")) {
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
 
        }
 
        // 关闭资源
        try {
            br.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
    }
 
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • mybatis-spring:@MapperScan注解的使用

    mybatis-spring:@MapperScan注解的使用

    这篇文章主要介绍了mybatis-spring:@MapperScan注解的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Spring中的@RestControllerAdvice注解使用解析

    Spring中的@RestControllerAdvice注解使用解析

    这篇文章主要介绍了Spring中的@RestControllerAdvice注解使用解析,@RestControllerAdvice 是 Spring 框架中一个用于统一处理控制器异常和返回结果的注解,它可以被用来定义全局异常处理程序和全局响应结果处理程序,需要的朋友可以参考下
    2024-01-01
  • 继承WebMvcConfigurationSupport后自动配置不生效及如何配置拦截器

    继承WebMvcConfigurationSupport后自动配置不生效及如何配置拦截器

    这篇文章主要介绍了继承WebMvcConfigurationSupport后自动配置不生效及如何配置拦截器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • java实现图片上传至本地实例详解

    java实现图片上传至本地实例详解

    我们给大家分享了关于java实现图片上传至本地的实例以及相关代码,有需要的朋友参考下。
    2018-08-08
  • Java使用EasyExcel进行单元格合并的问题详解

    Java使用EasyExcel进行单元格合并的问题详解

    项目中需要导出并合并指定的单元格,下面这篇文章主要给大家介绍了关于java评论、回复功能设计与实现的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • 浅析Java如何优雅的设计接口状态码和异常

    浅析Java如何优雅的设计接口状态码和异常

    HTTP协议里定义了一系列的状态码用来表明请求的状态,如常用的200表示请求正常,404表示请求的资源不存在,所以本文就来和大家讨论一下如何优雅的设计接口状态码和异常,感兴趣的可以了解下
    2024-03-03
  • springboot中使用@NotNull注解无效解决方法

    springboot中使用@NotNull注解无效解决方法

    这篇文章主要给大家介绍了关于springboot中使用@NotNull注解无效的解决方法,进行参数校验的时候,加了@NotNull注解,@Validated注解和@Valid注解,但是参数校验的时候不生效,需要的朋友可以参考下
    2023-08-08
  • mybatis水平分表实现动态表名的项目实例

    mybatis水平分表实现动态表名的项目实例

    本文主要介绍了mybatis水平分表实现动态表名的项目实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Java构造方法和方法重载详解

    Java构造方法和方法重载详解

    大家好,本篇文章主要讲的是Java构造方法和方法重载详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • Spring Boot监听Redis Key失效事件实现定时任务的示例

    Spring Boot监听Redis Key失效事件实现定时任务的示例

    这篇文章主要介绍了Spring Boot监听Redis Key失效事件实现定时任务的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04

最新评论