提示: 因为工程稍微有点大对我个人来说,所以可能在某些方面讲的不清楚或逻辑性不够强,如果有问题请及时@我。
之前把概要设计说了一下。现在就进入详细设计与实现了。这篇先说服务器的。服务器就是处理客户端发来的各种请求的,比如注册、找回密码、添加好友等等。当然这些请求都是自己按实际需要认为设计的。
先将服务器的整体构架,由于用的是集成好的框架mina,所以不需要自己去考虑太多具体细节,如异步处理,如何实现高并发。如果用传统的socket当然也可以实现,但是高并发的要求很难达到。之前已经发了一篇关于mina的,就是这个服务器的雏形。使用mina ,如果只是简单的发送字符串消息,就不用自己重写编码解码器,它本身有一个TextLineCodeFactory。 这里要实现发送多媒体消息,还要加密会话,所以必须要自己编写编解码器。
其中最主要的便是com.imomo_server 。这里面负责的便是所有与客户端的交互(包括各种业务逻辑)。
public class iMomoServer {
public static void main(String[] args) {
NioSocketAcceptor acceptor = new NioSocketAcceptor();
acceptor.getFilterChain().addLast(“codec”,
new ProtocolCodecFilter(new iMoMoCodecFactory()));
acceptor.setHandler(new iMomoServerHandler());
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 60);//一分钟为通话,进入空闲状态
try {
acceptor.bind(new InetSocketAddress(StaticValues.SERVER_PORT));
} catch (IOException e) {
e.printStackTrace();
}
}
}
这个就是开启端口监听服务的类,就这么多(再一次体现了mina的强大)。然后在一个就是处理业务逻辑的类。
public class MinaServerHandler extends IoHandlerAdapter{
@Override
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception {
super.exceptionCaught(session, cause);
cause.printStackTrace();
}
@Override
public void inputClosed(IoSession session) throws Exception {
super.inputClosed(session);
System.out.println("inputClosed");
}
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
SmsObject sms = (SmsObject) message;
System.out.println(sms.toString());
}
@Override
public void messageSent(IoSession session, Object message) throws Exception {
System.out.println("messageSent");
}
@Override
public void sessionClosed(IoSession session) throws Exception {
System.out.println("sessionClosed"+session.getRemoteAddress()+":is Closed");
}
@Override
public void sessionCreated(IoSession session) throws Exception {
System.out.println("sessionCreated");
}
@Override
public void sessionIdle(IoSession session, IdleStatus status)
throws Exception {
System.out.println("sessionIdle");
}
@Override
public void sessionOpened(IoSession session) throws Exception {
System.out.println("open:::"+session.getAttribute(session.getId()));;
}
}
在messageReceived方法中接收客户端发送的消息,然后进行相应的处理即可。
?com.database 和数据库操作相关的包,在用户注册、修改个人信息、获得好友列表、发送离线消息时会用到。
?com.imomo_codecfactory 就是上面一提到的编解码器包
?com.imomo_msg 这个包包含服务器和客户端传递的消息类,和一些Java bean。
?com.managers 会话管理, 包括用户长连接的会话session、用户位置记录、群组记录
?com.security 安全处理 PBE对称加密
?com.server_utils 一些工具类 包括两个用户的距离计算、和文件相关的处理、发送邮件、静态变量
原文地址:http://blog.csdn.net/u011102153/article/details/46506739