移动开发中的通信架构(三)

移动通信技术 基本概念:通信双方有一方或两方处于运动中的通信。特点:1)有线、无线通信相结合。2)传播条件恶劣,存在严重的多径衰落。3)强干扰条件下工作。4)多普勒效应。5)阴影效应。6)采用跟踪交换技术。发展历程通用分组无线业务(general packet radio service)利用GSM基础设施提供速率高达100kbit/s分组数据业务的移动蜂窝接入技术。2G(GSM)向3G的过渡技术。分组业务效率高。MS(Mobile Station)是移动通信系统中的移动用户设备。 阅读详情

        前面两篇文章讲述了框架的大体情况和请求的封装,这篇文章讲述请求的发送。在本框架中,请求生成以后,并不是马上发送,而是加入一个请求列表。然后有一个线程来维护这个请求列表。

        下面来具体分析,从移动开发中的通信架构(二)的第一段代码中取出:

sendRequest(request);

sendRequest方法由HttpHandler类提供,下面是HttpHandler的源代码:

package app.http;

import java.util.Vector;

/**
 * 
 *在调用sendRequest方法的时候,其实并没有发生真正的网络请求,仅仅是把Request对象加入到了请求列表vctRequests中
 *
 *在以后的设计中,注意vctRequests要保持线程安全的特性,因为UI和网络线程都会不停的调用它
 *
 */

/**
 * 功能:
 * 
 * 联系    整个程序的控制类    和    真正的网络类,其实也就是网络模块中的控制类
 * 
 * 维护一个列表,从程序中接受Request,然后把Request转发给HttpClient
 */
public class HttpHandler implements Timeable, Runnable {

	private boolean isRunning = false;
	// Http client
	private HttpClient httpClient = null;
	// 超时时间
	private int timeout;
	// 重新连接次数
	private int retries;
	// HttpListener
	private HttpListener httpListener = null;
	// Http监视器
	private HttpMonitor monitor = null;

	// 等待发送的缓冲请求信息
	private Vector vctRequests = new Vector();

	private int state = STATE_REST;
	private final static int STATE_REST = 0;
	private final static int STATE_CANCEL = 1;
	private final static int STATE_ACTIVE = 2;

	public HttpHandler(HttpListener httpListener, int _msgId) {
		this(HttpConstants.DEFAULT_OVERTIME, HttpConstants.DEFAULT_RETRIES, httpListener, _msgId);
	}

	public HttpHandler(int timeout, int retries, HttpListener httpListener, int _msgId) {
		this.retries = retries;
		this.timeout = timeout;
		this.httpListener = httpListener;
		this.isRunning = true;
		httpClient = new HttpClient(_msgId);

		Thread t = new Thread(this);
		t.start();

	}

	/**
	 * 设置监听器 (多用于屏幕切换后更改监听器用)
	 * 
	 * @param httpListener
	 */
	public void setHttpListener(HttpListener httpListener) {
		this.httpListener = httpListener;
	}

	public void run() {
		while (isRunning) {
			try {
				if (vctRequests.size() > 0) {
					Request request = null;
					synchronized (vctRequests) {
						if (vctRequests.size() > 0) {
							request = (Request) vctRequests.elementAt(0);
							vctRequests.removeElementAt(0);
						}
					}

					Response resp = getResponse(request);

					// 数据到达
					if (resp != null) {
						if (httpListener != null) {
							httpListener.completed(resp);
						}
						resp = null;
					}
				}
				Thread.sleep(200);
			} catch (Exception ex) {

			}
		}
	}

	private void handleException(Exception ex) {
		if (httpListener != null && state == STATE_ACTIVE) {
			try {
				httpListener.exception(ex, this);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * Provides an interrupt to the initiated request. This method is typically
	 */
	public void timeout() {

		// 数据接收超时
		cleanup();

		handleException(new Exception("网络连接超时..."));
	}

	/**
	 * 发送Request
	 * 
	 * @param request
	 */
	public void sendRequest(Request request) {
		if (request == null) {
			return;
		}

		synchronized (vctRequests) {
			vctRequests.addElement(request);
		}
	}

	/**
	 * 接收数据
	 * 
	 * @return
	 */
	public Response getResponse(Request request) {
		Response resp = null;

		int thisTry = 1;
		while (thisTry <= retries) {
			try {
				startTimer();
				state = STATE_ACTIVE;
				httpListener.netSatus("正在进行网络连接...");
				/**
				 * 核心语句
				 */
				resp = httpClient.getResponse(request);

				stopTimer();
				state = STATE_REST;
				break;
			} catch (Exception e) {
				e.printStackTrace();
				stopTimer();
				if (state == STATE_CANCEL) {
					state = STATE_REST;
					break;
				} else if (thisTry >= retries) {
					cleanup();
					handleException(new Exception("网络连接失败..."));
				}
				state = STATE_REST;
			} finally {
				thisTry++;
			}
		}

		return resp;
	}

	/**
	 * 关闭连接,释放相关资源
	 */
	private void cleanup() {
		try {
			// 关闭监视器
			this.cancelTimer();
			monitor = null;

			// 回收http资源
			httpClient.cleanup();

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 获取当前发送信息的条数
	 * 
	 * @return int
	 */
	public int getVctRequests() {
		synchronized (vctRequests) {
			return vctRequests.size();
		}
	}

	/**
	 * 中断线程
	 */
	public void stop() {
		// 请空缓存请求数据
		synchronized (vctRequests) {
			vctRequests.removeAllElements();
		}

		httpListener = null;
		cleanup();

		// 中断数据接收监听
		isRunning = false;
		httpClient = null;

	}

	public void cancelAccess() {
		if (state == STATE_ACTIVE) {
			state = STATE_CANCEL;
			cleanup();
		}
	}

	public void startTimer() {
		if (timeout > 0) {
			monitor = getRequestTimer();
			monitor.startTimer();
		}
	}

	private HttpMonitor getRequestTimer() {
		if (monitor == null) {
			monitor = new HttpMonitor(this, timeout);
			monitor.start();
		}
		return monitor;
	}

	/**
	 * Issues a stopTimer() call to the <code>SocketMonitor</code>.
	 * 
	 * @see java.io.InputStream
	 */
	public void stopTimer() {
		if (timeout > 0 && monitor != null) {
			monitor.stopTimer();
		}
	}

	/**
	 * Issues a cancelTimer() call to the <code>SocketMonitor</code>.
	 */
	public void cancelTimer() {
		if (timeout > 0) {
			if (monitor != null) {
				monitor.cancelTimer();
			}
		}
	}

	public void pauseTimer() {
		if (monitor != null) {
			monitor.pauseMonitor();
		}
	}

	public void resumeTimer() {
		if (monitor != null) {
			monitor.resumeMonitor();
		}
	}

}


请读者自行关注里面的重要方法,本人只是罗列一下:

public void run();

public void sendRequest(Request request);

public Response getResponse(Request request);

从程序代码中可以看到,HttpHandler是整个通信框架的耦合点:

1.它借助于下一篇讲述的Httpclient来实现请求的发送。

2.它借助于Timeable和HttpMonitor实现超时的控制。

3.它借助于HttpListener完成和UI线程的沟通。

 

下面罗列Timeable和HttpMonitor的源代码,超时的控制比较简单,我就不详细讲述。

package app.http;

/**
 * 计时器辅助接口
 */
public interface Timeable {

	public void timeout();

	public void startTimer();

	public void stopTimer();

	public void cancelTimer();
}


 

 

package app.http;

/**
 *计时器类,主要用于监控http连接是否超时
 */
public class HttpMonitor extends Thread {
	// 超时时间(毫秒)
	private long timeout;
	private Timeable timeable;
	private long startTime;
	private boolean active = false;
	private boolean timing = false;
	private boolean bPaused = false;

	public HttpMonitor(Timeable t, int timeout) {
		this.timeout = timeout * 1000;
		timeable = t;
		timing = false;
	}

	public void pauseMonitor() {
		bPaused = true;
	}

	public void resumeMonitor() {
		startTime = System.currentTimeMillis();
		bPaused = false;
	}

	public void run() {
		active = true;
		while (active) {
			if (timing) {
				long tmp = System.currentTimeMillis() - startTime;
				if (!bPaused && (tmp) > timeout) {
					timeable.timeout();
					stopTimer();
				} else {
					try {
						sleep(HttpConstants.MONITOR_INTERVAL);
					} catch (InterruptedException ie) {
						active = false;
					}
				}
			} else {
				try {
					Thread.sleep(100);
				} catch (Exception e) {
					e.printStackTrace();
					active = false;
				}
			}
		}
	}

	public void startTimer() {
		if (!timing) {
			startTime = System.currentTimeMillis();
			timing = true;
		}
	}

	public void setTimeout() {
		try {
			stopTimer();
			timeable.timeout();
		} catch (Exception ex) {
		}
	}

	public void stopTimer() {
		timing = false;
	}

	public void cancelTimer() {
		active = false;
		timing = false;
		synchronized (this) {
			notifyAll();
		}
	}

	public long getTimeout() {
		return timeout / 1000;
	}
}


 

ps:有任何疑问可以留言,回复可能不及时,但是有意义的疑问一定回复。

ps:记得看到好文章好顶……

《移动通信》——知识点总结 1G是主要技术: 模拟通信的时代,FDMA 2G核心技术: GSM:全球移动通信系统(Global System for Mobile) TDMA(欧洲)和CDMA(北美)Communications) 3G核心技术:CDMA UMTS:通用移动通信系统Universal Mobile Telecommunications System CDMA2000电信,美国 WCDMA联通,欧洲 TD-SCDMA移动(移动没有3G),国内4G核心技术:OFDMA(正交频分多址)和MIMO(多进多出) LTE系统(Lo 阅读详情

相关推荐

移动通信网络演进之路

目录 文章目录目录通信网络核心网演进之路早古时期2G 网络架构3G 网络架构4G 网络架构5G 网络架构 通信网络 电信网(即电话交换网络)由终端、传输和交换三大部分组成; 因特网(即计算机互联网)由终端、传输、交换以及多个计算机网络等几部分组成。 随着通信行业的快速发展,传统的电信网、计算机互联网与有线电视网的融合(三网融合)已经成为网络发展的趋势。三者融合发展,互联互通,为客户同时提供语音...

烟云的计算 1万+

做完第一个android项目,在android知识点上增加的经验值

第一:FrameLayout的妙用,框架布局是最简单和最高效的布局类型之一。框架布局的子控件被相对于布局的左上角来绘制。如果框架布局中存在多个子视图,它们将按顺序绘制,最后一个子控件绘制在最上面。 示例:。 第二:以前做J2ME平台,为了实现跑马灯效果,实现方式是在UI线程(绘图线程)不停的刷新,通过改变坐标来达到动画效果。那时候看到Android上各种炫目的动画,简直吓尿了,后来做了An

冯小卫 1724

MVVM架构在移动开发中的5G应用优化

本文旨在探讨MVVM(Model-View-ViewModel)架构在5G网络环境下的移动应用开发中的优化方法。我们将重点关注如何利用5G网络的高带宽、低延迟特性来优化MVVM架构中的数据流和状态管理,提升移动应用性能和用户体验。文章首先介绍MVVM架构和5G网络的基础知识,然后深入分析两者的结合点,接着提供具体的优化策略和代码实现,最后讨论实际应用场景和未来发展趋势。MVVM: Model-View-ViewModel,一种软件架构模式,将用户界面逻辑与业务逻辑分离5G。

移动开发前沿的博客 1017

移动开发中的通信架构(七)

回答网友疑问: 1.为什么发送请求的时候不直接发送,而是添加在一个vector中,然后每个200毫秒发送一次? 答:这主要是因为本框架是应对通信需求非常严格的项目,比如炒股软件,浏览器等实时软件。这些软件对网络要求非常高,而且某些界面可能要求实时刷新,这样就导致请求非常多,而为了保证通信的稳定。维护一个缓冲区是非常必要的。 2.对于StructRequest和StructResponse的定...

peizhiinfo 125

Objective - C 在移动开发中的蓝牙通信技术

随着移动设备的普及和物联网技术的发展,蓝牙通信在移动开发中变得越来越重要。Objective - C作为iOS开发的传统编程语言,在处理蓝牙通信方面有着丰富的资源和成熟的框架。本文的目的是详细介绍如何使用Objective - C进行蓝牙通信开发,涵盖从基本概念到实际项目开发的各个方面,包括蓝牙通信的原理、CoreBluetooth框架的使用、项目实战以及实际应用场景等。本文首先介绍蓝牙通信的相关背景知识,包括核心概念和术语。

移动开发前沿的博客 861

Android P HAL层添加HIDL实例(详细实现步骤)

Android P HAL层添加HIDL实例 本文将介绍如何在P OS上添加HIDL实例,简单增加seLinux策略使得可以在system_service调用测试,并用模拟器emulator验证。 调用过程为 APP->TestManager->TestService->ITast.hal 文章目录Android P HAL层添加HIDL实例实现过程一 、hardware部分1...

sinat_18179367的博客 1万+

第一个完整Andorid项目总结

本文目的:把自己一阶段的东西进行总结,拿出来和大家分享,也希望从读者的评论那里得到启发。 本人水平:华东师范大学软件学院毕业,做过两个J2EE项目,一个J2ME项目,一个Android项目(基本就靠Java混饭吃)。 项目介绍:一款IM应用,类似于QQ,用户群是企业员工,和企业QQ是竞争对手。下载地址:http://apk.gfan.com/Product/App278699.html

冯小卫 5174

Robosuite实战:通过Xbox手柄实现机械臂6-DoF精准控制的完整指南

本文详细介绍了如何通过Xbox手柄实现机械臂的6-DoF精准控制,结合Robosuite仿真环境与MuJoCo物理引擎,提供从环境配置到代码实现的完整指南。文章重点解析了手柄映射原理、核心控制代码以及数据采集优化技巧,帮助开发者高效完成机械臂控制任务。

weixin_29169505的博客 419

移动端混合开发性能优化策略

混合开发技术是一种将原生应用开发与Web应用开发相结合的移动应用开发模式。它允许开发者使用Web技术(如HTML、CSS和JavaScript)构建应用的界面和部分功能,同时利用原生代码来实现高性能和特定设备功能。以下是对混合开发技术的概述,包括其基本原理、常用框架以及代码示例。基本原理混合开发的核心思想是将Web视图嵌入到原生应用中,从而实现Web应用与原生应用的结合。创建Web视图:使用Web技术(HTML、CSS和JavaScript)开发应用的界面和部分功能。原生封装。

2501_94812015的博客 1111

使用Dify打造视频生成工作流:从提示词到视频的完整指南

Dify作为开源LLM应用开发平台,通过可视化工作流编排实现从文本到视频的端到端生成,将创意周期从天级缩短至分钟级。核心流程包括提示词工程、视频API调用、存储分发和结果反馈。

牛奶夹心巧克力 3430

人工智能训练师技能等级认定四级技能考核试卷-样题4

本文为人工智能训练师四级技能考核试卷,包含六个实操考核项目,总时长150分钟。考核内容涵盖:1)车牌数据集规范评估与格式处理;2)车牌数据集采集代码修改与数据处理;3)房价预测数据集加载、预处理与可视化分析;4)车牌标注数据集审核与修正;5)螺丝螺母检测数据集的平台创建与共享;6)螺丝螺母数据的去噪处理与标注优化。要求考生使用Python编程、数据处理平台和标注工具完成各项任务,重点考察数据加载、格式转换、缺失值处理、数据可视化、标注审核及平台操作等技能。所有操作需在配备Python3.7和深度学习平台的W

weixin_42221934的博客 348

移动通信期末复习笔记

移动通信复习笔记 1.1移动通信的主要特点 一.必须使用无线电波进行传播 无线电波传播特性:信号衰落 原因: 能量扩散------>弥漫损耗 地形地物的影响------>阴影效应 直射反射绕射---->多径传播--->多径效应 收发两端的相对运动---->多普勒频移 二.在复杂的干扰环境中运行 干扰:邻道干扰,互调干扰,同道干扰,多址干扰,远近效应 小区制的同道干扰:使用相同频道的这些小区之间会存在同频干扰,由蜂窝间的距离与小区半径的比值来决定的。 解决

zjc20172333086的博客 4万+

速腾R128雷达+海康全景相机ROS数据采集避坑实录:从‘雷达不转’到MATLAB标定的完整流程

本文详细记录了速腾R128激光雷达与海康威视全景相机在ROS环境下的数据采集与MATLAB标定全流程。从硬件配置的常见陷阱(如雷达旋转参数设置)、驱动编译的依赖管理,到多传感器同步的实战技巧和MATLAB标定方法,提供了完整的避坑指南和技术方案。特别针对RoboSense R128雷达和海康相机的特殊需求给出了具体解决方案。

weixin_28717807的博客 1218

移动通信网络架构

帮大家梳理一下无线侧接入网+承载网+核心网的架构,这里以接入网为主,其他两个网络的很多技术细节由于笔者研究的并不足够深入,因此以帮助大家入门为主。 在我们正式讲解之前,我想通过这张网络简图帮助大家认识一下全网的网络架构,通过对全网架构的了解,将方便您对后面每一块网络细节的理解。 这张图分为左右两部分,右边为无线侧网络架构,左边为固定侧网络架构。 无线侧:手机或者集团客户通过基站接入到无线接入网,在接入网侧可以通过RTN或者IPRAN或者PTN解决方案来解决,将信号传递给BSC/RNC。在将信号..

2万+

5G中的RedCap

5G中的redcap

大家好,我是码农老gou,一名专注于编程技术的程序员。在这个博客中,我将与大家分享我在工作和学习中的经验、见解以及一些实用的技术干货。 2527

解密网页视频Blob链接:从防盗链到流媒体分片技术

本文深入解析了网页视频中Blob链接的工作原理,揭示了其作为现代视频防盗链与流媒体分片技术核心的本质。文章详细阐述了Blob对象与Media Source API如何协同工作,将视频数据分片传输,并结合HTML5的video元素实现安全、流畅的播放体验,有效提升了资源保护能力。

c7d8e的博客 317

移动通信概述-架构篇

移动通信概述-架构篇

拟古的新打油诗的博客,输出人工智能、计算机软硬件、通信网络等领域原创内容,欢迎关注。 1万+

基于DynamicHead的YOLOv8四头版本改进:面向复杂场景的多目标检测优化【YOLOv8】

YOLOv8的检测头是通过不同尺度的特征层输出检测结果。这些检测头通常包括三个:用于大物体、中等物体和小物体的检测。然而,这种单一结构可能会在复杂场景下失去针对性和灵活性,特别是当多个目标之间差异较大时。为了进一步提升模型在特定目标上的检测性能,DynamicHead的引入为我们提供了一个多检测头的优化方案。本文提出了一种基于DynamicHead的四头版本YOLOv8改进方案,以解决复杂场景下多目标检测的挑战。通过引入四个独立检测头,分别针对不同目标特征进行优化,实现了更灵活的检测结构。

博客 1718

三层架构在移动开发中的应用

三层架构在移动开发中的应用原创文章,转载请注明meiyitianabc博客三层架构介绍三层架构在web开发中广为流传,用了三层架构就很牛了貌似。如下在网上找的一段三层架构好处的描述。一:界面层界面层提供给用户一个视觉上的界面,通过界面层,用户输入数据、获取数据。界面层同时也提供一定的安全性,确保用户不用看到不必要的机密信息。二:逻辑层逻辑层是界面层和数据层的桥梁,它响应界面层的用户请求,执行任务并从数据层抓取数据,并将必要的数据传送给界面层。三:数据层数据层定义、维护数据的完整性、安全性,它响应逻辑层的请求

it114的专栏 1522

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

移动开发中的通信架构(五)

《 移动开发中的通信架构》系列文章终于写完了,我整整花了一周多时间才搞定。哎,自己会一样东西是一件事情,然后描述一件东西,又是一件事情。系列文章在发布的时候,又改了大半天。文章中难免有不足的地方,希望可以交流。         下面来说说本框架的优点: 1.和其他模块高度分离

冯小卫 1311

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Android移动开发小记:用MVP架构实现WebSocket通信小例

本文介绍了在Android开发中使用WebSocket实现实时通信的完整方案。文章首先对比了WebSocket(持久连接、双向通信、低延迟)与传统HTTP的优势,然后详细展示了基于MVP架构的实现过程:1) 通过OkHttp依赖建立WebSocket连接;2) 按照MVP模式分层实现Model数据管理、Presenter业务逻辑和View界面交互;3) 提供了完整的代码示例,包括连接管理、消息收发和状态回调处理。该方案通过接口契约解耦各层,适合需要实时通信的移动应用场景。

Xtreme_X的博客 1174

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

移动通信网络架构 1G-5G

自20世纪80年代初第一代移动网络(1G)问世以来,移动无线通信在过去几十年里取得了许多进展。移动通信标准的这种演变是全球对更多用户和连接日益增长的需求的直接结果.在本文中,我们将研究支撑这些移动技术的基础设施和组件——从1G一直到即将到来的5G。在本文末尾,我们的目标是使图表(如下面的图表)变得更容易理解![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UH4Oipmw-1655441709728)(https://i.imgur.com/bVBdrJG.png)]在我们开始

A LA MODE的博客 8001

移动通信网2G/3G/4G/5G/6G网络架构的演进历程

自此,核心网的构架如下图所示.再后来,无线接入网不断演进,1G、2G、3G、4G,一直到现在的5G和未来的6G,每一代通信标准,每一项具体制式,都有属于自己的网络架构,自己的硬件平台,自己的网元,自己的设备。长久以来,网络越来越庞大,越来越复杂,而那些专用的电信设备不但扩展不灵活,而且习惯了自扫门前雪,整体效率太低,如同公司的体制,这是一个庞大而臃肿的机构,仿佛背着世界前行。最早的时候,固定电话网的核心网,说白了就是把电线两头的电话连接起来,这种交换,非常简单,主要满足人们有线通话的需求。

顺其自然~专栏 1万+

移动开发中的通信架构(一)

移动开发,或者其他大部分软件开发,我们程序员做的无非三件事情:获取数据、显示数据、获取用户事件并做相应反馈。而且移动开发之中,由于网络环境的不稳定,获取网络数据就成为很多应用的瓶颈。本文将试图构建一个稳定,高效,通用的移动开发通信框架。        本文基于J2ME环境编写,

冯小卫 1632
上一篇: 移动开发中的通信架构(二)
下一篇: 移动开发中的通信架构(四)
coding_or_coded
博客等级 码龄16年 216粉丝 115原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值