- 2023-12-30 15:36:22
- 7150 热度
- 0 评论
服务端代码:
package com.xd.nms.example; import java.io.IOException; import java.net.InetSocketAddress; 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.nio.NioSocketAcceptor; import com.xd.nms.util.ByteAndStr16; /** * @说明 Mina TCP 服务端 * @author * @version 1.0 * @since */ public class MinaTcpServer extends IoHandlerAdapter { public static final int PORT = 18567; public MinaTcpServer() throws IOException { NioSocketAcceptor acceptor = new NioSocketAcceptor(); acceptor.setHandler(this); acceptor.bind(new InetSocketAddress(PORT)); System.out.println("TCP服务启动,端口:" + PORT); } public static void main(String[] args) throws IOException { new MinaTcpServer(); } @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()); System.out.println("收到消息:" + ByteAndStr16.Bytes2HexString(byten)); byte[] bts = new byte[10]; for(int i=0;i<10;i++){ bts[i] = (byte)i; } IoBuffer buffer = IoBuffer.allocate(10); buffer.put(bts); buffer.flip(); session.write(buffer); // // 拿到所有的客户端Session // Collection<IoSession> sessions = session.getService().getManagedSessions().values(); // // 向所有客户端发送数据 // for (IoSession sess : sessions) { // sess.write(buffer); // } } @Override public void sessionClosed(IoSession session) throws Exception { System.out.println("会话关闭"); } @Override public void exceptionCaught(IoSession session, Throwable cause) throws Exception { System.out.println("会话异常"); super.exceptionCaught(session, cause); } @Override public void messageSent(IoSession iosession, Object obj) throws Exception { System.out.println("服务端消息发送"); super.messageSent(iosession, obj); } @Override public void sessionCreated(IoSession iosession) throws Exception { System.out.println("会话创建"); super.sessionCreated(iosession); } @Override public void sessionIdle(IoSession iosession, IdleStatus idlestatus) throws Exception { System.out.println("会话休眠"); super.sessionIdle(iosession, idlestatus); } @Override public void sessionOpened(IoSession iosession) throws Exception { System.out.println("会话打开"); super.sessionOpened(iosession); } }
服务端建立端口监听后,收到消息后进入messageReceived()方法,示例处理是打印该消息,然后组装了一个0-9的数据返回回去
注意,即使使用的是Mina,仍需做分包、粘包,等处理,例如有时一条数据不是一次发过来的
客户端程序:
package com.xd.nms.example; import java.net.InetSocketAddress; import org.apache.mina.core.buffer.IoBuffer; import org.apache.mina.core.future.ConnectFuture; import org.apache.mina.core.service.IoConnector; 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.nio.NioSocketConnector; import com.xd.nms.util.ByteAndStr16; /** * @说明 Mina TCP客户端 * @author * @version 1.0 * @since */ public class MinaTcpClient extends IoHandlerAdapter { private IoConnector connector; private static IoSession session; public MinaTcpClient() { connector = new NioSocketConnector(); connector.setHandler(this); ConnectFuture connFuture = connector.connect(new InetSocketAddress("localhost", MinaTcpServer.PORT)); connFuture.awaitUninterruptibly(); session = connFuture.getSession(); System.out.println("TCP 客户端启动"); } public static void main(String[] args) throws Exception { MinaTcpClient client = new MinaTcpClient(); for(int j=0;j<2;j++){ // 发送两遍 byte[] bts = new byte[20]; for (int i = 0; i < 20; i++) { bts[i] = (byte) i; } IoBuffer buffer = IoBuffer.allocate(20); // 自动扩容 buffer.setAutoExpand(true); // 自动收缩 buffer.setAutoShrink(true); buffer.put(bts); buffer.flip(); session.write(buffer); Thread.sleep(2000); } // 关闭会话,待所有线程处理结束后 client.connector.dispose(true); } @Override public void messageReceived(IoSession iosession, Object message) throws Exception { IoBuffer bbuf = (IoBuffer) message; byte[] byten = new byte[bbuf.limit()]; bbuf.get(byten, bbuf.position(), bbuf.limit()); System.out.println("客户端收到消息" + ByteAndStr16.Bytes2HexString(byten)); } @Override public void exceptionCaught(IoSession session, Throwable cause) throws Exception { System.out.println("客户端异常"); super.exceptionCaught(session, cause); } @Override public void messageSent(IoSession iosession, Object obj) throws Exception { System.out.println("客户端消息发送"); super.messageSent(iosession, obj); } @Override public void sessionClosed(IoSession iosession) throws Exception { System.out.println("客户端会话关闭"); super.sessionClosed(iosession); } @Override public void sessionCreated(IoSession iosession) throws Exception { System.out.println("客户端会话创建"); super.sessionCreated(iosession); } @Override public void sessionIdle(IoSession iosession, IdleStatus idlestatus) throws Exception { System.out.println("客户端会话休眠"); super.sessionIdle(iosession, idlestatus); } @Override public void sessionOpened(IoSession iosession) throws Exception { System.out.println("客户端会话打开"); super.sessionOpened(iosession); } }
向服务端发送两次0-19的数据,收到消息后同样进入messageReceived()方法,处理同样是打印显示!
打印结果:
TCP服务启动,端口:18567 会话创建 会话打开 收到消息:00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 服务端消息发送 收到消息:00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 服务端消息发送 会话关闭
客户端打印:
客户端会话创建 客户端会话打开 TCP 客户端启动 客户端消息发送 客户端收到消息00 01 02 03 04 05 06 07 08 09 客户端消息发送 客户端收到消息00 01 02 03 04 05 06 07 08 09 客户端会话关闭
示例仅供参考
0 评论
留下评论
热门标签
- Spring(403)
- Boot(208)
- Spring Boot(187)
- Java(82)
- Cloud(82)
- Spring Cloud(82)
- Security(60)
- Spring Security(54)
- Boot2(51)
- Spring Boot2(51)
- Redis(31)
- SQL(29)
- Mysql(25)
- IDE(24)
- Dalston(24)
- mongoDB(22)
- MVC(22)
- JDBC(22)
- IDEA(22)
- Web(21)
- CLI(20)
- Alibaba(19)
- SpringMVC(19)
- SpringBoot(17)
- Docker(17)
- Git(16)
- Eclipse(16)
- Vue(16)
- JPA(15)
- Apache(15)
- ORA(15)
- Tomcat(14)
- Linux(14)
- HTTP(14)
- Mybatis(14)
- Oracle(14)
- jdk(14)
- OAuth(13)
- Nacos(13)
- Pro(13)
- XML(13)
- JdbcTemplate(13)
- JSON(12)
- OAuth2(12)
- Data(12)
- int(11)
- Myeclipse(11)
- stream(11)
- not(10)
- Bug(10)
- maven(9)
- Map(9)
- Hystrix(9)
- ast(9)
- session(8)
- Window(8)
- Swagger(8)
- APP(8)
- Bit(8)
- API(8)
- Cache(7)
- File(7)
- IntelliJ(7)
- mail(7)
- windows(7)
- too(7)
- HTML(7)
- Github(7)
- JavaMail(7)
- WebFlux(6)
- JSP(6)
- Bean(6)
- error(6)
- Server(6)
- nginx(6)
- ueditor(6)
- jar(6)
- ehcache(6)
- UDP(6)
- RabbitMQ(6)
- star(6)
- and(6)
- Excel(6)
- Log4J(6)
- pushlet(6)
- apt(6)
- read(6)
- Freemarker(6)
- Controller(5)
- swagger2(5)
- ldquo(5)
- Servlet(5)
- input(5)
- Config(5)
- discuz(5)
- Emlog(5)
- are(5)
- SVN(5)
- for(5)
- DOM(5)