Java中利用DatagramPacket与DatagramSocket进行通讯的示例

Java中利用DatagramPacket与DatagramSocket进行通讯的示例对以下demo进行了扩展,增了消息循环和等待。 Java中的DatagramPacket与DatagramSocket的初步扩展的代码如下:1.接收端工程代码:由于接收端的控制台log会被发送端的log冲掉,所以把log写到文件中。packagecom.ameyume.receiver;importjava.io.File;importjava.io.FileNotFoundExcep

大家好,又见面了,我是你们的朋友全栈君。

对以下demo进行了扩展,增了消息循环和等待。

Java中的DatagramPacket与DatagramSocket的初步

扩展的代码如下:

1.接收端工程代码:

由于接收端的控制台log会被发送端的log冲掉,所以把log写到文件中。

package com.ameyume.receiver;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketAddress;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Receiver {
    private static final String LOG_FILE_NAME = "receiver.txt";

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        // 先删除旧的log文件
        File f = new File(LOG_FILE_NAME);
        if (f.exists()) {
            f.delete();
        }

        System.out.println(getDateString() + " Receiver main BEGIN >>>>>>\n");
        LogToFile("Receiver main BEGIN >>>>>>\n");

        try {
            // 确定接受方的IP和端口号,IP地址为本地机器地址
            InetAddress ip = InetAddress.getLocalHost();
            int port = 12365;
            for(int i = 0; i < 5; i++) {
                // 创建接收方的套接字,并指定端口号和IP地址  
                DatagramSocket getSocket = new DatagramSocket(port, ip);

                // 确定数据报接受的数据的数组大小  
                byte[] buf = new byte[1024];

                // 创建接受类型的数据报,数据将存储在buf中  
                DatagramPacket getPacket = new DatagramPacket(buf, buf.length);

                // 通过套接字接收数据, 此方法是阻塞的,会一直等待消息
                System.out.println(getDateString() + " Receiver begin receive message ...");
                LogToFile("Receiver begin receive message ...");
                getSocket.receive(getPacket);
                System.out.println(getDateString() + " Receiver end receive message ...");
                LogToFile("Receiver end receive message ...");

                // 解析发送方传递的消息,并打印
                String getMes = new String(buf, 0, getPacket.getLength());
                System.out.println(getDateString() + " Receiver 对方发送的消息:" + getMes);
                LogToFile("Receiver 对方发送的消息:" + getMes);

                // 通过数据报得到发送方的IP和端口号,并打印  
                InetAddress sendIP = getPacket.getAddress();
                int sendPort = getPacket.getPort();  
                System.out.println(getDateString() + " Receiver 对方的IP地址是:" + sendIP.getHostAddress());
                LogToFile("Receiver 对方的IP地址是:" + sendIP.getHostAddress());
                System.out.println(getDateString() + " Receiver 对方的端口号是:" + sendPort);
                LogToFile("Receiver 对方的端口号是:" + sendPort + '\n');

                // 通过数据报得到发送方的套接字地址
                SocketAddress sendAddress = getPacket.getSocketAddress();

                // 确定要反馈发送方的消息内容,并转换为字节数组
                String feedback = "接收方说:我收到了消息【" + getMes + "】";
                byte[] backBuf = feedback.getBytes();
      
                // 创建发送类型的数据报
                DatagramPacket sendPacket = new DatagramPacket(backBuf, backBuf.length, sendAddress);

                // 通过套接字发送数据
                getSocket.send(sendPacket);
                // 关闭套接字
                getSocket.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } 
        System.out.println(getDateString() + " Receiver main END <<<<<<");
        LogToFile("Receiver main END <<<<<<");
    }

    public static String getDateString() {
        SimpleDateFormat df = new SimpleDateFormat("MM-dd HH:mm:ss.SSS"); // 设置日期格式
        return df.format(new Date()); // new Date()为获取当前系统时间
    }

    public static void LogToFile(String log) {
        File sdFile = new File(LOG_FILE_NAME);

        try {
            FileWriter fw = new FileWriter(sdFile, true);
            fw.write(getDateString() + " " + log + '\n');
            fw.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

2.发送端工程代码:

package com.ameyume.sender;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Sender {
    private static final String LOG_FILE_NAME = "sender.txt";

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        // 先删除旧的log文件
        File f = new File(LOG_FILE_NAME);
        if (f.exists()) {
            f.delete();
        }
        
        System.out.println(getDateString() + " Sender main BEGIN >>>>>>\n");
        LogToFile("Sender main BEGIN >>>>>>\n");

        try {
            // 创建发送方的套接字,IP默认为本地,不指定端口号则系统随机设置一个可用的端口号
            DatagramSocket sendSocket = new DatagramSocket(/*12341*/);

            for (int i = 0; i < 5; i++) {
                // 确定要发送的内容
                String msg = "你好,接收方:" + i;
                // 由于数据报的数据是以字节数组的形式存储的,所以转为转换数据
                byte[] buffer = msg.getBytes();

                // 确定发送方的IP地址及端口号,地址为本地机器地址
                int port = 12365;
                InetAddress ip = InetAddress.getLocalHost();

                // 创建发送类型的数据库
                // 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号
                DatagramPacket sendPacket = new DatagramPacket(buffer, buffer.length, ip, port);

                // 通过套接字发送数据
                System.out.println(getDateString() + " Sender send packet ..");
                LogToFile("Sender send packet ..");
                sendSocket.send(sendPacket);

                // 确定接收反馈数据的缓冲存储器,即存储数据的字节数组
                byte[] getBuffer = new byte[1024];

                // 确定接收类型的数据报
                DatagramPacket getPacket = new DatagramPacket(getBuffer, getBuffer.length);

                // 通过套接字接收数据
                System.out.println(getDateString() + " Sender receive packet ...");
                LogToFile("Sender receive packet ...");
                sendSocket.receive(getPacket);

                // 解析反馈的消息,并输出
                String backMsg = new String(getBuffer, 0, getPacket.getLength());
                System.out.println(getDateString() + " Sender 接收方返回的消息:" + backMsg);
                LogToFile("Sender 接收方返回的消息:" + backMsg);

                System.out.println(getDateString() + " Sender waiting 5s ...\n");
                LogToFile("Sender waiting 5s ...\n");

                Thread.sleep(5000);
            }

            // 关闭套接字
            sendSocket.close();
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        System.out.println(getDateString() + " Sender main END <<<<<<");
        LogToFile("Sender main END <<<<<<");
    }

    public static String getDateString() {
        SimpleDateFormat df = new SimpleDateFormat("MM-dd HH:mm:ss.SSS"); // 设置日期格式
        return df.format(new Date()); // new Date()为获取当前系统时间
    }

    public static void LogToFile(String log) {
        File file = new File(LOG_FILE_NAME);

        try {
            FileWriter fw = new FileWriter(file, true);
            fw.write(getDateString() + " " + log + '\n');
            fw.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

3.

先运行Receiver工程,正在阻塞等待接收发送方发送的消息,总共接收到了5个消息,每个消息间隔5秒钟

log输出如下:
05-19 12:10:13.115 Receiver main BEGIN >>>>>>

05-19 12:10:13.119 Receiver begin receive message …
05-19 12:10:18.886 Receiver end receive message …
05-19 12:10:18.886 Receiver 对方发送的消息:你好,接收方:0
05-19 12:10:18.887 Receiver 对方的IP地址是:127.0.0.1
05-19 12:10:18.887 Receiver 对方的端口号是:50312

05-19 12:10:18.887 Receiver begin receive message …
05-19 12:10:23.890 Receiver end receive message …
05-19 12:10:23.891 Receiver 对方发送的消息:你好,接收方:1
05-19 12:10:23.891 Receiver 对方的IP地址是:127.0.0.1
05-19 12:10:23.892 Receiver 对方的端口号是:50312

05-19 12:10:23.893 Receiver begin receive message …
05-19 12:10:28.896 Receiver end receive message …
05-19 12:10:28.897 Receiver 对方发送的消息:你好,接收方:2
05-19 12:10:28.898 Receiver 对方的IP地址是:127.0.0.1
05-19 12:10:28.902 Receiver 对方的端口号是:50312

05-19 12:10:28.903 Receiver begin receive message …
05-19 12:10:33.906 Receiver end receive message …
05-19 12:10:33.907 Receiver 对方发送的消息:你好,接收方:3
05-19 12:10:33.907 Receiver 对方的IP地址是:127.0.0.1
05-19 12:10:33.908 Receiver 对方的端口号是:50312

05-19 12:10:33.909 Receiver begin receive message …
05-19 12:10:38.923 Receiver end receive message …
05-19 12:10:38.924 Receiver 对方发送的消息:你好,接收方:4
05-19 12:10:38.925 Receiver 对方的IP地址是:127.0.0.1
05-19 12:10:38.925 Receiver 对方的端口号是:50312

05-19 12:10:38.926 Receiver main END <<<<<<

4. 再运行Sender工程,每间隔5秒钟发送一个消息给发送方,共发送了5个消息
接收方都收到了,并有返回消息给发送方
log输出如下:
05-19 12:10:18.881 Sender main BEGIN >>>>>>

05-19 12:10:18.885 Sender send packet ..
05-19 12:10:18.886 Sender receive packet …
05-19 12:10:18.887 Sender 接收方返回的消息:接收方说:我收到了消息【你好,接收方:0】
05-19 12:10:18.888 Sender waiting 5s …

05-19 12:10:23.889 Sender send packet ..
05-19 12:10:23.890 Sender receive packet …
05-19 12:10:23.893 Sender 接收方返回的消息:接收方说:我收到了消息【你好,接收方:1】
05-19 12:10:23.894 Sender waiting 5s …

05-19 12:10:28.895 Sender send packet ..
05-19 12:10:28.896 Sender receive packet …
05-19 12:10:28.903 Sender 接收方返回的消息:接收方说:我收到了消息【你好,接收方:2】
05-19 12:10:28.904 Sender waiting 5s …

05-19 12:10:33.905 Sender send packet ..
05-19 12:10:33.906 Sender receive packet …
05-19 12:10:33.921 Sender 接收方返回的消息:接收方说:我收到了消息【你好,接收方:3】
05-19 12:10:33.921 Sender waiting 5s …

05-19 12:10:38.922 Sender send packet ..
05-19 12:10:38.923 Sender receive packet …
05-19 12:10:38.926 Sender 接收方返回的消息:接收方说:我收到了消息【你好,接收方:4】
05-19 12:10:38.927 Sender waiting 5s …

05-19 12:10:43.928 Sender main END <<<<<<

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/136717.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • mysql 字符串转数字再排序

    mysql 字符串转数字再排序如果数字是按照字符串格式存储的排序时候又想按照数字排血 只需要在orderby后加上转换函数即可例如: orderby CONVERT(sort,DECIMAL)可用的类型    二进制,同带binary前缀的效果:BINARY   字符型,可带参数:CHAR()    日期:DATE    时间:TIME    日期时间

  • fstream中文路径

    fstream中文路径在C++的标准库中,std::fstream是个挺好用的文件读写流,操作文件很方便,因为是C++标准库,所以没有其它的环境依赖。在使用fstream过程中,有个打开中文路径文件会失败的问题,自己的代码中一直没处理好,这几天终于有点闲心,把这里改透。涉及很多知识点,也是个遗留已久的问题,特此做个记录。在最后用了个一劳永逸的解决此问题方法:将fstream、FILE再包装下。中文路径使用fstream调试程序过程中,发现打开含中文路径的文件时,会打开失败。查了一些资料,说在VS2008、vs200..

    2022年10月27日
  • plc的移位指令C语言实现,PLC中使用移位指令是如何实现移位动作的

    plc的移位指令C语言实现,PLC中使用移位指令是如何实现移位动作的plc移位指令怎么么用楼主的意思大约是用X2来检测有没有罐子,X1用来定位灌装位置,现在需要把检测罐子的X2位置,移动到灌装位置的前面,应该是提供图片的下面的那种应用吧,这种应用的思路其实主要是要记录下到灌装工位时是否有罐子,程序在图片里面,假设开机前X1和X2之间没有罐子开机后传送带运转当X1检测到应该有罐子的工位来到罐装工位时,首先将检测罐子有无的X2的状态放入M3中,有罐子M3为1,没罐子M…

  • java 删除目录下所有文件_Java删除文件、目录及目录下所有文件的方法实例

    java 删除目录下所有文件_Java删除文件、目录及目录下所有文件的方法实例前言本文主要实现的功能是删除某个目录及目录下的所有子目录和文件,涉及到的知识点:File.delete()用于删除“某个文件或者空目录”!所以要删除某个目录及其中的所有文件和子目录,要进行递归删除。具体代码示例如下:importjava.io.File;publicclassDeleteDirectory{/***删除空目录*@paramdir将要删除的目录路径*/private…

  • StretchDIBits 函数

    StretchDIBits 函数不知道各位有咩有被这个函数搞得很蛋疼,反正我是了,网上的文章很多其实都是到处copy,看了很多然并卵。这个函数的功能和参数就不多说了,蛋疼主要是它画的图片是倒着的,主要问题是怎么把他搞回来。网上的文章说了当目标宽度和源宽度的符号不一样他会做关于x轴的镜像,高度的符号不一样会做Y轴的镜像。好的我的开始函数是这样的StretchDIBits(bufferHDC,0,0,m_nVideoW

  • jetson nano安装pycuda

    jetson nano安装pycudaJetPack4.4版本使用之前配置cuda的环境$sudonano~/.bashrcexportPATH=/usr/local/cuda-10.2/bin:$PATHexportLD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATHexportCUDA_HOME=$CUDA_HOME:/usr/local/cuda-10.2$sudosource~/.bashrc$nvcc-V检测一下是否配置成功之后下载[p

    2022年10月23日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号