美文网首页Android/Java学习日记Android知识Android开发
基于腾讯地图的实时位置共享-服务端

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

作者: MarcoHorse | 来源:发表于2016-08-11 18:11 被阅读891次

    通过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

    相关文章

      网友评论

        本文标题:基于腾讯地图的实时位置共享-服务端

        本文链接:https://www.haomeiwen.com/subject/hadssttx.html