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;
}
}