mina,TextLineDecoder

使用mina的TextLineDecoder,可以指定接收数据的结束符号,但如果没有指定结束符,就默认会去匹配'/n'或者'/r'结束符

如果从服务端返回的数据没有包含这些结束符,客户端就会等待。

为了不让客户端等待下去,可以增加一个TextLineDecoder子类,如下:

public class ClientTextLineDecoder extends TextLineDecoder {

@Override
public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out)
throws Exception {


/*--------在当前buffer后面追加一个'/n' -------*/


in.setAutoExpand(true);//设置自动扩展
in.position(in.limit());
in.put((byte)'/n');
in.position(0);



super.decode(session, in, out);
}



}

我们只要在调用父类的decode方法之前在buffer后面追加一个'/n'结束符,就可以解决问题。

下面是buffer相关的知识:

Buffer foundations

The abstract Buffer class forms the foundation of the java.nio package's buffer support. Buffer works like an in-memory RandomAccessFile for reading and writing primitive data types. Like a RandomAccessFile , with Buffer the next operation you perform (read/write) happens at your position. Performing either operation changes that position, so doing a read after a write doesn't read what was just written, but what is after what was just written. Buffer offers four indicators for access to the linear structure (from highest value to lowest):

  • capacity() : Indicates the buffer's size
  • limit() : Tells you how many bytes you've stuffed into the buffer so far, or lets you change that limit with :limit(int newLimit) :
  • position() : Tells you the current location to perform the next read/write operation
  • mark() : Lets you remember a position for later resetting with reset()

具体可以参考:http://www.ibm.com/developerworks/java/library/j-mer03253.html

### 基于 Apache Mina 的多人聊天系统实现 Apache Mina 是一个网络应用框架,用于开发高性能和高可扩展性的网络应用程序。通过使用 Apache Mina,可以构建一个基于 TCP/IP 协议的多人聊天系统[^1]。以下是关于如何使用 Apache Mina 实现多人聊天系统的详细说明。 #### 1. 系统架构设计 多人聊天系统通常由客户端和服务器端组成。服务器端负责接收来自多个客户端的消息,并将消息广播给所有连接的客户端。客户端则负责向服务器发送消息并接收其他用户的消息[^2]。 - **服务器端**:使用 Apache Mina 提供的 `IoAcceptor` 来监听客户端连接请求,并处理接收到的数据。 - **客户端**:使用 Apache Mina 提供的 `IoConnector` 来连接服务器,并发送消息或接收广播消息。 #### 2. 核心组件与功能实现 ##### (1) 服务器端实现 服务器端的主要任务是监听客户端的连接请求、接收消息并广播给所有在线用户。以下是一个简单的服务器端代码示例: ```java import org.apache.mina.core.service.IoAcceptor; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.logging.LoggingFilter; import org.apache.mina.transport.socket.nio.NioSocketAcceptor; public class ChatServer { public static void main(String[] args) throws Exception { IoAcceptor acceptor = new NioSocketAcceptor(); // 添加日志过滤器和编码解码过滤器 acceptor.getFilterChain().addLast("logger", new LoggingFilter()); acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory())); // 设置处理器 acceptor.setHandler(new ChatServerHandler()); // 绑定端口 acceptor.bind(new InetSocketAddress(8080)); System.out.println("Chat server started on port 8080"); } } ``` ##### (2) 客户端实现 客户端需要连接到服务器,并能够发送消息和接收广播消息。以下是一个简单的客户端代码示例: ```java import org.apache.mina.core.future.ConnectFuture; import org.apache.mina.core.service.IoConnector; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.transport.socket.nio.NioSocketConnector; public class ChatClient { public static void main(String[] args) throws Exception { IoConnector connector = new NioSocketConnector(); // 添加编码解码过滤器 connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory())); // 设置处理器 connector.setHandler(new ChatClientHandler()); // 连接到服务器 ConnectFuture future = connector.connect(new InetSocketAddress("localhost", 8080)); future.awaitUninterruptibly(); if (future.isConnected()) { System.out.println("Connected to server"); } } } ``` ##### (3) 消息处理 为了实现消息的解析和广播,需要定义一个消息处理器。以下是一个简单的消息处理器示例: ```java import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.codec.ProtocolCodecFactory; import org.apache.mina.filter.codec.ProtocolDecoder; import org.apache.mina.filter.codec.ProtocolEncoder; public class TextLineCodecFactory implements ProtocolCodecFactory { @Override public ProtocolEncoder getEncoder(IoSession session) throws Exception { return new TextLineEncoder(); } @Override public ProtocolDecoder getDecoder(IoSession session) throws Exception { return new TextLineDecoder(); } } ``` #### 3. 关键技术点 - **异步通信**:Apache Mina 使用异步 I/O 模型来处理网络通信,确保了高并发性能[^3]。 - **编码解码**:通过 `ProtocolCodecFilter`,可以方便地对消息进行编码和解码。 - **消息广播**:服务器端可以通过遍历所有会话对象(`IoSession`)来实现消息的广播。 #### 4. 示例运行流程 1. 启动服务器端程序,监听指定端口。 2. 启动多个客户端程序,连接到服务器。 3. 客户端发送消息,服务器接收后广播给所有在线用户。 4. 客户端接收并显示广播消息。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值