You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

113 lines
3.8 KiB

package com.dsideal.FengHuang.Util;
import io.netty.bootstrap.Bootstrap;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.MessageToByteEncoder;
import java.nio.charset.StandardCharsets;
public class SocketUtil {
private final String host;
private final int port;
public SocketUtil(String host, int port) {
this.host = host;
this.port = port;
}
public void sendHexData(String hexData) throws Exception {
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
Bootstrap b = new Bootstrap();
b.group(workerGroup);
b.channel(NioSocketChannel.class);
b.option(ChannelOption.SO_KEEPALIVE, true);
b.handler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) {
ChannelPipeline p = ch.pipeline();
p.addLast(new HexDataEncoder());
p.addLast(new HexDataSenderHandler(hexData));
p.addLast(new ClientHandler()); // 添加客户端 Handler
}
});
// Start the client.
ChannelFuture f = b.connect(host, port).sync();
// Wait until the connection is closed.
//f.channel().closeFuture().sync();
//手动关闭
f.channel().close();
} finally {
workerGroup.shutdownGracefully();
}
}
class HexDataSenderHandler extends ChannelInboundHandlerAdapter {
private final String hexData;
public HexDataSenderHandler(String hexData) {
this.hexData = hexData;
}
@Override
public void channelActive(ChannelHandlerContext ctx) {
byte[] bytes = hexStringToByteArray(hexData);
ByteBuf buffer = Unpooled.buffer(bytes.length);
buffer.writeBytes(bytes);
ctx.writeAndFlush(buffer);
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
cause.printStackTrace();
ctx.close();
}
private byte[] hexStringToByteArray(String hexData) {
int len = hexData.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(hexData.charAt(i), 16) << 4) +
Character.digit(hexData.charAt(i + 1), 16));
}
return data;
}
}
static class ClientHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
// 处理服务器响应数据
byte[] bytes = (byte[]) msg;
String response = new String(bytes, StandardCharsets.US_ASCII);
System.out.println("Server response: " + response);
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
cause.printStackTrace();
ctx.close();
}
}
static class HexDataEncoder extends MessageToByteEncoder<ByteBuf> {
@Override
protected void encode(ChannelHandlerContext ctx, ByteBuf msg, ByteBuf out) throws Exception {
byte[] bytes = new byte[msg.readableBytes()];
msg.getBytes(msg.readerIndex(), bytes);
out.writeBytes(bytes);
}
}
}