目前Netty的OIO基本废弃,串口也在过期范围,暂时没找到替代方法,先凑合用
1.依赖
<dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.70.Final</version> </dependency>
2. RxtxClient.java
import io.netty.bootstrap.Bootstrap; import io.netty.channel.*;import io.netty.handler.codec.LineBasedFrameDecoder; import io.netty.handler.codec.string.StringDecoder; import io.netty.handler.codec.string.StringEncoder; import java.nio.charset.StandardCharsets; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executors; /** * TODO * * @author GuestZ * @version 1.0 * @date 2021/11/9 11:54 */ public class RxtxClient { public void createRxtx(RxtxClientHandler handler,String portName) throws Exception { System.out.println(portName); //串口使用阻塞io EventLoopGroup group = new OioEventLoopGroup(); try { Bootstrap bootstrap = new Bootstrap(); bootstrap.group(group) .channelFactory(() -> { RxtxChannel rxtxChannel = new RxtxChannel(); rxtxChannel.config() .setBaudrate(9600) .setDatabits(RxtxChannelConfig.Databits.DATABITS_8) .setParitybit(RxtxChannelConfig.Paritybit.NONE) .setStopbits(RxtxChannelConfig.Stopbits.STOPBITS_1); return rxtxChannel ; }) .handler(new ChannelInitializer<RxtxChannel>() { @Override protected void initChannel(RxtxChannel rxtxChannel) { rxtxChannel.pipeline().addLast( new LineBasedFrameDecoder(60000), new StringEncoder(StandardCharsets.UTF_8), new StringDecoder(StandardCharsets.UTF_8), handler ); } }); ChannelFuture f = bootstrap.connect(new RxtxDeviceAddress(portName)).sync(); f.channel().closeFuture().sync(); } finally { group.shutdownGracefully(); } } public void start(RxtxClientHandler handler,String portName){ CompletableFuture.runAsync(()->{ try { //阻塞的函数 createRxtx(handler,portName); } catch (Exception e) { e.printStackTrace(); } }, Executors.newSingleThreadExecutor());//不传默认使用ForkJoinPool,都是守护线程 } }
3.RxtxClientHandler.java
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; /** * TODO * * @author GuestZ * @version 1.0 * @date 2021/11/9 12:01 */ public class RxtxClientHandler extends SimpleChannelInboundHandler<String> { private ChannelHandlerContext ctx; public ChannelHandlerContext getCtx() { return ctx; } public void setCtx(ChannelHandlerContext ctx) { this.ctx = ctx; } @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { ctx.writeAndFlush("success\n"); this.ctx = ctx; } @Override protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { System.out.println("接收到:"+msg); //ctx.writeAndFlush("已收到\n"); //ctx.close(); } public void write(String msg){ if(ctx!=null){ ctx.writeAndFlush(msg); } } }
4.测试类
import java.util.Scanner; /** * COM1测试 * * @author GuestZ * @version 1.0 * @date 2021/11/9 11:04 */ public class TestCom1 { public static void main(String[] args) throws Exception { RxtxClient rxtxClient = new RxtxClient(); RxtxClientHandler handler = new RxtxClientHandler(); rxtxClient.start(handler,"COM1"); Scanner scanner = new Scanner(System.in); while (scanner.hasNextLine()){ String line = scanner.nextLine(); handler.write(line+"\n"); } } }
/**
* TODO
*
* @author GuestZ
* @version 1.0
* @date 2021/11/9 12:02
*/
public class TestCom2 {
public static void main(String[] args) throws Exception {
RxtxClient rxtxClient1 = new RxtxClient();
RxtxClientHandler handler2 = new RxtxClientHandler();
rxtxClient1.start(handler2,"COM2");
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextLine()){
String line = scanner.nextLine();
handler2.write(line+"\n");
}
}
}
5
TestCom1
来打昆特牌吧
接收到:好
TestCom2
接收到:来打昆特牌吧
好