package com.jxkj.udp.client; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.util.Arrays; import org.apache.log4j.Logger; import com.jxkj.util.Util; /** * 发送UDP数据 * @author sourcezero * */ public class UdpClient { private static Logger logger = Logger.getLogger(UdpClient.class); private static String ip="127.0.0.1";//发向地址 private static int port=9999;//发向端口 private static int sleep = 2;//休眠时间 public static void main(String[] args) { DatagramSocket client = null; byte[] sendBuf; if(args!=null&&args.length>0){ port = Integer.valueOf(args[0]); } try { System.out.println("启动UDP发送程序:发送端口"+port); StringBuffer contents = new StringBuffer(); contents.append("测试UDP中文广播"); contents.append("ok"); client = new DatagramSocket(50000); byte[] headbt = hexStringToByte(getUdpHead(contents.length()*4,1,1,1)); byte[] bodybt = Util.string2Hex(contents.toString(), 4).getBytes(); sendBuf = addBytes(headbt,bodybt); InetAddress addr = InetAddress.getByName(ip); DatagramPacket sendPacket = new DatagramPacket(sendBuf ,sendBuf.length , addr , port); while(true){ client.send(sendPacket); System.out.println(Arrays.toString(sendPacket.getData())); try { Thread.sleep(sleep*1000); } catch (InterruptedException e) { logger.error(e); } } } catch (IOException e) { logger.error(e); } finally{ if(client!=null){ client.close(); } } } /** * * @param total 报文长度 * @param count 数据个数 * @param start 起始地址 * @param tbType 对应表类型 * @return */ public static String getUdpHead(int total,int count,int start,int tbType){ StringBuffer sb = new StringBuffer(); String hexTotal = addZeroForNum(Integer.toHexString(total).toUpperCase(),4); String hexCount = addZeroForNum(Integer.toHexString(count).toUpperCase(),4); String hexStart = addZeroForNum(Integer.toHexString(start).toUpperCase(),4); String hexTbType = addZeroForNum(Integer.toHexString(tbType).toUpperCase(),4); //启动字符 发送站地址 报文长度 sb.append("68").append("01").append(hexTotal); //数据类型 数据个数1个 起始地址1 sb.append("10").append(hexCount).append(hexStart); //对应表类型 sb.append(hexTbType); return sb.toString(); } public static byte[] hexStringToByte(String hex) { int len = (hex.length() / 2); byte[] result = new byte[len]; char[] achar = hex.toCharArray(); for (int i = 0; i < len; i++) { int pos = i * 2; result[i] = (byte) (toByte(achar[pos]) << 4 | toByte(achar[pos + 1])); } return result; } private static int toByte(char c) { byte b = (byte) "0123456789ABCDEF".indexOf(c); return b; } public static byte[] addBytes(byte[] data1, byte[] data2) { byte[] data3 = new byte[data1.length + data2.length]; System.arraycopy(data1, 0, data3, 0, data1.length); System.arraycopy(data2, 0, data3, data1.length, data2.length); return data3; } /** * 左补0 * * @param str * @param strLength * @return */ public static String addZeroForNum(String str, int strLength) { int strLen = str.length(); if (strLen < strLength) { while (strLen < strLength) { StringBuffer sb = new StringBuffer(); sb.append("0").append(str);// 左补0 // sb.append(str).append("0");//右补0 str = sb.toString(); strLen = str.length(); } } return str; } }