关于org.tio.core.udp的UDP交互使用示例

java 复制代码
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.util.Arrays;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.tio.core.Node;
import org.tio.core.udp.UdpPacket;
import org.tio.core.udp.UdpServer;
import org.tio.core.udp.UdpServerConf;
import org.tio.core.udp.intf.UdpHandler;

import com.yanmade.configuration.Configuration;


public class NewMachineUdpHandler {

	private static Logger logger = LoggerFactory.getLogger(NewMachineUdpHandler.class);
	
	private static final String FORMAT = "$%s;%s\r\n";//$%s;%s\\r\\n	\r\n
	
	private static int LOCALPORT = 8090;
	private int newMachinePort = 9090;
	private static String newMachineHost = "172.16.55.100";
	private static final int TIMEOUT = 5000;
	
	private Node remoteNode = null;
	
	private UdpServer server = null;
	
	private int frameSequenceNum = 0;
	
	public static void main(String[] args) {
		newMachineHost = "192.168.230.205";
		
		newMachineHost = "127.0.0.1";
		
		
		Configuration.loadConfiguration();
		NewMachineUdpHandler h = new NewMachineUdpHandler();
		h.startTestCommand();
	}
	
	
	public NewMachineUdpHandler(int lPort,String rIp,int rPort) {
		LOCALPORT = lPort;
		newMachinePort = rPort;
		newMachineHost = rIp;
	}
	
	public NewMachineUdpHandler() {
		newMachinePort = Configuration.getConfigurationBean().newMachinePort;
		newMachineHost = Configuration.getConfigurationBean().newMachineHost;
		remoteNode = new Node(newMachineHost , newMachinePort);
		UdpServerConf udpServerConf = new UdpServerConf(LOCALPORT, new MyUdpHandler(), TIMEOUT);
		try {
			logger.info("LocalIp:{},LOCALPORT:{},newMachineHost:{},newMachinePort:{},",InetAddress.getLocalHost().getHostAddress(),LOCALPORT,newMachineHost,newMachinePort);
			server = new UdpServer(udpServerConf);
			server.start();
			logger.info("Success to init NewMachineUdpHandler.");
		} catch (SocketException e) {
			logger.error("Fail to init NewMachineUdpHandler.", e);
		} catch (UnknownHostException e) {
			logger.error("InetAddress.getLocalHost().getHostAddress().", e);
			e.printStackTrace();
		}
	}
	
	public boolean startTestCommand() {
		reset();
		sendData(String.format(FORMAT, frameSequenceNum++%255 , "start" ));
		for (int i = 0; i < 3; i++) {
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				logger.error("等待接受测试仪器的启动测试回送信息时被意外打断。errMsg:{}",e);
				Thread.currentThread().interrupt();
			}
			if(!isReceiveStart) {
				sendData(String.format(FORMAT, frameSequenceNum%255 , "start" ));
			}else {
				break;
			}
		}
		return isReceiveStart;
	}

	public void aboortTestCommand() {
		sendData(String.format(FORMAT, frameSequenceNum%255 , "abort" ));
		for (int i = 0; i < 3; i++) {
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				logger.error("等待接受测试仪器的终止测试回送信息时被意外打断。。errMsg:{}",e);
				Thread.currentThread().interrupt();
			}
			if(!isReceiveAbort) {
				sendData(String.format(FORMAT, frameSequenceNum%255 , "abort" ));
			}
		}
	}
	
	private void sendData(String str) {
		logger.info("sendData:{},newMachineHost:{},newMachinePort:{}",str,remoteNode.getIp(),remoteNode.getPort());
		server.send(str, remoteNode);
	}
	
	public void stop() {
		server.stop();
	}

	private boolean isReceiveStart = false;
	private boolean isReceiveAbort = false;
	private boolean isEnd = false;
	private boolean isDready = false;
	private boolean isDabnormal = false;
	
	public boolean isReceiveStart() {
		return isReceiveStart;
	}

	public boolean isReceiveAbort() {
		return isReceiveAbort;
	}

	public boolean isEnd() {
		return isEnd;
	}

	public boolean isDready() {
		return isDready;
	}

	public boolean isDabnormal() {
		return isDabnormal;
	}
	
	public boolean isTestFinished(){
		return isEnd && (isDready || isDabnormal);
	}

	public void reset() {
		isReceiveStart = false;
		isReceiveAbort = false;
		isEnd = false;
		isDready = false;
		isDabnormal = false;
	}

	class MyUdpHandler implements UdpHandler{

		@Override
		public void handler(UdpPacket udpPacket, DatagramSocket datagramSocket) {

			logger.info("the original data:{},{},{}",Arrays.toString(udpPacket.getData()),udpPacket.getRemote(),udpPacket.getTime());
			String msg = new String(udpPacket.getData());
			logger.info("received data:{}",msg);
			
			if (msg.contains("start")) {
				isReceiveStart = true;
				return;
			} else if (msg.contains("abort")) {
				isReceiveAbort = true;
				return;
			}
			
			if(msg.contains("end")) {
				isEnd = true;
			}else if(msg.contains("dready")) {
				isDready = true;
			}else if(msg.contains("dabnormal")) {
				isDabnormal = true;
			}
			
			if(isEnd || isDready || isDabnormal) {
				
				try {
					DatagramPacket p = new DatagramPacket(udpPacket.getData(), udpPacket.getData().length,
//							InetAddress.getByName(udpPacket.getRemote().getIp()), udpPacket.getRemote().getPort()
							InetAddress.getByName(newMachineHost), newMachinePort
							);
					datagramSocket.send(p);
					logger.info("回送数据:{}",msg);
				} catch (IOException  e) {
					logger.error("发送数据:{},失败,error:{}。",msg,e);
				}
			}
			
		}
		
	}
}
相关推荐
丁满与彭彭9 分钟前
嵌入式学习笔记-MCU阶段-DAY01
笔记·单片机·学习
2501_9159184134 分钟前
iPhone 抓包工具有哪些?多工具对比分析优缺点
websocket·网络协议·tcp/ip·http·网络安全·https·udp
海海不掉头发1 小时前
【计算机组成原理】-CPU章节学习篇—笔记随笔
笔记·单片机·学习·考研·计算机组成原理
半路_出家ren1 小时前
传输层协议TCP、UDP
网络协议·tcp/ip·udp·tcp
趣多多代言人1 小时前
从零开始手写嵌入式实时操作系统
开发语言·arm开发·单片机·嵌入式硬件·面试·职场和发展·嵌入式
AxureMost3 小时前
Axure-9高级教程:Axure函数使用手册-免费
交互·axure
不想学习\??!4 小时前
STM32-外部中断
stm32·单片机·嵌入式硬件
不想学习\??!4 小时前
STM32-定时器
stm32·单片机·嵌入式硬件
游戏开发爱好者85 小时前
iOS 出海 App 安全加固指南:无源码环境下的 IPA 加固与防破解方法
websocket·网络协议·tcp/ip·http·网络安全·https·udp
LIN-JUN-WEI5 小时前
[ESP32]VSCODE+ESP-IDF环境搭建及blink例程尝试(win10 win11均配置成功)
c语言·开发语言·ide·vscode·单片机·学习·编辑器