1、让IT教学更简单,让IT学习更有效Android程序设计教程第九章 网络编程目录 9.1 Socket编程 9.2 使用HttpURLConnection 9.3 WIFI编程 9.4 蓝牙传输编程 9.5 WebView组件学习目标 掌握Socket通信的使用 掌握HttpURLConnection通信接口的使用 掌握URLConnection通信的GET、POST两种数据提交方式 了解WIFI编程 了解蓝牙数据传输编程 能够使用WebView组件浏览网页9.1 Socket编程 Socket通常称为“套接字”,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过套接字向网络发出请求
2、或者答应网络请求,它支持TCP/IP协议的网络通信的基本单元。它是网络通信过程中端点的抽象表示,包含进行网络通信的五种必须信息:连接使用的协议、本地主机的IP地址、本地进程的协议端口、远程主机的IP地址、远程进程的协议端口。9.1.1 Socket类和ServerSocket类 常用的Socket构造方法有以下两种:(1)Socket(String host,int port):创建连接到指定远程主机名、远程端口的Socket对象,该构造方法没有指定本地地址和本地端口,默认使用本地主机IP地址和系统动态分配的端口。此外,参数host也可以使用InetAddress类型。(2)Socket(St
3、ring host,int port,InetAddress localAddr,int localPort):创建连接到指定远程主机名、远程端口的Socket,并指定本地IP地址和本地端口,适用于本金主机有多个IP地址的情况。此外,参数host也可以使用InetAddress类型。9.1.2 ServerSocket类 ServerSocket类常用的构造方法如下:(1)ServerSocket(int port):创建绑定到指定端口的服务器套接字。参数port为指定的端口号,若为零,则表示使用任何空闲端口。(2)ServerSocket(int port,int backlog):创建绑定
4、到指定端口的服务器套接字,同时指定可接受的最大连接请求。参数port含义同上,参数backlog表示连接请求队列长度。如果队列已满,则拒绝再达到的连接请求。(3)ServerSocket(int port,int backlog,InetAddress localAddr):创建一个ServerSocket对象,指定端口、连接队列长度和IP地址,当服务器存在多个IP地址时才允许使用localAddr参数将ServerSocket绑定到特定端口。通常使用ServerSocket类进行网络通信的具体步骤如下:(1)根据指定端口实例化一个ServerSocket对象;(2)调用ServerSocke
5、t对象的accept()方法接收客户端发送的Socket对象;(3)调用Socket对象的getInputStream()/getOutputStream()方法建立与客户端进行交互的I/O流;(4)服务器与客户端根据一定的协议进行交互,直到关闭连接;(5)关闭服务器端的Socket。(6)回到第二步,继续监听下一次客户端发送的Socket请求连接。9.2.1 URL类和URLConnection类9.2.2 HttpURLConnection类 HTTP是最常见的应用层网络协议,Internet上的大部分资源都是基于HTTP的。Java提供了.HttpURLConnection类专门用于处理
6、HTTP的请求和响应。HttpURLConnection继承自URLConnection类,每个HttpURLConnection实例都可生成单个请求,以透明的共享方式连接到HTTP服务器。9.3.1 WifiManager类 Android系统提供了一个WifiManager类用于简单的Wi-Fi操作,使用WifiManager可以在应用中打开与关闭Wi-Fi,同时还可以获取Wi-Fi当前的状态信息。在Android应用中控制Wi-Fi,主要是对WifiManager对象进行操作。具体操作分为如下几个步骤:(1)在AndroidManifest.xml清单文件中为应用程序添加权限。(2)得到
7、WifiManager对象。WifiManager wifiManager=(WifiManager)Context.getSystemService(Service.WIFI_SERVICE);其中Context为当前Activity对象,getSystemService是Android中的一个很重要的API,它是Activity的一个方法,根据传入的参数来获取相应的服务对象。(3)打开Wi-Fi网卡。wifiManager.setWifiEnabled(true);(4)关闭Wi-Fi网卡。wifiManager.setWifiEnabled(false);(5)获取当前Wi-Fi网卡状态
8、。wifiManager.getWifiState();9.3.2 WifiInfo类 该类主要用于在Wi-Fi网卡连通后获取Wi-Fi的相关信息,主要包括:Mac地址、IP地址、连接速度、网络信号等。WifiInfo对象的获取主要通过调用WifiManager类的getConnectionInfo()方法得到。具体代码如下:WifiInfo wifiInfo=wifiManager.getConnectionInfo();9.4 蓝牙传输编程 Android应用程序框架提供了访问蓝牙功能的API,这些API能够让应用程序无线连接其他蓝牙设备,实现点对点或点对多点的信息交换功能。具体功能只要有
9、:(1)扫描其它蓝牙设备。(2)查询本地蓝牙适配器用于配对蓝牙设备。(3)建立RFCOMM信道。(4)通过服务发现连接其他设备。(5)数据通信。(6)管理多个连接。9.4.1 Android蓝牙API介绍 Android支持的蓝牙开发类在android.bluetooth包中。编程主要涉及的类有BluetoothAdapter与BluetoothDevice类,这两个类用于蓝牙设备的管理;还有BluetoothServerSocket和BluetoothSocket类,这两个类用于蓝牙通信。9.4.2 Android蓝牙基本应用编程(1)为了在应用中使用蓝牙功能,要在AndroidManife
10、st.xml清单文件中声明蓝牙应用权限。代码如下所示。9.4.3 蓝牙连接与数据传输 有两种方法实现蓝牙连接,一种是每一个设备都自动准备作为一个服务器,拥有一个服务器Socket并监听连接,然后每个设备也都能作为客户端建立一个到远程设备的连接。另一种是一个设备作为服务器Socket,另外一个设备仅作为客户端建立与服务器的连接。下面是建立服务器Socket和接收连接的基本步骤:(1)通过调用listenUsingRfcommWithServiceRecord(String,UUID)方法得到一个BluetoothServerSocket对象。String参数为服务的标识名称,名字可以任意。当客户
11、端试图连接本设备时,它将携带一个UUID用来唯一标识它要连接的服务,UUID必须匹配,连接才会接收。(2)通过调用BluetoothServerSocket对象的accept()方法监听连接请求。该方法为阻塞方法,直到接收一个连接或异常才会返回。当客户端携带的UUID与监听它的Socket注册的UUID匹配时,连接才会被接收,这时accept()方法将返回一个 BluetoothSocket对象。(3)使用BluetoothServerSocket对象的close()方法释放服务器Socket及其资源,该方法不会关闭accept()方法返回的BluetoothSocket对象。建立客户端Soc
12、ket连接到服务器的基本步骤:(1)使用BluetoothDevice调用方法createRfcommSocketToServiceRecord(UUID)获取一个BluetoothSocket对象。(2)调用该BluetoothSocket对象的connect()方法建立连接。当调用这个方法时,系统会在远程设备上完成一个SDP协议的查找来匹配UUID。如果查找成功并且远程设备接收连接,就共享RFCOMM信道,connect()方法会返回。该方法也是一个阻塞调用,如果连接失败或者超时(12s)都会抛出异常。如果两个设备成功建立连接,各自都会有一个BluetoothSocket对象,此时就可以在
13、设备间共享数据了。使用BluetoothSocket传输数据的通常方法如下:分别使用getInputStream()和getOutputStream()获取输入输出流来处理传输。调用read(byte)和write(byte)来实现数据流的读和写。9.5 WebView组件 WebView作为浏览器网络资源的视图组件,具有以下几个优点:功能强大,支持HTML、CSS和JavaScript,并很好地融入布局,使页面更加美观;能够对浏览器控件进行详细的设置,例如字体、背景颜色和滚动条样式等;能够捕获到所有浏览器的操作,例如单击、打开或关闭URL。使用WebView组件的基本步骤如下:(1)在And
14、roidManifest.xml清单文件中配置访问网络权限;(2)在布局文件中创建WebView元素;(3)在代码中加载网页。在加载网页内容时,除了使用WebView的loadUrl()方法进行加载外,还可以使用loadData()或loadDataWithBaseURL()方法将HTML代码片段或本地存储的HTML页面显示出来。WebView控件提供的loadData()方法用于加载HTML片段,该方法的语法格式如下所示。public void loadData(String data,String mimeType,.String encoding)/*compiled code*/其中,参数data是HTML内容;参数mimeType是MIME类型,如text/html指明文本类型是HTML格式;参数encoding是编码字符集。谢谢