socket是java tcp通讯的封装工具,有时在工业上使用,配置需要的开发水平较高,偶尔不慎,就造成短路,接收不到数据。mina封装类很好解决了这个问题。在扫码头,电子秤等需要tcp通讯的地方使用很简洁方便。
参考
pom.xml
org.rxtx rxtx 2.1.7 provided log4j log4j 1.2.17 org.apache.mina mina-core 2.0.7
server端,定义服务端,相当于socketserver.定义端口,接收数据。
题外话:server中ip是使用系统的ip,client端才需要指定ip,server端只需定义port。
package com.hs.mina;
import com.hs.service.SenMessageService;
import org.apache.mina.core.service.IoAcceptor;
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.nio.NioSocketAcceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
@Component
public class MinaServer {
@Autowired
private SenMessageService senMessageService;
public static boolean isRun = false;
public static void main(String[] args) throws IOException {
}
public void start() throws IOException {
IoAcceptor acceptor = new NioSocketAcceptor();
// acceptor.getFilterChain().addLast("logger", new LoggingFilter());
acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
acceptor.setHandler(new TimeServerHandler(senMessageService));//这里规定了具体处理业务的实现类
acceptor.bind(new InetSocketAddress(9008));
isRun = true;
System.out.println("mina 启动 9008 接收重量");
System.out.println(senMessageService);
}
}
处理业务的实现类 ,相当于 service的实现类,处理具体的业务,也相当于一个线程。
接受字符串
package com.hs.mina;
import com.hs.conf.Weight;
import com.hs.service.SenMessageService;
import com.hs.util.NumberUtils;
import com.hs.util.StringU;
import lombok.extern.slf4j.Slf4j;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
import org.springframework.stereotype.Component;
@Component
@Slf4j
/**
* 接收重量
*/
public class TimeServerHandler extends IoHandlerAdapter {
private SenMessageService senMessageService;
public TimeServerHandler(SenMessageService senMessageService) {
this.senMessageService = senMessageService;
}
@Override
public void messageReceived(IoSession session, Object message){
String mes = message.toString();//接受字符串
log.info("9008 收到 ====" + mes);
if (mes.split("\\.").length > 1) {
mes = StringU.number(mes);
double zl = Double.valueOf(mes.substring(0, mes.length() - 1));
Weight.ZL = zl;
log.info("判定为重量" + zl);
} else if(NumberUtils.isNumber(mes)) {
int xh = Integer.valueOf(mes);
log.info("判定为序号" + xh);
Weight.XH = xh;
}else{
log.info("判定为包头:" + mes);
}
}
public static void main(String[] args) {
String s = "0015.C88A".replaceAll("[a-zA-Z]", "");
System.out.println(s);
}
}
实现类处理字符流
参考 mina iobuffer格式数据转化为String_just do it now的博客-CSDN博客
搞懂iobuffer就得先学习bytebuffer - 和风细雨汪汪 - 博客园
package com.hs.mina;
import com.hs.conf.Weight;
import com.hs.service.SenMessageService;
import com.hs.service.SenMessageService2x;
import com.hs.util.DateUtilMy;
import lombok.extern.slf4j.Slf4j;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
@Slf4j
public class TimeServerHandler9001erw extends IoHandlerAdapter {
private int count = 0;
private SenMessageService2x senMessageService2x;
public TimeServerHandler9001erw(SenMessageService2x senMessageService) {
this.senMessageService2x = senMessageService;
}
@Override
public void messageReceived(IoSession session, Object message) {
byte[] by = new byte[((IoBuffer)message).limit()];
((IoBuffer)message).get(by);//处理收到的字符流
StringBuffer mesbu = new StringBuffer();
for (int i = 0; i < by.length; i++) {
mesbu.append((char) by[i]);
}
String mes = mesbu.toString();
log.info("2线收到二维码 9001:" + mes);
if(mes.trim().contains("ERROR")){
log.error("9001没扫描到二维码,过===");
}else if(mes.split(",").length > 1){
log.info("9001收到二维码 入库开始 === ");
senMessageService2x.verify(mes,0.0);
}else{
log.info("9001啥也不是:" + mes);
}
}
}
首先使用String直接接收,接受不了的或者不全的,尝试使用第二种iobuffer 接收。