由apache
mina建立的socket不管是采用TCP或是UDP,在Filter不添加codec选项的情况下,由IoHandlerAdapter派生的处理
handler 类中public void messageReceived(IoSession session, Object
message){}函数里的message对象是IoBuffer的实例,如下:
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
if (! (message instanceof IoBuffer)) {
return;
}
IoBuffer rb = (IoBuffer) message;
callback.messageReceived(java.nio.ByteBuffer.wrap(rb.array(), 0, rb.buf().limit()));
}
另外提醒:
1、如果你使用mina建立一个socket添加了如下:
IoFilter CODEC_FILTER = new ProtocolCodecFilter(
new TextLineCodecFactory());
connector(acceptor).getFilterChain().addLast("codec", CODEC_FILTER);
如果发送数据的socket不是同样的设置或者不是利用mina建立的socket则发送数据的时候需要在数据末尾添加‘\n’,以表示字符串结束。
2、
由于我们使用mina socket读取数据时通常都是采用其通知接收的方式,所以我们必须留心接收数据的完整性,如果你使用mina
socket接收数据不完整,在确认自己接收处理代码无误后,请检查一下org\apache\mina\core\polling
\AbstractPollingIoProcessor.java中的代码的如下红色部分:
private void read(T session) {
IoSessionConfig config = session.getConfig();
IoBuffer buf = IoBuffer.allocate(config.getReadBufferSize());
final boolean hasFragmentation =
session.getTransportMetadata().hasFragmentation();
try {
int readBytes = 0;
int ret;
try {
if (hasFragmentation) {
while ((ret = read(session, buf)) > 0) {
readBytes += ret;
if (!buf.hasRemaining()) {
break;
}
}
} else {
ret = read(session, buf);
if (ret > 0) {
readBytes = ret;
}
}
} finally {
buf.flip();
}
if (readBytes > 0) {
IoFilterChain filterChain = session.getFilterChain();
filterChain.fireMessageReceived(buf);
buf = null;
if (hasFragmentation) {
if (readBytes << 1 < config.getReadBufferSize()) {
session.decreaseReadBufferSize();
} else if (readBytes == config.getReadBufferSize()) {
session.increaseReadBufferSize();
}
}
}
if (ret < 0) {
scheduleRemove(session);
}
} catch (Throwable e) {
if (e instanceof IOException) {
scheduleRemove(session);
}
IoFilterChain filterChain = session.getFilterChain();
filterChain.fireExceptionCaught(e);
}
}
分享到:
相关推荐
在压缩包子文件的文件名“M2M”中,通常M2M代表Machine-to-Machine通信,这可能是指使用MINA来实现设备之间的数据交换,例如在物联网(IoT)环境中。MINA的灵活性和可扩展性使得它适合于处理各种设备间的通信需求,...
2. **Mina文件图片传送** 在Mina中,我们可以利用BufferedIoFilter或者IoBuffer来传输文件,包括图片。首先,我们需要将图片文件读取到内存中的IoBuffer,然后通过过滤器链传递给远程客户端。在这个过程中,可以...
为了测试,你可以使用串口调试工具(如RealTerm、CoolTerm等)连接到同一串口,发送和接收数据。 以上就是Spring Boot整合Mina实现串口通信的基本步骤。这个例子中,我们创建了一个可直接运行的Spring Boot项目,...
NULL 博文链接:https://summerbell.iteye.com/blog/359201
本文将深入探讨如何使用Mina库在Android客户端与Java服务器之间实现UDP(用户数据报协议)的数据交互。 UDP是一种无连接的、不可靠的传输层协议,相比TCP,它具有更低的延迟和更高的数据传输效率。然而,由于其不...
3. **定义处理器**:编写一个实现了`IoHandler`接口的类,处理接收到的数据和发送的数据。 4. **监听事件**:在处理器中,我们需要重写`sessionCreated()`、`messageReceived()`和`messageSent()`等方法,以响应...
这个app可能包括了服务端和客户端两部分,服务端使用mina监听特定端口,接收客户端连接,并处理发送过来的数据;客户端则负责发起连接,发送请求,并接收服务端响应。 4. **Android集成Mina** 集成mina到Android...
同时,客户端也可以使用Mina创建一个Socket连接,发送数据到服务器,并通过接收过滤器解析服务器返回的信息。 总结起来,Socket和Mina都是Java网络编程的重要工具,Socket更适合简单的、低级别的网络通信,而Mina则...
通过 IoSession,开发者可以发送和接收数据,管理会话状态,并且进行读写操作。 2. **FilterChain**:MINA 使用过滤器链模式来处理网络事件。过滤器链允许在数据传输前或后添加预处理或后处理逻辑,每个过滤器执行...
- 测试代码:用于验证传输和接收数据的正确性。 总的来说,Apache Mina提供了强大的工具,帮助开发者构建高性能、可扩展的网络服务,同时允许他们专注于业务逻辑,而不是底层的网络通信细节。通过理解和实践“mina...
在"echo_client_udp"中,当客户端发送数据后,MINA2会异步等待服务器的响应,这样可以有效地避免线程阻塞,提高系统性能。 5. 学习与实践价值: "echo_client_udp"是学习MINA2和UDP通信的理想起点。通过这个示例,...
2. 设置串口参数:如数据位、停止位、校验位等。 3. 实现串口监听器:处理数据接收事件,处理粘包和断包问题。 4. 数据发送:发送串口命令或数据,注意异步特性,可能无返回结果。 5. 错误处理:捕获并处理串口通信...
- 编解码器还需要处理不完整数据的情况,可能需要在解码过程中保存状态,以便在接收完整数据后继续解析。 5. **最佳实践** - 为了提高效率,编解码器应尽量减少不必要的内存复制,如使用DirectByteBuffer。 - ...
4. **MINA2的UDP服务端**:MINA2服务端会创建一个Acceptor监听特定的UDP端口,接收到数据后通过FilterChain进行处理,然后可能发送回相应的数据。 5. **过滤器(Filter)**:MINA2中的过滤器是处理输入和输出数据的...
3. **IoHandler**:IoHandler是处理网络事件的主要接口,如连接建立、数据接收、连接关闭等。你可以实现这个接口来定义你的业务逻辑。 4. **ProtocolCodec**:为了处理不同协议的数据编码和解码,Mina提供了...
IoSession是连接状态的容器,包含了会话中的所有信息,如远程地址、本地地址、缓冲区大小、已发送和接收的数据量等。 接下来,我们讨论"Mina心跳连接"。心跳机制是保持连接活性的重要手段,特别是在长连接中,防止...
2. **创建IoSession**:IoSession是Mina的核心概念,代表了客户端和服务器之间的会话。客户端需要初始化一个IoConnector来建立连接,并通过connect()方法创建IoSession。 3. **定义ProtocolCodecFilter**:为了进行...
Mina2的核心概念包括Session、Filter和ProtocolHandler,这些组件共同协作,实现网络通信的全过程。 二、Spring框架概述 Spring是一个全方位的Java企业级应用开发框架,它涵盖了AOP(面向切面编程)、DI(依赖注入...
通过mina demo中的TCP示例,你可以学习如何创建服务器监听客户端连接、接收和发送数据,以及处理异常和关闭连接等操作。 UDP(User Datagram Protocol)则是一种无连接的、不可靠的传输协议,它的特点是速度快,但...