通过mina框架来实现一个简单的地图实时位置共享,其实里面就相当于做一个简单的聊天室!客户端A,说我在这里,客户端B说我在那里,那么服务器就要存储这两个对象的会话,而两个对象,成为Session!每一个客户端添加进来,则创建一个Session标识,保持与服务器的长连接!
Apache Mina是一个能够帮助用户开发高性能和高伸缩性网络应用程序的框架。它通过Java nio技术基于TCP/IP和UDP/IP协议提供了抽象的、事件驱动的、异步的API。
把官网下下来的mina框架导入到idea里面,并创建一个Main类来启动mina!
<pre>
public class Main {
public static void main(String args[]) throws IOException {
NioSocketAcceptor acceptor = new NioSocketAcceptor();
acceptor.setHandler(new SocketHandler());
acceptor.getFilterChain().addLast("TextLineCodec",new ProtocolCodecFilter(new TextLineCodecFactory()));
acceptor.bind(new InetSocketAddress(8000));//绑定本地端口
}
}
</pre>
NioSocketAcceptor.setHandler(IoHandler handler);给我们提供了监听Socket数据的类!我们需要重写里面的监听方法,主要是重写messageReceived方法!而每有一个Sesson加入,则mina会创建一个IOsession对象,我们需要将其保存起来,然后将session的数据,传送给其它Session。而数据对象,则是客户端中需要的数据,即是,UserLocation类,而,我们需要重写SessionId数据,返回给客户端说,这个是哪个客户端发送出来的
<pre>
public String reformatData(String data, int sessionId) {
String marker = "@location";
if (data.startsWith(marker)){
UserLocation userLocation = gson.fromJson(data.replace(marker, ""), UserLocation.class);
userLocation.setSessionId(sessionId);
System.out.println(marker + gson.toJson(userLocation));
return marker + gson.toJson(userLocation);
}
return data;
}
</pre>
当服务器在接收到新Session加入的时候,需要将Session加入服务器数组里面,同样退出的时候需要将session从数组里面remove出去。
<pre>
public void sessionCreated(IoSession session) throws Exception {
System.out.println("System create");
sessions.add(session);
for (IoSession ioSession : sessions) {
if (ioSession != session) {
ioSession.write("@create session");
}
}
}
public void sessionClosed(IoSession session) throws Exception {
System.out.println("session closed");
if (sessions.contains(session)) {
sessions.remove(session);
}
}
</pre>
当服务器接受到客户端传来的消息,需要将数据分发到其它客户端去!
<pre>
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
String str = (String) message;
if (str.equals("@quit")) {
sessions.remove(session);
return;
}
for (IoSession ioSession : sessions) {
if (ioSession != session) {
str = reformatData(str, sessions.indexOf(session));
ioSession.write(str);
}
}
}
</pre>
其实相对于客户端,服务端的代码相对简单,因为基于apache mina,异步Socket处理代码都已经封装好,只需要将获取到的数据格式化后分发给其它客户端就可以了!