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

通过mina框架来实现一个简单的地图实时位置共享,其实里面就相当于做一个简单的聊天室!客户端A,说我在这里,客户端B说我在那里,那么服务器就要存储这两个对象的会话,而两个对象,成为Session!每一个客户端添加进来,则创建一个Session标识,保持与服务器的长连接!

Apache Mina是一个能够帮助用户开发高性能和高伸缩性网络应用程序的框架。它通过Java nio技术基于TCP/IP和UDP/IP协议提供了抽象的、事件驱动的、异步的API。

10716e9c1f6e?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

把官网下下来的mina框架导入到idea里面,并创建一个Main类来启动mina!

 
 

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));//绑定本地端口

}

}

NioSocketAcceptor.setHandler(IoHandler handler);给我们提供了监听Socket数据的类!我们需要重写里面的监听方法,主要是重写messageReceived方法!而每有一个Sesson加入,则mina会创建一个IOsession对象,我们需要将其保存起来,然后将session的数据,传送给其它Session。而数据对象,则是客户端中需要的数据,即是,UserLocation类,而,我们需要重写SessionId数据,返回给客户端说,这个是哪个客户端发送出来的

 
 

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;

}

当服务器在接收到新Session加入的时候,需要将Session加入服务器数组里面,同样退出的时候需要将session从数组里面remove出去。

 
 

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);

}

}

当服务器接受到客户端传来的消息,需要将数据分发到其它客户端去!

 
 

@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);

}

}

}

其实相对于客户端,服务端的代码相对简单,因为基于apache mina,异步Socket处理代码都已经封装好,只需要将获取到的数据格式化后分发给其它客户端就可以了!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值