由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);
}
}
分享到:
相关推荐
NULL 博文链接:https://summerbell.iteye.com/blog/359201
mina自定义编解码 不错的资源 ----其实不怎么样,技术就是拿出来共享的,开源。大家一起前进
本项目使用JAVA + MINA + ServiceLoader实现交通部809协议服务端代码。代码中完成了主链路部分,包括对客户端登录验证及应答,注销及应答,...本项目接收数据逻辑已上线测试,能够正常收到下级平台上传的车辆定位数据。
使用mina框架实现串口通讯,费了一番周折终于调通,和大家分享一下!
找了很长时间网上没有一个详细整合的例子,现在已整合成功 放上来让大家参照,少走弯路,稍后会放出博客说明 使用idea 打开后可以直接使用的例子,很珍贵
springboot集成mina实现串口协议对接,包含断包、粘包处理。串口协议发送与接收是异步的,发送没有返回,只能通过监听获取。
这个代码,在mina框架中,实现了编码解码,包含了服务器端发送数据的代码和作为客户端接收数据的代码。
校验码 n+8 2 类型、数据长度、数据三部分的所有字节的CRC-16码 注 1:其中字符''为转意符,所有除头尾外的字节,如果是'*','#',''在通讯时换成"*","#","\" 注 2:凡涉及多字节数据均为低字节在前 心跳包格式 ...
Apache Mina Server 是一个网络通信应用框架 基于 TCP/IP、UDP/IP协议栈的通信框架 支持串口和虚拟机内部的...本实例演示了编码、解码、支持json数据发送和接收,数据格式:{命令长度4字节,命令,数据长度4字节,数据}
test2:在控制台中Server可以给所有Client发送数据,Client可以给Sever和其他Client发送数据。 test3:(1)特定角色的Client处理消息。 (2)特定角色的Client收到消息。 Client与Server建立Session后,Server...
本例子是MyEclipse的JAVA工程,使用encoder和decoder对传输的数据对象编解码,接收和返回的数据头四个字节都表示后面数据的长度,源码中包含详细注释,理解后可修改为传输任意对象。 src源码包下的test.mina.server...
基于MINA架构实现的UDP接收服务器,支持对mysql数据库的连接池插入查找操作。数据接收采用MINA,处理使用线程池并结合数据库连接池实现对发送数据的储存。
mina是一个基于java nio的网络通信框架。主要屏蔽了网络通信的一些细节,对Socket进行封装,并且是NIO的一个实现架构,...3.Mina 的API 将真正的网络通信与我们的应用程序隔离开来,你只需要关心你要发送、接收的数据
2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...
2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...
场景如下图, ... 1,这里的服务端到认证是TCP 异步的。...这里需要服务端接收到认证返回的数据结果过后,才能返回给终端。 附件代码是解决该问题的两种解决方案,可以用户同步的mina之类的socket调用。
手机端、桌面软件是通过socket长连进行数据交互,浏览器是通过webSocket长连进行数据交互。 #技术框架 springMVC、mybatis、webSocket、mina、jms、mongoDB、memcache #使用 SocketHandler类用来接收和返回客户端...