TCP协议工具类
/**
* TCP协议工具类
*
* @ClassName: TcpUtils
* @Version: 1.0
*/
@Log4j
public class TcpUtils {
/**
* 发送十六进制消息
*
* @param host: IP地址
* @param port: 端口
* @param message: 消息
* @return: void
**/
public static void sendHexStrToByteArrayMessage(String host, int port, String message) throws Exception {
if (StringUtils.isEmpty(host)) {
host = "127.0.0.1";
}
//防止消息丢失
Thread.sleep(120);
Socket socket = new Socket();
//设置连接等待时长(此处尚未连接成功)
socket .connect(new InetSocketAddress(host,port),2000);
boolean connected = socket.isConnected();
if (connected) {
log.info("连接成功 发送消息: " + message);
//获取输出流,向服务器发送消息
OutputStream out = socket.getOutputStream();
byte[] bytes = hexStrToByteArray(message);
if (!StringUtils.isEmpty(bytes)) {
out.write(bytes);
socket.shutdownOutput();
log.info("发送指令成功!");
}
out.close();
socket.close();
}
}
/**
* 将十六进制的字符串转换成字节数组
*
* @param hexString:
* @return: byte[]
**/
public static byte[] hexStrToByteArray(String hexString) {
byte[] bytes = null;
if (!StringUtils.isEmpty(hexString)) {
hexString = hexString.replaceAll(" ", "");
int len = hexString.length();
int index = 0;
bytes = new byte[len / 2];
while (index < len) {
String sub = hexString.substring(index, index + 2);
bytes[index / 2] = (byte) Integer.parseInt(sub, 16);
index += 2;
}
}
return bytes;
}
/**
* 发送十进制消息
*
* @param host: IP地址
* @param port: 端口
* @param message: 消息
* @return: void
**/
public static void sendDecimalMessage(String host, Integer port, String message) throws IOException {
log.info("发送消息:" + message);
//绑定服务器端IP与端口并发送消息
Socket socket = new Socket();
//连接服务并设置超时时间为2秒
socket.connect(new InetSocketAddress(host, port), 2000);
boolean connected = socket.isConnected();
if (connected) {
log.info("连接服务成功");
OutputStream out = socket.getOutputStream();
out.write(message.getBytes(StandardCharsets.UTF_8));
socket.shutdownOutput();
try {
//设置3秒超时时间
socket.setSoTimeout(3000);
//输出socket服务器端返回的消息
InputStream inputStream = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String readLine = reader.readLine();
log.info("返回消息:" + readLine);
} catch (IOException e) {
log.info("TCP协议等待回复超时,未收到回复消息");
} finally {
socket.close();
}
}
}
/**
* 发送十进制消息 带中文的消息
*
* @param host: IP地址
* @param port: 端口
* @param message: 消息
* @return: void
**/
public static void decimalMessage(String host, Integer port, String message) throws Exception {
if (StringUtils.isEmpty(host)) {
host = "127.0.0.1";
}
//防止频繁发送消息造成消息丢失
Thread.sleep(120);
//绑定服务器端IP与端口并发送消息
Socket socket = new Socket();
//连接服务并设置超时时间为2秒
socket.connect(new InetSocketAddress(host, port), 2000);
boolean connected = socket.isConnected();
if (connected) {
log.info("连接成功 发送消息: " + message);
OutputStream out = socket.getOutputStream();
//包含中文汉字 需要使用GBK编码 否则乱码
out.write(message.getBytes("GBK"));
socket.shutdownOutput();
socket.close();
}
}
}
UDP协议工具类
**
* UDP协议
*
* @ClassName: UdpUtils
* @Version: 1.0
*/
public class UdpUtils {
/**
* 发送udp协议并接收回复消息
*
* @param host:
* @param port:
* @param message:
* @return: void
**/
public static String sendUdpMessage(String host, Integer port, String message) throws Exception {
String replyMessage = "";
if (StringUtils.isEmpty(host)) {
host = "127.0.0.1";
}
DatagramSocket socket = new DatagramSocket();
byte[] buf = message.getBytes();
//将数据打包
DatagramPacket packet = new DatagramPacket(buf, buf.length, InetAddress.getByName(host), port);
socket.send(packet);
try {
//设置超时时间
socket.setSoTimeout(2000);
byte[] data =new byte[1024];
DatagramPacket packet1 = new DatagramPacket(data,data.length);
socket.receive(packet1);
replyMessage = new String(data,0,packet1.getLength());
} catch (IOException e) {
replyMessage = "";
} finally {
socket.close();
}
return replyMessage;
}
}