提示: 由于project略微有点大对我个人来说。所以可能在某些方面讲的不清楚或逻辑性不够强,假设有问题请@我。

原project:https://github.com/LineChen/

六、用户位置管理

client的操作是摇一摇发送自己的位置吧并在地图上显示周围一公里用户的名称(client定位服务用的是百度地图),为了保持位置的时效性,

控制每五分钟发送一次用户的位置。server端要保存每一个开启位置服务的用户的位置,考虑到用户量可能会非常大,

不可能把全部的用户保存在一个哈希表中,所以分省份来分组保存,实际处理中可能须要分市来保存。

/**

* 用户位置类

*

* @author Administrator

*

*/

public class myLocationBean {

// 省份、经纬度

public String province;

public double longitude;

public double latitude;

@Override

public String toString() {

return "myLocationBean [province=" + province + ", longitude="

+ longitude + ", latitude=" + latitude + "]";

}

}

package com.managers;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import com.imomo_msg.myLocationBean;

/**

* 按省来管理用户位置

*

* @author Administrator

*

*/

public class ManageLocMap {

public static Map<String, ManageAProvinceLoc> map = new HashMap<String, ManageAProvinceLoc>();

/**

* 得到一个省的位置管理类

*

* @param province

* @return

*/

public static ManageAProvinceLoc getAProvinceLoc(String province) {

if (isContainsProvince(province)) {

// System.out.println("get省:" + province);

return (ManageAProvinceLoc) map.get(province);

}

return null;

}

/**

* 加入一个省位置管理类

*

* @param province

* @param AProvinceLoc

*/

public static void addAProvinceLoc(String province,

ManageAProvinceLoc AProvinceLoc) {

// System.out.println("加入省:--" + province);

map.put(province, AProvinceLoc);

}

/**

* 删除一个省的位置管理类

*

* @param province

*/

public static void deleteAProvinceLoc(String province) {

// System.out.println("删除省:--" + province);

map.remove(province);

}

/**

* 推断是否存在一个省位置管理类

*

* @param province

* @return

*/

public static boolean isContainsProvince(String province) {

return map.containsKey(province);

}

/**

* 用户下线,即时删掉位置信息

* @param userId

*/

public static void deleteOneUser(String userId){

Iterator<ManageAProvinceLoc> iterator = (Iterator<ManageAProvinceLoc>) map.values().iterator();

while(iterator.hasNext()){

ManageAProvinceLoc aProvinceLoc = iterator.next();

if(aProvinceLoc.isContainsId(userId)){

aProvinceLoc.deleteLocation(userId);

if(aProvinceLoc.getCount() == 0){

deleteAProvinceLoc(aProvinceLoc.province);

}

}

}

}

}

七、得到附近的人

当用户请求得到附近的人时。会发送自己的地理位置。然后server会依据省份得到该省开启服务的全部用户。进行距离计算,返回须要的用户信息。

依据经纬度计算距离:

package com.server_utils;

/**

* 依据一对经纬度得到两点距离

* @author Administrator

*

*/

public class DistanceUtil {

public static void main(String[] args) {

double dis = getDistance(120.133356, 36.013802, 120.133525, 36.013665);

System.out.println("两点距离 = " + dis);

}

/**

*

* @param long1

*            经度1

* @param lat1

*            纬度1

* @param long2

*            经度2

* @param lat2

*            纬度2

* @return 单位公里

*/

public static double getDistance(double long1, double lat1, double long2,

double lat2) {

double a, b, R;

R = 6378137; // 地球半径(米)

lat1 = lat1 * Math.PI / 180.0;

lat2 = lat2 * Math.PI / 180.0;

a = lat1 - lat2;

b = (long1 - long2) * Math.PI / 180.0;

double d;

double sa2, sb2;

sa2 = Math.sin(a / 2.0);

sb2 = Math.sin(b / 2.0);

d = 2

* R

* Math.asin(Math.sqrt(sa2 * sa2 + Math.cos(lat1)

* Math.cos(lat2) * sb2 * sb2));

return d/1000;

}

}

得到附近的人列表:

/**

* 得到指定距离内的陌生人相关信息

* @param isOnekm 是否是周围一公里

* @param userId

* @param range

* @return

*/

public List<StrangerBean> getDisStrangers(boolean isOnekm, String userId, int range) {

int NUM = 0;

int MAX = 100;

List<StrangerBean> list = new ArrayList<StrangerBean>();

////測试用....

//StrangerBean bean1 = new StrangerBean();

//bean1.strangerId = "9090";

//bean1.strangerName = "妖姬";

//bean1.Longitude = 120.143350;

//bean1.Latitude = 36.015562;

//bean1.strangerLoc = 1 + "公里以内";

//list.add(bean1);

//bean1 = new StrangerBean();

//bean1.strangerId = "9091";

//bean1.strangerName = "女神";

//bean1.Longitude = 120.133340;

//bean1.Latitude = 36.013557;

//bean1.strangerLoc = 1 + "公里以内";

//list.add(bean1);

myLocationBean loc1 = this.getLocation(userId);

Iterator<String> iter = locationMap.keySet().iterator();

while (iter.hasNext()) {

String strangerId = iter.next();

if (!strangerId.equals(userId)) {

myLocationBean loc2 = this.getLocation(strangerId);

double dist = DistanceUtil

.getDistance(loc1.longitude, loc1.latitude, loc2.longitude, loc2.latitude);

SqlModel model = new SqlModel();

if(isOnekm){

if(dist > 0 && dist <= 1){

StrangerBean bean = new StrangerBean();

bean.strangerId = strangerId;

bean.strangerName = model.getUserName(strangerId, false);

bean.Longitude = loc2.longitude;

bean.Latitude = loc2.latitude;

bean.strangerLoc = 1 + "公里以内";

list.add(bean);

NUM ++;

if(NUM == MAX){

break;

}

}

} else {

if(dist > range - 1 && dist <= range){

StrangerBean bean = new StrangerBean();

bean.strangerId = strangerId;

bean.strangerName = model.getUserName(strangerId, false);

bean.Longitude = loc2.longitude;

bean.Latitude = loc2.latitude;

bean.strangerLoc = range + "公里以内";

list.add(bean);

if(NUM == MAX){

break;

}

}

}

}

}

return list;

}

聊天server-解密陌生人(10)位置管理和获取周围一公里陌生人的更多相关文章

  1. 【iOS】7.4 定位服务->2.1.2 定位 - 官方框架CoreLocation: CLLocationManager(位置管理器)

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  2. 第17周翻译:SQL Server中的事务日志管理的阶梯:第5级:在完全恢复模式下管理日志

    来源:http://www.sqlservercentral.com/articles/Stairway+Series/73785/ 作者:Tony Davis, 2012/01/27 翻译:刘琼滨. ...

  3. 第16周翻译:SQL Server中的事务日志管理,级别3:事务日志、备份和恢复

    源自: http://www.sqlservercentral.com/articles/Stairway+Series/73779/ 作者: Tony Davis, 2011/09/07 翻译:刘琼 ...

  4. SQL Server中的事务日志管理的阶梯,级别1:事务日志概述

    SQL Server中的事务日志管理的阶梯,级别1:事务日志概述 翻译:刘琼滨 谢雪妮 许雅莉 赖慧芳 级别1:事务日志概述 事务日志是一个文件,其中SQL服务器存储了所有与日志文件关联的数据库执行的 ...

  5. 使用CLRMD时通过Symbol Server找Dac的位置来初始化ClrRuntime

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:使用CLRMD时通过Symbol Server找Dac的位置来初始化ClrRuntime.

  6. Chapter 1 Securing Your Server and Network(10):使用扩展保护避免授权中继攻击

    原文:Chapter 1 Securing Your Server and Network(10):使用扩展保护避免授权中继攻击 原文出处:http://blog.csdn.net/dba_huang ...

  7. Windows Server 2008 安装 10.2.0.5 单实例

    需求:Windows Server 2008 安装 10.2.0.5 单实例 原以为非常简单的一次任务,实际却遇到了问题,故记录一下. 1.安装10.2.0.1 2.安装10.2.0.4 3.安装10 ...

  8. [转]SQL Server 2008 如何配置报表管理器

    本文转自:https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2008/cc281384%28v%3dsql.100%2 ...

  9. Alaya Webdav Server 0.0.10 发布

    Alaya Webdav Server 0.0.10 修复了很多 bug,Webdav 'Copy' 可以使用了. Alaya 是一个提供 WebDAV 支持的 Web 服务器,支持 HTTPS 和 ...

随机推荐

  1. 从头认识java-特辑-你不知道的main函数

    这一章节我们来讨论一下main函数. 对于这个函数大家都不陌生,并且都习以为常.可是当中有一些东西,还是值得我们去总结的. 1.普通的main package com.ray.test; public ...

  2. Win7没有防火墙:0x80070422

    在"MSDN我告诉你"下载的官方原版Window7 64位,安装后防火墙是这样的: 点击"使用推荐设置",报错:0x80070422,估计是因为使用PE中的工具 ...

  3. Struts2远程代码执行漏洞预警

    近期struts2 框架再现高危远程命令执行漏洞,漏洞编号S2-045,CVE编号CVE-2017-5638.利用此漏洞可对使用了struts2框架的网站进行远程命令执行,对服务器造成威胁.请相关单位 ...

  4. ZH奶酪:PHP如何判断提交表单中多个复选框是否选中?

    1.name命名为数组,例如“select[]” 2.例如这样选: 3.在后台使用$_POST['select']得到数组 4.然后就可以看到得到的数组了 原文链接:http://www.zhihu. ...

  5. 高可用性(HA) 4 - network bonding

    我们都知道,hadoop namenode是一个臭名昭著的单点故障点(SPOF). 当你找到一篇High  Availability的文章, 以为使用heartbeat/pacemaker, coro ...

  6. interllij13新建maven web工程

    1. 打开intellij,左边的可以别管它(历史) ②选择create new project(新建一个项目),选择Maven,并选择一个web模板,然后next. 3. 给自己的项目取名,grou ...

  7. 算法笔记_177:历届试题 城市建设(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 栋栋居住在一个繁华的C市中,然而,这个城市的道路大都年久失修.市长准备重新修一些路以方便市民,于是找到了栋栋,希望栋栋能帮助他. C市中有 ...

  8. yum安装MangoDB

    1:操作系统信息 2:yum命令查看MongoDB的包信息 3:配置yum源 #vi /etc/yum.repos.d/10gen.repo 4:查看mongoDB的服务器包的信息 5:安装Mongo ...

  9. eclipse手动指定启动的jdk版本

    在eclipse.ini中添加 -vm D:/wwjDocument/JDK6/jre/bin/client/jvm.dll -vmargs -Dosgi.requiredJavaVersion=1. ...

  10. DB2的认证和授权

    DB2 的安全性由两方面组成:认证和授权 1.认证 认证就是系统验证用户身份的过程.说的简单点,就是验证用户名和密码,因为DB2用户同时也是操作系统用户,所以,首先必须得到操作系统的认可.在默认情况下 ...