基于腾讯地图的实时位置共享-服务端

通过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处理代码都已经封装好,只需要将获取到的数据格式化后分发给其它客户端就可以了!

Git仓库:https://github.com/Mark911105/learnmina.git

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • http协议有http0.9,http1.0,http1.1和http2三个版本,但是现在浏览器使用的是htt...
    一现_阅读 1,900评论 0 3
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,376评论 11 349
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,010评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,780评论 18 399
  • 我行过许多地方的桥,看过许多次的云,喝过许多种类的酒,却只爱过一个正当最好年龄的人
    青春的影子0717阅读 195评论 0 1