基于騰訊地圖的實(shí)時(shí)位置共享-服務(wù)端

通過mina框架來實(shí)現(xiàn)一個(gè)簡單的地圖實(shí)時(shí)位置共享,其實(shí)里面就相當(dāng)于做一個(gè)簡單的聊天室!客戶端A,說我在這里,客戶端B說我在那里,那么服務(wù)器就要存儲(chǔ)這兩個(gè)對(duì)象的會(huì)話,而兩個(gè)對(duì)象,成為Session!每一個(gè)客戶端添加進(jìn)來,則創(chuàng)建一個(gè)Session標(biāo)識(shí),保持與服務(wù)器的長連接!

Apache Mina是一個(gè)能夠幫助用戶開發(fā)高性能和高伸縮性網(wǎng)絡(luò)應(yīng)用程序的框架。它通過Java nio技術(shù)基于TCP/IP和UDP/IP協(xié)議提供了抽象的、事件驅(qū)動(dòng)的、異步的API。

把官網(wǎng)下下來的mina框架導(dǎo)入到idea里面,并創(chuàng)建一個(gè)Main類來啟動(dòng)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);給我們提供了監(jiān)聽Socket數(shù)據(jù)的類!我們需要重寫里面的監(jiān)聽方法,主要是重寫messageReceived方法!而每有一個(gè)Sesson加入,則mina會(huì)創(chuàng)建一個(gè)IOsession對(duì)象,我們需要將其保存起來,然后將session的數(shù)據(jù),傳送給其它Session。而數(shù)據(jù)對(duì)象,則是客戶端中需要的數(shù)據(jù),即是,UserLocation類,而,我們需要重寫SessionId數(shù)據(jù),返回給客戶端說,這個(gè)是哪個(gè)客戶端發(fā)送出來的
<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>

當(dāng)服務(wù)器在接收到新Session加入的時(shí)候,需要將Session加入服務(wù)器數(shù)組里面,同樣退出的時(shí)候需要將session從數(shù)組里面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>

當(dāng)服務(wù)器接受到客戶端傳來的消息,需要將數(shù)據(jù)分發(fā)到其它客戶端去!
<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>

其實(shí)相對(duì)于客戶端,服務(wù)端的代碼相對(duì)簡單,因?yàn)榛赼pache mina,異步Socket處理代碼都已經(jīng)封裝好,只需要將獲取到的數(shù)據(jù)格式化后分發(fā)給其它客戶端就可以了!

Git倉庫:https://github.com/Mark911105/learnmina.git

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • http協(xié)議有http0.9,http1.0,http1.1和http2三個(gè)版本,但是現(xiàn)在瀏覽器使用的是htt...
    一現(xiàn)_閱讀 1,896評(píng)論 0 3
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,366評(píng)論 11 349
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,923評(píng)論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,765評(píng)論 18 399
  • 我行過許多地方的橋,看過許多次的云,喝過許多種類的酒,卻只愛過一個(gè)正當(dāng)最好年齡的人
    青春的影子0717閱讀 195評(píng)論 0 1