Mina 环境搭建
最近在学习服务器,而对JAVA又比较熟悉的我就开始了学习服务器了。可能很多人会说还是用c++吧,不错现在很多大型游戏公司都是用C++的。这里我不得不说我的C++ 真的很一般了。所以这里先学java吧,其实语言也在学习的时候没必要太纠结了!废话太多了,开始入正题了。
本节目录
1 :有用网站
2 :准备资源
3 :环境搭建
4 :Demo测试
首先说一下为什么我这里要选择Mina ,1:Mina是开源的(我一般都会选择开源的框架的)
2:Apache 用了很多他的框架,一般来说还是很稳定的。 所以我选择了Mina 。横向比较现在用的比较多的还有netty ,XSocket 等等。
Mina 的作用: 它是封装了JavaNIO(如果对JavaNIO不了解的可以再网上找一些资料来看一下,如果这个都没弄明白的话后面就很难继续了,所以建议先打好基础)
的一个开源框架,更利于我们开发java 服务器。
1 :有用网站
. 官方网站http://mina.apache.org/
2 :准备资源
. 搭建Mina 环境必备的资源有 : mina-core-2.0.7.jar , slf4j-api.jar , log4j.jar , slf4j-simple.jar (分别去官网下载吧,版本号这里可能不同以最新的为准,如果实在不知道下载的可以私聊我给你)
3 :环境搭建
. java 环境
学习java 的都应该清楚的,JDK 下载 ; 环境变量配置 ; Eclipse 下载
. Mina 环境
以外部包的方式导入上面准备的4个资源(右键项目:build path / configuare build path / add external jars ) 导入后如下结构图,表明我们的环境搭建好了。
- Referenced Libraries
-mina-core-2.0.7.jar
- slf4j-api.jar
- log4j.jar
- slf4j-simple.jar
4 :Demo测试
Server 端
. 创建Server
public class MinaServer {public static void main(String[] args){//创建ServerScoketSocketAcceptor acceptor = new NioSocketAcceptor();//设置传输方式(这里设置成对象传输模式,还有很多的类型后面会具体讲到DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();ProtocolCodecFilter filter = new ProtocolCodecFilter(new ObjectSerializationCodecFactory());chain.addLast("objectFilter", filter);// 添加消息处理acceptor.setHandler(new MinaServerHanlder());// 开启服务器 int bindPort = 9988;try { acceptor.bind(new InetSocketAddress(bindPort));} catch (IOException e) { e.printStackTrace(); }}}
. 创建消息处理类
import org.apache.mina.core.service.IoHandlerAdapter;import org.apache.mina.core.session.IdleStatus;import org.apache.mina.core.session.IoSession;
public class MinaServerHanlder extends IoHandlerAdapter { private int count = 0;
// 由底层决定是否创建一个session public void sessionCreated(IoSession session) { System.out.println("新客户连接"); }
// 创建了session 后会回调sessionOpened public void sessionOpened(IoSession session) throws Exception { count++; System.out.println("第 " + count + " 个 client 登陆!address: : " + session.getRemoteAddress()); }
// 当收到了客户端发送的消息后会回调这个函数 public void messageReceived(IoSession session, Object message) throws Exception { System.out.println("服务器收到客户端发送指令 :" + message);
}
// 发送成功后会回调的方法 public void messageSent(IoSession session, Object message) { System.out.println("message send to client"); }
// session 关闭调用 public void sessionClosed(IoSession session) { System.out.println("one client disconnect"); }
// session 空闲的时候调用 public void sessionIdle(IoSession session, IdleStatus status) { System.out.println("connect idle"); }
// 异常捕捉 public void exceptionCaught(IoSession session, Throwable cause) { System.out.println("throws exception"); }}
Client 端
Client 端的创建方式和服务器类似的
创建客户端
import java.net.InetSocketAddress;import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;import org.apache.mina.core.future.ConnectFuture;import org.apache.mina.filter.codec.ProtocolCodecFilter;import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;import org.apache.mina.transport.socket.nio.NioSocketConnector;public class MinaClient {public static void main(String[] args) {// TODO Auto-generated method stub // 创建Socket NioSocketConnector connector = new NioSocketConnector(); //设置传输方式 DefaultIoFilterChainBuilder chain = connector.getFilterChain(); ProtocolCodecFilter filter = new ProtocolCodecFilter(new ObjectSerializationCodecFactory()); chain.addLast("objectFilter", filter); //设置消息处理 connector.setHandler(new MinaClientHanlder()); //超时设置 connector.setConnectTimeoutCheckInterval(30); //连接 ConnectFuture cf = connector.connect(new InetSocketAddress("localhost", 9988)); cf.awaitUninterruptibly(); cf.getSession().getCloseFuture().awaitUninterruptibly(); connector.dispose(); }}
创建客户端消息处理
import org.apache.mina.core.service.IoHandlerAdapter;import org.apache.mina.core.session.IoSession;
public class MinaClientHanlder extends IoHandlerAdapter { public void sessionOpened(IoSession session) throws Exception { System.out.println("客户端登陆"); session.write("hello world"); } public void sessionClosed(IoSession session) { System.out.println("client close"); } public void messageReceived(IoSession session , Object message)throws Exception { System.out.println("客户端接受到了消息") ; }}
运行结果
server :
新客户连接
第 1 个 client 登陆!address: : /127.0.0.1:55497
服务器收到客户端发送指令 :hello world
client :
客户端登陆
后记 :本来想上传图片的,可惜CSDN 这个上传图片那叫一个慢啊。无奈了....如果有什么问题可以回复我。
- 2楼pdw_jspㄥぉ 20:47
- CSDN 涓唬涓轰涔f 锛ソ跺杩灏辨剧涓㈠
- 1楼fire_workㄥぉ 17:26
- 椤朵涓?,"ParentId