提示: 由于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. 为什么要使用href=”javascript:void(0);”?

    JavaScript中语句最后的分号是可以缺省的,那为何要使用javascript:;而不是javascript:呢? 是习惯还是规范,我疑惑了! 具有代码洁癖的coder们,没事多写一个分号,圣洁的 ...

  2. C#.NET常见问题(FAQ)-如何把函数名作为参数传递给另一个函数

    在主窗体中使用的还是普通的函数,但是test函数有一个新的参数,就是method   这个method所指向的就是前面委托定义的method     更多教学视频和资料下载,欢迎关注以下信息: 我的优 ...

  3. Session 共享(Custom模式)By Memcached(原创)

    1.web.config配置: <machineKey decryptionKey="FD69B2EB9A11E3063518F1932E314E4AA1577BF0B824F369& ...

  4. Android 之开发积累

    1.后台设置ImageView的src属性 有三种方式:img = (ImageView)this.findViewById(R.id.img_result_analyze); [1]setImage ...

  5. TCP协议为什么会采用三次握手,若采用二次握手可以吗?

     TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的.可靠的.基于IP的传输层协议,采用三次握手确认建立一个连接. TCP为了保证报文传输的 ...

  6. MySQL 联合索引测试2

    接上一篇文章: http://www.cnblogs.com/xiaoit/p/4430300.html 1:首先删掉上一篇建立的索引,重新建立一个. mysql> DROP INDEX idx ...

  7. cocos2d-x项目101次相遇-安装和环境搭建 -xcode

    cocos2d-x 101次相遇 / 文件夹  1   安装和环境搭建 -xcode  2   Scenes . Director, Layers, Sprites 3   建立图片菜单  4   在 ...

  8. 实现锁死的有滚动条的div的表格(datagird)

    JS框架使用Jquery 最终效果: 代码结构: 代码: <HEAD><TITLE>new document</TITLE> <META name=Gener ...

  9. 如何监控tomcat性能

    如何监控tomcat性能:[1]工具一 | 浏览:155 | 更新:2014-12-13 10:06 1 2 3 4 5 6 分步阅读 tomcat经常被用作中间件,也有直接作WEB的,自带的工具不是 ...

  10. Swift调用OC和C

    Swift文件:main.swift import Foundation //Swift调用C函数 desc1() //Swift调用OC //拿到OC类 var funcClass = Root() ...