Java实现UDP多线程在线咨询

 更新时间:2021年04月20日 11:11:53   作者:微滑低  
这篇文章主要为大家详细介绍了Java实现UDP多线程在线咨询,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Java实现UDP多线程在线咨询,供大家参考,具体内容如下

1.发送的线程

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;

//发送线程
public class TalkSend implements Runnable {
    DatagramSocket socket = null;
    BufferedReader reader = null;
    private int formPort; //自身端口
    private String toIP; //发送到的IP
    private int toPort; //发送到的端口

    public TalkSend(int formPort, String toIP, int toPort) {
        this.formPort = formPort;
        this.toIP = toIP;
        this.toPort = toPort;

        try {
            socket = new DatagramSocket(formPort);
            reader = new BufferedReader(new InputStreamReader(System.in)); //获取控制台输入
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        while(true) {
            try {
                String data = reader.readLine(); //获取到的数据
                byte[] datas = data.getBytes(); //转换为需要的字节数组
                //将数据打包成包
                DatagramPacket packet = new DatagramPacket(datas,0, datas.length,new InetSocketAddress(this.toIP,this.toPort));
                socket.send(packet); //发送包
                //退出指令
                if(packet.equals("bye")){
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
        socket.close();
    }
}

2.接收的线程

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
//接收线程
public class TalkReceive implements Runnable {

    DatagramSocket socket = null; //与发送端的socket为同一个,实现通信
    private int port;
    private String msgFrom; //标志信息来源

    public TalkReceive(int port, String msgFrom) {
        this.port = port;
        this.msgFrom= msgFrom;
        try {
            socket = new DatagramSocket(port);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        while (true){

            try {
                byte[] container = new byte[1024];
                DatagramPacket packet = new DatagramPacket(container, 0, container.length);
                socket.receive(packet);//接收数据

                byte[] data = packet.getData();
                String receiveData = new String(data, 0, data.length);

                System.out.println(msgFrom+":"+receiveData);

                if(receiveData.equals("bye")){
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
        socket.close();
    }
}

3.模拟学生端

//模拟学生
public class TalkStudent {
    public static void main(String[] args) {
        new Thread(new TalkSend(7777, "localhost", 9999)).start();
        new Thread(new TalkReceive(8888, "老师")).start();
    }
}

4.模拟老师端

//模拟老师
public class TalkTeacher {
    public static void main(String[] args) {
        new Thread(new TalkSend(5555, "localhost", 8888)).start();
        new Thread(new TalkReceive(9999, "学生")).start();
    }
}

5.截图

学生端:

老师端:

6.总结

首先创建一个发送线程,里面定义要发送到的IP地址和端口,再创建一个DatagramSocket来进行通信,创建一个BufferReader(new InputStreamReader(System.in))来获取控制台的输入的数据,将获取到的数据打包进行发送。之后创建一个接收线程,里面定义自身的端口即可,再创建一个和发送端一样的DatagramSocket来进行通信,接收数据进行打印输出即可。最后模拟学生端和老师端,创建这两个线程来进行通信。学生发送线程到的端口是老师的接收端口,老师发送的端口是学生的接收端口,这样才能互相通信。

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

相关文章

  • Spring Lifecycle 和 SmartLifecycle区别面试精讲

    Spring Lifecycle 和 SmartLifecycle区别面试精讲

    这篇文章主要为大家介绍了Spring Lifecycle和SmartLifecycle的区别面试精讲,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • MyBatis Plus配置日志CRUD的使用详解

    MyBatis Plus配置日志CRUD的使用详解

    这篇文章主要介绍了MyBatis Plus配置日志,CRUD的使用,,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • GraalVM系列Native Image Basics静态分析

    GraalVM系列Native Image Basics静态分析

    这篇文章主要为大家介绍了GraalVM系列Native Image Basics静态分析详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Spring中@Configuration注解的Full模式和Lite模式详解

    Spring中@Configuration注解的Full模式和Lite模式详解

    这篇文章主要介绍了Spring中@Configuration注解的Full模式和Lite模式详解,准确来说,Full 模式和 Lite 模式其实 Spring 容器在处理 Bean 时的两种不同行为,这两种不同的模式在使用时候的表现完全不同,今天就来和各位小伙伴捋一捋这两种模式,需要的朋友可以参考下
    2023-09-09
  • Java线程中的interrupt详解

    Java线程中的interrupt详解

    这篇文章主要介绍了Java线程中的interrupt详解,interrupt翻译成中文为“打断”的意思,但实际上,interrupt()方法并非将一个线程打中断的意思,本文提供了部分实现代码,需要的朋友可以参考下
    2023-09-09
  • Spring注解开发@Bean和@ComponentScan使用案例

    Spring注解开发@Bean和@ComponentScan使用案例

    这篇文章主要介绍了Spring注解开发@Bean和@ComponentScan使用案例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Java通过Process类Runtime.getRuntime().exec()执行bat脚本程序

    Java通过Process类Runtime.getRuntime().exec()执行bat脚本程序

    用Java编写应用时,有时需要在程序中调用另一个现成的可执行程序或系统命令,这篇文章主要给大家介绍了关于Java如何通过Process类Runtime.getRuntime().exec()执行bat脚本程序的相关资料,需要的朋友可以参考下
    2024-01-01
  • JSP request.setAttribute()详解及实例

    JSP request.setAttribute()详解及实例

    这篇文章主要介绍了 javascript request.setAttribute()详解及实例的相关资料,需要的朋友可以参考下
    2017-02-02
  • Spring根据XML配置文件注入属性的方法

    Spring根据XML配置文件注入属性的方法

    下面小编就为大家带来一篇Spring根据XML配置文件注入属性的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Java文件操作之按行读取文件和遍历目录的方法

    Java文件操作之按行读取文件和遍历目录的方法

    这篇文章主要介绍了Java文件操作之按行读取文件和递归遍历目录的方法,遍历目录文中分别举了递归和非递归的例子,需要的朋友可以参考下
    2016-03-03

最新评论