TextLineCodecFactory笔记

Mina的TextLineCodecFactory将字符串编码为字节流,将字节流解码为字符串,下面是使用中遇到的两个问题。 TextLineCodecFactory改变了message的类型 acceptor上挂了textCodec后handler的messageReceived方法中的session是String型(用"message.getClass().getName()"查看),

[INFO] [2012-04-05 16:18:54,317] [com.leechau.mina.echoServer.EchoProtocolHandler] - [Received : hi(java.lang.String)]

否则是IoBuffer:

[INFO] [2012-04-05 15:23:36,760] [com.leechau.mina.echoServer.EchoProtocolHandler] - [message type is: org.apache.mina.core.buffer.SimpleBufferAllocator$SimpleBuffer]

因此挂上TextLineCodecFactory后在handler的messageReceived方法中message参数可直接强转为String;

不能正确解码换行符问题及解决办法 连接Echo Server后有时会出现下面的现象:

hi{enter}

send:

hi

造成这一现象的原因是下面的配置方法使TextLineCodecFactory使用了默认的编解码行分隔符(encoder/decoder line delimeter),即用Unix LineDelimeter(/n)作为编码行分隔符,用AUTO LineDelimeter(\r或者\n,详见Mina API doc对LineDelimeter类的说明)作为解码行分隔符:

acceptor.getFilterChain().addLast("textCodec",new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));

解决这一问题的办法是指定编解码行分隔符:

acceptor.getFilterChain().addLast("textCodec",

new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"),

LineDelimiter.DEFAULT.getValue(), LineDelimiter.DEFAULT.getValue())));

效果如下:

hi{enter} send: hi

如果不希望每次session.write(msg)后编码器自动加上回车符,需要将编码行分隔符指定为NUL:

acceptor.getFilterChain().addLast(" textCodec",

new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"),

LineDelimiter.NUL.getValue(), LineDelimiter.DEFAULT.getValue())));

效果如下:

hi{enter} send: hi

源代码 Main.java

package com.leechau.mina.echoServer; import java.net.InetSocketAddress; import java.nio.charset.Charset; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.textline.TextLineCodecFactory; import org.apache.mina.filter.logging.LoggingFilter; import org.apache.mina.transport.socket.SocketAcceptor; import org.apache.mina.transport.socket.nio.NioSocketAcceptor; public class Main { private static final int PORT = 8293; public static void main(String[] args) throws Exception { SocketAcceptor acceptor = new NioSocketAcceptor(); acceptor.getFilterChain().addLast("logger", new LoggingFilter()); acceptor.getFilterChain().addLast("textCodec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"), LineDelimiter.NUL.getValue() , LineDelimiter.DEFAULT.getValue()))); acceptor.setHandler(new EchoProtocolHandler()); acceptor.bind(new InetSocketAddress(PORT)); System.out.println("Listening on port " + PORT); } }

EchoProtocolHandler.java

package com.leechau.mina.echoServer; import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IoSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class EchoProtocolHandler extends IoHandlerAdapter { private static final Logger LOGGER = LoggerFactory .getLogger(EchoProtocolHandler.class); @Override public void messageReceived(IoSession session, Object message) throws Exception { LOGGER.info("Received : " + message + "(" + message.getClass().getName() + ")"); session.write("send: "); session.write(message); } }

转载于:https://www.cnblogs.com/darkmatter/p/3606837.html

Mina是一个Java网络编程框架,主要用于处理大量的I/O操作,但它本身并不直接提供数据库操作功能。如果你想通过Mina接收数据并存储到数据库中,你需要结合Mina的SocketServer和一些数据库连接库,如JDBC或MyBatis。 这里是一个简单的示例,展示如何在Mina的IoHandler中处理接收的数据,并将其插入到MySQL数据库: ```java import org.apache.mina.core.buffer.IoBuffer; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.textline.TextLineCodecFactory; import org.apache.mina.protocol.tcp.TcpProtocolEncoder; import org.apache.mina.service.nio.NioEventLoopGroup; import org.apache.mina.transport.socket.SocketAcceptor; public class DataReceiver { private static final String DATABASE_URL = "jdbc:mysql://localhost:3306/mydatabase"; private static final String INSERT_QUERY = "INSERT INTO my_table (data_column) VALUES (?)"; public static void main(String[] args) throws Exception { NioEventLoopGroup bossGroup = new NioEventLoopGroup(); NioEventLoopGroup workerGroup = new NioEventLoopGroup(); try (SocketAcceptor acceptor = new SocketAcceptor()) { acceptor.setHandler(new MyDataHandler(bossGroup, workerGroup)); acceptor.bind(8080); // 设置监听端口 TextLineCodecFactory codecFactory = new TextLineCodecFactory(); acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(codecFactory)); TcpProtocolEncoder encoder = new TcpProtocolEncoder(); acceptor.getFilterChain().addLast("encoder", encoder); bossGroup.start(); workerGroup.start(); // 这里开始监听,当有新的连接进来时,会触发acceptor的handler回调 acceptor.accept(); } finally { workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); } } static class MyDataHandler extends IoHandlerAdapter { private final NioEventLoopGroup bossGroup; private final NioEventLoopGroup workerGroup; public MyDataHandler(NioEventLoopGroup bossGroup, NioEventLoopGroup workerGroup) { this.bossGroup = bossGroup; this.workerGroup = workerGroup; } @Override protected void messageReceived(IoSession session, Object message) throws Exception { String receivedData = ((IoBuffer) message).toString(); insertIntoDatabase(receivedData); } private void insertIntoDatabase(String data) { try (Connection conn = DriverManager.getConnection(DATABASE_URL)) { PreparedStatement pstmt = conn.prepareStatement(INSERT_QUERY); pstmt.setString(1, data); pstmt.executeUpdate(); // 数据插入操作 } catch (SQLException e) { System.err.println("Error inserting data into database: " + e.getMessage()); } } } } ``` 在这个例子中,`MyDataHandler`负责接收来自客户端的数据,然后通过`insertIntoDatabase`方法将数据插入到指定的数据库表中。注意,这只是一个基本的示例,实际应用中需要考虑异常处理、线程安全等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值