深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
}
}
}
}
}
1.SimpleChatServerHandler 继承自 [IoHandlerAdapter](https://bbs.csdn.net/topics/618636735),这个类实现了 [IoHandler](https://bbs.csdn.net/topics/618636735) 接口,IoHandlerAdapter 提供了许多事件处理的接口方法,然后你可以覆盖这些方法。现在仅仅只需要继承 IoHandlerAdapter 类而不是你自己去实现接口方法。
2.`Set<IoSession> sessions` 用来存储所有的 连接上来的 session.
3.覆盖了 sessionCreated() 事件处理方法。每当从服务端收到新的客户端连接时,客户端的 IoSession 就存入存入 sessions 列表中,并通知列表中的其他客户端 IoSession
4.覆盖了 sessionClosed() 事件处理方法。每当从服务端收到客户端断开时,客户端的 IoSession 从 sessions 列表中,并通知列表中的其他客户端 IoSession
5.覆盖了 messageReceived() 事件处理方法。每当从服务端读到客户端写入信息时,将信息广播给其他客户端的 IoSession。
6.覆盖了 sessionIdle() 事件处理方法。服务端监听到客户端闲置情况
7.exceptionCaught() 事件处理方法是当出现 Throwable 对象才会被调用,即当 MINA 由于 IO 错误或者处理器在处理事件时抛出的异常时。在大部分情况下,捕获的异常应该被记录下来并且把关联的 IoSession 给关闭掉。然而这个方法的处理方式会在遇到不同异常的情况下有不同的实现,比如你可能想在关闭连接之前发送一个错误码的响应消息。
8.broadcast() 服务器用于广播的方法
#### SimpleChatServer.java
编写一个 main() 方法来启动服务端。
public class SimpleChatServer {
public static void main(String[] args) {
int port;
if (args.length > 0) {
port = Integer.parseInt(args[0]);
} else {
port = 8080;
}
SocketAcceptor acceptor = new NioSocketAcceptor(); // (1)
acceptor.getFilterChain().addLast( "codec",
new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" )))); // (2)
acceptor.setHandler(new SimpleChatServerHandler()); // (3)
acceptor.getSessionConfig().setReadBufferSize(2048); // (4)
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 100);// (5)
try {
acceptor.bind(new InetSocketAddress(port)); // (6)
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("[Server]Listening on port " + port);
}
}
1.[NioSocketAcceptor](https://bbs.csdn.net/topics/618636735) 基于 TCP/IP 的 socket 连接。
2.[ProtocolCodecFilter](https://bbs.csdn.net/topics/618636735) 是编码和解码的过滤器链,将一个连入的 ByteBuffer 转化为消息 POJO,反之亦然。而[TextLineCodecFactory](https://bbs.csdn.net/topics/618636735)是 MINA 提供的一个编解码是,可以方便处理基于文本的协议。
3.设置在处理器为之前创建的 SimpleChatServerHandler。
4.会话配置,设置字节缓存大小。
5.会话配置,设置闲置时间。
6.剩下的就是绑定端口然后启动服务。这里我们在机器上默认绑定了机器所有网卡上的 8080 端口。
恭喜!你已经完成了基于 MINA 聊天服务端程序。
### 客户端
#### SimpleChatClientHandler.java
客户端的处理类比较简单,只需要将读到的信息打印出来即可
public class SimpleChatClientHandler extends IoHandlerAdapter {
@Override
public void messageReceived(IoSession session, Object message) {
String str = message.toString();
System.out.println(str);
}
}
#### SimpleChatClient.java
编写一个 main() 方法来启动客户端。
public class SimpleChatClient {
private static final long CONNECT_TIMEOUT = 30 * 1000L; // 30 秒;
private static final String HOSTNAME = “127.0.0.1”;
private static final int PORT = 8080;
/**
* @param args
*/
public static void main(String[] args) {
NioSocketConnector connector = new NioSocketConnector(); // (1)
connector.setConnectTimeoutMillis(CONNECT_TIMEOUT);
connector.getFilterChain().addLast( "codec",
new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));
connector.setHandler(new SimpleChatClientHandler());
IoSession session;
ConnectFuture future = connector.connect(new InetSocketAddress(
HOSTNAME, PORT)); // (2)
future.awaitUninterruptibly();
session = future.getSession();
while(true){
try {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
session.write(in.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
1.[NioSocketConnector](https://bbs.csdn.net/topics/618636735) 用于 TCP/IP 连接
2.连接到指定的服务器
### 运行效果
先运行 SimpleChatServer,再可以运行多个 SimpleChatClient,控制台输入文本继续测试
![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=http%3A%2F%2F99btgc01.info%2Fuploads%2F2015%2F04%2Fs%25281%2529.jpg&pos_id=img-ej9kUU0Z-1715708095926)
![img](https://img-blog.csdnimg.cn/img_convert/836337442f4b39d4b8160e6a61ced125.png)
![img](https://img-blog.csdnimg.cn/img_convert/f8bb6bfed16d85a16d36d2020fefd266.png)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618636735)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618636735)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**