環境:JDK1.8 WIN10
集成:SpringBoot+Mybatis+Mina+MySql
開發工具eclipse Neon.3 Release (4.6.3)
目錄如下
Mina包中的ServerHandler裏有所有的事件
在spring boot啓動類中添加打開端口的方法
Util工具包中放了幾個常用的進制轉換、CRC校驗、Unicode轉換
ServerHandler中調用其他service需要使用特殊方法,類中已經註明流程
總結來說就三個步驟
1.在pom.xml中添加兩個jar包 Mina和Socket
<!--socket通訊 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
<version>4.0.1.RELEASE</version>
</dependency>
<!--Mina框架 -->
<dependency>
<groupId>org.apache.mina</groupId>
<artifactId>mina-core</artifactId>
<version>2.0.2</version>
</dependency>
2.在SpringBoot啓動類Application中增加啓動方法
@Bean
public IoAcceptor ioAcceptor() throws Exception {
IoAcceptor acceptor=new NioSocketAcceptor();
acceptor.setHandler(new ServerHandler());
acceptor.getSessionConfig().setReadBufferSize(1024);
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 100);
acceptor.bind(new InetSocketAddress(PORT));
System.out.println("服務器在端口:" + PORT + "已經啓動");
return acceptor;
}
3.創建Mina事件類ServerHandler
package cn.yiyuan.Mina;
import javax.annotation.PostConstruct;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.transport.socket.SocketSessionConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import cn.yiyuan.Util.HexUtil;
@Component
public class ServerHandler extends IoHandlerAdapter {
private Logger logger = LoggerFactory.getLogger(this.getClass());
/* 在本類中調用其他service需要使用以下方法
*
* */
//1.聲明service類
/*@Autowired
private TbBoxService tbBoxService;*/
private static ServerHandler serverHandler ;
//2通過@PostConstruct實現初始化bean之前進行的操作
@PostConstruct
public void init() {
serverHandler = this;
//serverHandler.tbBoxService = this.tbBoxService;.
//3.調用時需要加前綴 如 serverHandler.tbBoxService
}
@Override
public void sessionCreated(IoSession session) throws Exception { //用戶連接到服務器
SocketSessionConfig cfg = (SocketSessionConfig) session.getConfig();
cfg.setSoLinger(0);
logger.info("[服務建立]" + session.getId());
}
@Override
public void messageReceived(IoSession session, Object message)throws Exception {//接收消息
IoBuffer bbuf = (IoBuffer) message;
byte[] byten = new byte[bbuf.limit()];
bbuf.get(byten, bbuf.position(), bbuf.limit());
String temp=HexUtil.bytes2HexString(byten);
temp = temp.trim();
logger.info("[收到消息]" + temp);
}
@Override
public void sessionClosed(IoSession session) throws Exception { //用戶從服務器斷開
logger.info("[服務斷開]" + session.getId());
}
@Override
public void messageSent(IoSession session, Object message){ //發送消息結束
//logger.info("[發送消息結束]" + session.getId() + "message" + message);
}
@Override
public void sessionIdle(IoSession session, IdleStatus status)throws Exception {//重連
logger.info("[服務重連]" + session.getId() + "status" + status.toString());
}
@Override
public void exceptionCaught(IoSession session, Throwable cause)throws Exception {//連接發生異常
cause.printStackTrace();
logger.info("[服務異常]" + session.getId());
}
}
然後直接啓動項目,客戶端通過IP:端口即可連接服務端
以上項目均爲本人爲寫項目整合的網上已有資源,希望可以幫助到大家,同時感謝開源作者
完整項目下載地址:https://download.csdn.net/download/qq_33768099/10992288