一、网络通信基础
自从1896年,意大利人马可尼申请了第一个无线电报专利,无线技术已经彻底改变了人们接收信息的方式。无线技术和网络技术融合为即时通信和永久在线提供条件。CDMA,GSM,TDMA,802.11,WAP,3G,GPRS,Bluetooth等等,都是与现代人生活息息相关,也常常听说到的名词。
实际上无线网络技术分为无线蜂窝网络技术和无线数据网络技术两类。
无线蜂窝网技术:一种移动通信硬件架构,因为通信基站的信号覆盖呈现六边形,像蜂窝而得名。
世界各地使用的无线传输系统不同:
1. 欧洲采用全球移动通讯系统(Global System of Mobil communication)2G
2. 亚洲部分地区采用个人数字蜂窝系统(Personal Digital Cellular)2G
因为各个系统互相不兼容,蜂窝电话和WAP电话只能在购买地使用,3GPP组织提出了WCDMA标准。WCDMA在GSM系统中使用,爱立信,诺基亚,日本厂商支持。CDMA 2000,高通和朗讯支持。TD-SCDMA是中国的3G体制,国内公司支持。
无线数据网络技术:标准技术是谱技术,大多数无线局域网都使用无线扩谱技术。下面是使用与2.4GHz的无线局域网扩谱技术。
1. 直接序列扩谱(Direct Sequence Spread Spectrum),给每个传输的位产生一种冗余位模式(chip)的宽带扩谱技术。
2. 跳频扩谱(Frequency-Hopping Spread Spectrum),它在一个频率上短期传输,然后跳转到另一个频率上传输的方式来扩展信号。
IEEE指定的无线局域网协议族802.11定义了移动设备客户端与基站或者两个客户端之间的通信接口。802.11,802.11a,802.11b,802.11g。其中802.11b就是注明wifi。无线局域网使用以太网协议和(Carrier Sensor Multiple Access with Collision Avoidence)。无线工作站与固定的接入点简历连接,这个接入点主要提供到有线网络的桥接作用。
无线局域网络的工作模式有点对点模式(ad hoc),集中模式(infrastructure)两种。点对点模式就是移动客户端的直接互联,集中模式有特定的连接步骤。
97年,爱立信、摩托罗拉、诺基亚公布了无线应用协议(Wireless Application Protocol)。WAP作为一组与HTML协议的技术开发的,它更适应小屏幕、资源有限的手持设备的需要。设计出了手持设备标注语言(Handheld Device Markup Language),HDML最后和其他一些技术一起发展成了无线标注语言(Wireless Markup Language)。
WAP架构源于OSI模型,共有5层:
应用层:包括无线应用环境(Wireless Application Environment)。包含设备、内容开发语言(WML和WMLScript)、无线电话API(WTA)和电话薄记录格式、日历记录格式及图像格式。
会话层:称为无线会话协议(Wireless Session Protocol)。WSP和HTTP类似,它主要是为了低带宽、高延迟的无线网络而设计出来的。它方便了再WAP客户端和WAP网关间传输二进制数据的过程。其他的功能包括内容传送和连接的挂起和恢复。WSP为WAE提供了连接和无连接两种会话模式。
事务层:称为无线事务处理协议(Wireless Transaction Protocol)。WTP提供了与因特网中的TCP/IP类似的功能。WTP是一个轻量级的事物处理协议,它能够支持可靠地请求、回复事务处理,也支持可靠地和非可靠的数据传送。
安全层:无线传输安全层(Wireless Transport Layer Security)基于TLS,与HTTPS协议类似的层次。它提供了保证数据完整性,机密性,可认证性和抗拒绝服务攻击的机制。
传输层:WAP的最底层是无线数据报协议(Wireless Datagram Protocol)。WDP为传输介质提供了接口,它支持CDPD(Cellular digital packet data),GSM,CDMA,TDMA和SMS(Short Message Service)多种协议。WDP为WAP的高层协议提供了统一的接口,不管这种应用运行在何种无线网络上。它提供了数据纠错功能。
GSM网络体系结构:
1. 带有SIM卡的手持设备:SIM卡是具有32—64KB EEPROM存储空间的微处理智能卡。存放持卡人身份信息及加密认证算法等机密内容。
2. 基站收发信台(Base Transceiver Station):基站收发信台负责手持设备与无线网络之间的连接。每个蜂窝站点有一个基站
3. 基站控制器(Base Station Controller):基站控制器管理多个基站收发信号台。它的主要功能是频率分配和管理,同时在移动用户从一个蜂窝站点移动到另一个蜂窝站点时处理交接工作。基站收发信台和基站控制器组成了基站子系统(Base Station System)。
4. 移动交换中心(Mobile Switch center):移动交换中心管理多个基站控制器,同时提供到有线电信网络的连接。
5. 认证中心(Authentication Center):认证中心对SIM卡进行认证
6. 归属位置登记数据库(Home Location Register):HLR是在归属网络上用来存储和跟踪介入者信息的数据库。保存了用户的登记信息和移动设备的信息,同时也跟踪一个本地用户何时漫游到何处的信息。
7. 范文位置登记数据库(Visitor Location Register):VLR跟踪漫游到归属位置以外的用户信息数据库。当漫游时VLR会跟踪改用户并把电话转接到该用户的手机上。
8. 运营中心(Operations and Maintenance Center):OMC负责整个GSM网络的管理和性能维护。
SIM卡的信息由运营商指定
1. 国际移动用户识别码(International Mobile Subscriber Identification number)
2. 单个用户认证密钥,128b长
3. A3,A8算法。
4. 用户PIN码(Personal Identification Number)
5. PIN解锁码PUK(PIN Unlocking Key)
GSM认证过程
当一个手机开始通话,GSM网络的VLR会认证用户的身份。VLR与HLR建立联系,HLR从AuC获得用户信息。这些信息发送到VLR上。(GSM 02.20 V900 2001)
1. 基站产生一个128b的随机数或询问数(RAND),并把它发送给手机。
2. 手机使用A3算法和密钥K将(RAND)加密,产生一个32b签名回应(SRES)
3. 同时VLR计算出SRES值。K(在数据库中),RAND(VLR自己选择),A3算法是已知的。
4. 手机将SRES值传输到基站,基站转发给VLR
5. VLR将收到的SRES值与计算得出的SRES值对照。
6. 如果相同,认证成功,用户可以使用网络。
7. 如果不同,连接中止,发送错误信息给手机。
K保存在手机,AuC,HLR和VLR中,难以被窃听。128b密钥有2^128种可能,32b签名回应有2^32种可能。
GSM保密性
GSM网络和用户的信息传递是加密的。
1. SIM卡使用RAND,与K一起作为A8算法的输出,产生64b的会话密钥(KC)。
2. GSM计算出相同的会话密钥
KC与A5算法配合,产生手机与GSM网络之间的加密通信数据。
提问:
1, 有没有可能复制SIM卡
2, 有没有可能截获移动客户端的连接信息,或者通信数据
答:1.SIM卡只是一个物理设备,从文中提及的知识点而论,是可以被复制的,而且它的成本低廉,不适合使用一些物理不可复制的设备来存储信息。2.移动客户端和基站建立连接是通过无线电传输的方式,这些内容很容易被窃听,而且难以发现。因此,通讯的内容都是加密的。通讯密钥的生成有随机值的参与,可以说,截获者,能够轻松拿到加密的消息,但是只有很小的几率解密出明文,获得有意义的数据。
二、Http通信
Android中的http通信有两种方法,使用HttpUrlConnection接口和HttpClient接口。
Http通信中使用最多的是Get和Post,GET请求可以获得静态页面,也可以把参数放在URL字符串后面,传递给服务器。而POST方法的参数不是放在放在URL字串里面,而是放在Http请求中。
HttpUrlConnection接口
HttpURLConnection是Java标准类,继承于URLConnection类,二者都是抽象类,无法直接实例化对象。其对象主要通过URL的openConnection方法获得。创建方法为:
URL url = new URL("http://www.google.com");
HttpURLConnection urlConn=(HttpURLConnection)url.openConnection();
可以进行一些属性设置:
urlConn.setDoOutput(true); //设置输入和输出流
urlConn.setDoInput(true);
urlConn.setRequestMethod("POST"); //设置请求方式为POST
urlConn.setUseCaches(false); //POST请求不能使用缓存
urlConn.disConnection(); //关闭连接
使用HttpUrlConnection直接获取数据比较简单,只需要打开HttpUrlConnection连接,取得流中的数据,完成之后关闭连接。
String httpUrl ="http://172.18.57.77:8080/BA/http1.jsp"; //http地址
url = new URL(httpUrl); //构造一个URL对象
//使用HttpURLConnection打开连接
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
//得到读取的内容(流)
InputStreamReader in = new InputStreamReader(urlConn.getInputStream());
// 为输出创建BufferedReader
BufferedReader buffer = new BufferedReader(in);
.......
in.close(); //关闭InputStreamReader
urlConn.disconnect(); //关闭http连接
以Get方式传递参数也比较简单,只需要在网页地址中加上参数就可以,其他的和直接获取数据时一样的。
//http地址"?par=abcdefg"是上传的参数
String httpUrl = "http://172.18.57.77:8080/BA/httpget.jsp?par=ABCDEFG";
HttpUrlConnection默认以Get方式获取数据,所以如果希望用Post方式获取数据,则需要使用setRequestMethod方法进行设置,然后将要传递的数据写入数据流。
urlConn.setRequestMethod("POST"); // 设置以POST方式
HttpClient接口
但在实际开发中,可能会遇到更复杂的网络操作。Apache提供了HttpClient,它对Java.net中的类做了封装和抽象,更适合在android上开发互联网应用。
使用HttpClient首先需要了解几个类:
ClientConnectionManager :客户端连接管理接口。
DefaultHttpClient :是默认的一个Http客户端,可以使用它创建一个Http连接。
HttpResponse :是一个Http响应连接,当执行一个Http连接后,就会返回一个HttpResponse,可以通过它得到一些响应信息。
使用HttpClient接口用Get方式获取数据,首先需要使用HttpGet构建一个Get方式的Http请求,然后通过HttpClient来执行这个请求,HttpResponse在接收这个请求后给出响应,最后判断请求是否成功并给出处理。
HttpGet httpRequest = new HttpGet(httpUrl); //HttpGet连接对象
HttpClient httpclient = new DefaultHttpClient(); //取得HttpClient对象
/请求HttpClient,取得HttpResponse
HttpResponse httpResponse = httpclient.execute(httpRequest);
//请求成功
if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK)
{ //取得返回的字符串
String strResult = EntityUtils.toString(httpResponse.getEntity());
}
用Post方式获取数据稍微复杂一些,首先需要使用HttpPost构建一个Post方式的Http请求,然后使用NameValuePair保存要传递的参数,Post方式还需要设置使用的字符集,其它和Get方式是一样的。
String httpUrl = "http://172.18.57.77:8080/BA/http1.jsp"; // http地址
HttpPost httpRequest = new HttpPost(httpUrl); //HttpPost连接对象
三、socket通信
1、HTTP通信的不足
客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”
2、什么Scocket
sockect通常也称为“套接字”,用于描述IP地址和端口,应用程序通过“套接字”向网络发出请求或者应答网络请求,它是支持TCP/IP协议的网络通信的基本操作单元。
3、Socket传输模式
(1) 无连接的
使用数据报协议,一个数据报是一个独立的单元,它包含 了这次投递的所有信息。无连接的操作是快速的和高效的,但是数据安全性不佳。
(2) 面向连接的
使用TCP协议,这个模式下的Socket必须在发送数据之前与目的地的socket取得连接。一旦连接建立了,Socke就可以使用一个流接口进行打开、读、写、关闭操作。面向连接的操作比无连接操作的效率更低,但数据的安全性更高。
4、Socket构造
Java在包java.net中提供两个类Socket和ServerSocket,分别用来表示双向连接的客户端和服务端。
例如:
//创建客户端socket
Socket socket = new Socket(“192.168.1.110”, 54321);
//创建服务端socket
ServerSocket server = ServerSocket(54321);
注:0-1023的端口为系统保留。我们在选择端口时最好选择一个大于1023的数,防止放生冲突。
(1) 服务端Socket
创建一个ServerSocket在端口54321监听客户请求,它是Server的典型工作模式,在这里Server只能接收一个请求,接收后Server就退出了。
try{
ServerSocket server = ServerSocket(54321);
}catch( IOException e ){}
try{
Socket socket = server.accept();//等待客户的请求,直到有一个客户 启动并请求连接到相同的端口。
}catch( IOException e ){}
(2) 客户端Socket
要想使用Socket来与一个服务器通信,就必须现在客户端创建一个Socket,并指出需要连接的服务器的IP地址和端口。
代码如下:
try{ //192.168.1.110是IP地址,54321是端口
Socket socket = new Socket("192.168.1.110", 54321);
}catch( IOException e ){ }
(3) 输入(出)流
Socket提供了getInputStream()和getOutputStream()来得到对应的输入(出)流以进行读(写)操作。这两个方法分别返回InputStream和OutputStream类对象。为了便于读写数据,我们可以在返回的输入/输出流对象中建立过滤流,如DataInputStream、DataOutputStream或PrintStream类对象。对于文本方式流对象,可以采用InputStreamReader和OuputStreamWriter、PrintWirter等处理。
代码如下:
PrintStream os = new PrintStream( new BufferedOutputStream( socket.getOutputStream() ) );
DataInputStream dis = new DataInputStream( socket.getInputStream() );
PrintWirter pw = new PrintWirter( socket.getOutputStream(), true );
BufferedReader br = new BufferedReader( new InputStreamReader(socket.getInputStream() ) );
( 4) 关闭Socket和流
每一个Socket对象的存在都会占用一定的资源,在Socket对象使用完毕时,要使其关闭,关闭Socket可以调用Socket的close()方法。在关闭Socket之前,应将与Socket相关的所有输入(出)流全部关闭,以释放所有资源。
关闭顺序为:
os.close();
is.close();
socket.close();
5、Android Socket编程
下面实现一个服务器和客户端通信,客户端发送数据并接收服务器发回的数据。客户端界面如图1所示,编辑数据并点击“发送”按钮后,得到服务器回发的数据并显示,如图2所示,服务器端接收到的数据则如图3所示。
图1 客户端界面
图2 读取服务端数据并显示
图3 服务器接收到的数据
6、socket应用(简易聊天室)
前面的的例子中只是实现了一个客户端和一个服务端带的单独通信,并且只能一次通信,在实际的应用中,往往是在服务器上运行一个永久的程序,它可以接收来自其他多个客户端的请求,并提供相应的服务。为了实现在服务器方给多个客户提供服务的功能,需要对上面的程序进行改造,利用多线程实现多客户机制。服务器总是在指定的端口上监听是否有客户请求,一旦监听到客户的请求,服务器就会启动一个专门的服务器来相应该客户的请求,而服务器本身在启动完线程之后马上又进入监听状态,等待下一个客户的到来。
下面使用socket通信实现一个简单的聊天室,在这里需要启动两个客户端来同时连接服务器,一个客户端是Android程序,另外一个是Java程序。首先启动服务器—>启动Android客户端—>启动另一个pc客户端—>Android客户端发送消息“1111”—>pc客户端发送消息“22222”—>Android客户端发送消息“33333“,现在服务气短如图4所示,Android客户端如图5所示,另外一个Java客户端显示如图6所示。
图 4 服务器界
图5 android客户端界面
图6 java客户端界面
7、Android Socket编程小结
(1) 创建服务器的步骤:
1.指定端口实例化一个ServerSocket。
2.调用ServerSocket的accept()以在等待连接期间造成阻塞。
3.获取位于该底层Socket的流以进行读写操作。
4.将数据封装成流。
5.对Scoket进行读写。
6.关闭打开流。 注意:不要在关闭Writer之前关闭Reader。
(2) 客户端实现步骤:
1.通过IP地址和端口实例化Socket,请求连接服务器。
2.获取Socket上的流以进行读写。
3.把流包装进BufferedReader/PrintWriter的实例。
4.对Socket进行读写。
5.关闭打开的流。
提问:
1、通信中手机可不可以作为服务器端?
可以的,例如:在蓝牙通信中,两个手机蓝牙通信,其中的一方作为服务器端,监听客户端的请求,并对这些请求做出相应的处理。
四、浏览器引擎WebKit
1 、为什么我们需要浏览器引擎?
正如我们所知 , 浏览器引擎 ( Rendering Engine ) 是 负责取得网页的内容 ( HTML 、 XML 、 图像等等 ) 、 整理信息 ( 例如加入 CSS 等 ) ,以及计算网页的显示方式 , 然后会输出至 显示器 的浏览器内核 。 所以我们想要使得网页内容得到一个完美的展现 , 就需要一款强大的浏览器引擎。
另一方面随着技术的进步,个人计算机、手机、平板电脑、 PD A等电子设备的普及 , 越来越多的人会使用这些设备随时随地的上网浏览网页获取信息,这就要求浏览器引擎的完善来满足人们的上网体验。
再者,如今随着云技术的火爆发展和应用,越来越多的信息将会载在云端上,甚至各种数据的处理也将在云端进行,而在用户端 ,们只需要拥有一个不用太高配置的设备来运行一款拥有强大引擎浏览器就可以帮助我们实现数据处理 、 信息交流等等几乎所有的网应用。
所以,学习并使用一款强大的浏览器引擎是十分必要的;如果可能 , 还可以研发一款更为强大的浏览器引擎来获得更多更好的上网体验,方便人们的生活。
2 、为什么我们选择 Webkit
Web 源自 1998 年所开发的 KDE 的 HTML 排版引擎 KHTML 及E 的 JavaScript 引擎 KJS 的源代码 。 最初它只是 KDE 的一个小部。随后 Apple 公司 的 Don Melton 于 2001 年 6 月 25 日开始 开 发bKit , 当时 WebKit 仅为 KHTML 及 KJS 的 复刻 , 他认为 KHTM LKJS 比起其他技术有着更容易开发、更轻巧、更加干净的设计,及更与标准相容的优势 , KHTM L 及 KJ S 被 移植到 了 OS X 的 Safar i览器中 , 并重新命名为 WebCore 及 JavaScriptCore 。 在 2005 年六月日 , Safari 开发者 Dave Hyatt 宣布 Apple 将把 Webkit 开源 , 并且开了 WebKit 的 CVS 程式库以及臭虫数据库工具。 从此 Webkit 成为自由软件 , 在 GPL 条约下授权 , 同时支持 BSD 系统 的开发 。 所 以bkit 也是自由软件,同时 开放源代码 。
Webkit 这个浏览器内核具有高效稳定、兼容性好、源代码结构清、易于维护等优势。
3 、 Webkit 的具体应用
在 iOS 系统上的应用:
2007 年 6 月 29 日 , iPhone 上市, WebKit 通过 Safari 浏览器进 入iOS 平台,而且立即成为当时 iOS 平台唯一的排版引擎。
在 Windows 上的应用:
2008 年 3 月 18 日 , Safari 3.1 for Windows 转正 , 解决了 Window s平台下 WebKit 一直存在的部分兼容性问题。 同年 9 月 3 日 推出 的Google Chrome 使得这一平台进一步成熟。而在 Windows Mobile 战线,领先推出稳定版的是拓驰公司的 Iris Browser 。
在 Linux 上的应用:
目前, Google Chrome , Midori , GNOME 的 Epiphany 、 KDE 的nqueror , Arora 以及 QupZilla 是 Linux 系统下最流行的 Webkit 内浏览器。
Symbian 上的应用:
2005 年 , 诺基亚公司 的 S60 团队成为手机端 WebKit 的先驱,他将 WebKit 框架移植到了 Symbian S60 平台,作为 S60 第三版的浏器内核。
另外 , 从上面两张图标的统计 , 我们也可以看出 , 给予 Webkit 内的浏览器会逐渐成为主流 , 占了近半的市场份额 。 综上 , 学习和开Webkit 浏览器内核对于我们将来在浏览器开发和浏览器内核开发面的工作是十分重要而有意义
参考文献:
[1] http://52android.blog.51cto.com/2554429/496621
[2] Android应用开发揭秘 杨丰盛