最近在学习服务器,而对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)
{
//创建ServerScoket
SocketAcceptor 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 :
客户端登陆
后记 :本来想上传图片的,可惜优快云 这个上传图片那叫一个慢啊。无奈了....如果有什么问题可以回复我。
173

被折叠的 条评论
为什么被折叠?



