Android的网络应用

(一)Android网络编程简介
Android完全支持JDK本身的网络通信API,也可以使用ServerSocket,Socket来建立基于TCP/IP协议的网络通信,还可以使用DatagramSocket和Datagrampacket,MulticastSocket来建立基于UDP协议的网络通信。
(二)基于TCP协议的网络通信
ServerSocket对象用于监听来自客户端的Socket连接。
ServerSocket包含如下两个构造器
ServerSocket(int port)
ServerSocket(int port,int backlog)  增加一个改变队列长度的参数
ServerSocket(int port,int backlog,InetAddcress  localAddr)  在机器存在多个IP地址的情况下,允许通过localAddr这个参数指定将ServerSocket绑定到指定的IP地址
通常使用的方法
Socket accept()     该方法返回一个Socket对象


当ServerSocket使用完毕时,应该使用close()方法来关闭该ServerSocket。
Socket构造器
Socket(InetAddress/String remoteAddress,int port)创建连接到指定远程计算机的Socket对象
Socket(InetAddress/String remoteAddress,int port,InetAddress localAddr,int localPort)   适用于本地主机有多个IP地址的情况下
Socket对象提供了如下两个方法
InputStream  getInputStream()返回该Socket对象的输入流,让程序通过该输入流从Socket对象中取数据
OutputStream  getOutputStream()返回该Socket对象的输出流,让程序输出数据至该Socket对象

因为Android应用需要访问互联网,所以需要添加访问互联网的权限
<uses-permission android:name="android.permission.INTERNET"/>
Socket对象提供了如下方法设置默认延迟时间
setSoTimeout(1000)

当接收到了一个新的Socket对象后,立即为该对象开启一个新的线程
初始化Socket对象的输入流
br = new BufferedReader(new InputStreamReader(s.getInputStream()."utf-8"))
遍历List集合里面的Socket对象
for(Iterator<Socket> it = MyServer.socketList.iterator();it.hasNext();){
Socket  s = it.next();
}

(三)使用URL访问网络资源
可以通过如下方法获取URL对应的资源了
String getFile()获取此URL的资源名
String getHost()获取此URL的主机名
String getPath()获取此URL的路径部分
int  getPort(0获取此URL的端口号
String getProtocol()获取此URL的协议名称
String  getQuery()获取此URL的查询字符串部分
URLConnection  openConnection()返回一个URLConnection对象,它表示到URL所引用的远程对象的连接
        InputStream  openStream() 打开与此URL的连接,并返回一个用于读取该URL资源的InputStream

使用URLConnection提交请求
通常创建一个和URL连接,并发送请求,读取此URL引用的资源需要如下几个步骤
1.通过调用URL对象的openConnection()方法来创建URLConnection对象。
2.设置URLConnection的参数和普通请求属性
3.如果只是get方式的请求,那么使用connect方法建立和远程资源之间的实际连接即可,如果需要发送post方式请求,则需要获取URLConnection实例对应的输出流来发送请求参数

在建立和远程资源的实际连接之前,程序可以通过如下方法来设置请求字段
setAllowUserInteraction设置该URLConnection 的allowUserInteraction 请求字段
setDoOutput 设置该URLConnection的DoOutput请求字段的值
setDoInput 设置该URLConnection的doInput请求字段的值
setIfModifiedSince设置该URLConnection的ifModifiedSince
setUseCaches 设置该URLConnection的useCaches请求字段的值
除此之外,还可以使用如下方法来设置或增加通用的头字段
setRequestProperty(String key,String value)设置该URLConnection的key请求头字段的值为value


addRequestProperty(String key,String value)为该URLConnection的key请求头字段增加Value值,该方法并不会覆盖原请求头字段的值,而是追加
当远程资源可用后,程序可以通过如下方法访问头字段和内容
Object getContent()获取该URLConnection的内容
String getHeaderField(String name)  获取指定响应头字段的值
getInputStream()返回该URLConnection对应的输入流,用于获取URLConnection响应的内容
getOutputStream()返回该URLConnection对应的输出流,用于向URLConnection发送请求参数

除了getHeaderField(String name),java还提供了以下方法来访问特定响应头字段的值
getContentEncoding()获取content-encoding响应头字段的值
getContentLength()获取content-length响应头字段的值
getContentType()获取content-type响应头字段的值
getDate() 获取date响应头字段的值
getExpiration()获取expires响应头字段的值
getLastModified()获取last-modified响应头字段的值



(四)使用HTTP访问网络
URLConnection可以非常方便的与指定站点交换信息。URLConnection还有一个子类HttpURLConnection,在URLConnection的基础上进一步改进
int  getResponseCode()获取服务器的响应代码
String getResponseMessage()获取服务器的响应消息
String getResquestMethod()获取发送请求的方法
void  setRequestMethod(String method)设置发送请求的方法

为了实现多线程下载,程序可按如下步骤进行
1.创建URL对象
2.获取指定的URL对象所指向资源的大小(由getContentLength()方法实现),此处用到了HttpURLConnection类
3.在本地磁盘创建一个与网络资源相同大小的空文件
4.计算没条线程应该下载网络资源的那个部分(从那个字节开始,到那个字节结束)
5.依次创建,启动多条线程来下载网络资源的指定部分


(五)使用Apache HttpClient
在一般情况下,如果只是需要向Web站点的某个简单的页面提交请求并获取服务器响应,则完全可以使用前面介绍的HttpURLConnection来完成,但是绝大多数情况下,Web站点的网页没有这么简单,这些页面并不是通过一个简单的URL就可以访问,可能需要用户登陆,而且具有相应的权限才可以访问,在这种情况下就涉及session,cookie的处理了,
使用HttpClient发送请求,接收响应可分为如下几步
1.创建HttpClient对象
2.如果需要发送get请求,则创建HttpGet对象,如果需要发送POST请求,则创建HttpPost对象
3.如果需要发送请求参数,则可调用HttpGet,HttpPost共同的setParams(HttpParams  params)方法来添加请求参数,对于HttpPost而言,可以调用setEntity(HttpEntity  entity)方法来设置请求参数
4.调用HttpClient对象的execute(HttpUriRequest  request)方法发送请求,执行该方法返回一个HttpResponse
5.调用HttpResponse的getAllHeaders(),getHeaders(String name)等方法可获取服务器的响应头,调用HttpResponse的getEntity()方法可以获取HttpEntity对象,该对象包装了服务器的响应内容,程序可以通过该对象获取服务器的响应内容

(六)Android5.0增强的WebView
使用WebView浏览网页
Void  goBack()后退
void  goForward(0前进
void  loadUrl(String url)  加载指定URL对应的网页
boolean  zoomln()       放大网页
boolean  zoomOut()缩小网页

WebView还提供了loadDataWithBaseURL(String baseUrl,String data,String mimeType,String encoding,String historyUrl)加载指定的HTML代码
使用WebView中的JavaScript调用Android方法-----WebSetting类
只要把setJavascriptEnabled(true)即可让JavaScript调用Android方法
WebView提供了addJavascriptInterface(Object object,String name)  该方法负责把object对象暴露成JavaScript中的Name
再通过name调用安卓中的方法


WebSetting webSetting = myWebView.getSetting();
webSetting.setJavaScriptEnable(true);
myWebView.addJavascriptInterface(new MyObject(this),"myObject");


使用Web Service进行网络编程
1.SOAP(简单对象访问协议)
SOAP允许一个程序向另一个程序发送XML消息,SOAP协议可以通过Http,JMS,SMTP协议传输。
一条SOAP消息就是一个特定的XML文档,SOAP消息包含如下三个主要元素
<Envelope...../>SOAP消息对应的XML文档的根元素
<Header.../> 包含SOAP消息的头信息
<Body.../> 包含所有的调用和响应信息
其中header是可选的,Body是必须的

2.WSDL(web service描述语言)
WHAT部分:用于定义Web Service所提供的操作,也就是Web Service能做什么由其中的<types.../>,<message.../><portType.../>
元素定义
HOW部分:用于定义如何访问 Web Service,包括数据格式详情和访问Web Service操作的必要协议,
WHERE部分:用于定于Web Service位于何处,该部分使用<service.../>元素定义,可以在WSDL文件的最后看到<service.../>元素

一个WSDL文档通常分为如下两个部分
(1.)服务接口,在WSDL文档中由<message.../>和<portType.../>两个元素组成,其中<message.../>定义了操作的交互方式,而<portType.../>元素则可包含任意数量的<operation.../>元素代表一个可以远程调用的操作(方法)
(2.)定义服务的实现,由<binding.../>和<service..../>元素组成,其中<binding.../>元素定义了使用特定的通信协议,数据编码模型个底层通信协议。而<service.../>元素包含了<port.../>子元素,<port.../>子元素将会把绑定机制,服务访问协议和端点地址结合在一起。
3.UDDI
是一套信息注册规范
使用ksoap2-android调用web service操作步骤如下:
1.创建HttpTransportSE对象
2.创建SoapSerializationEnvelope对象


客户端需要传入的参数通过SoapSerializationEnvelope对象的bodyOut属性传给服务器,服务器响应生成SOAP消息也是通过该对象的bodyIn属性来获取
3.创建SoapObject对象,创建该对象时需要传入所调用的Web Service的命名空间,Web Service方法名
4.如果有参数需要传给Web Service的服务器端,则调用SoapObject对象的addProperty(String name,Object value)方法来设置参数,
5.调用SoapSerializationEnvelope的setOutputSoapObject()方法,或者直接对bodyOut属性赋值,将前两步创建的SoapObject对象设为SoapSerializationEnvelope的传入SOAP消息体
6.调用对象的call()方法,并以SoapSerializationEnvelope作为参数调用远程Web Service
7.调用完成后,访问SoapSerializationEnvelope对象的bodyIn属性,该属性返回一个SoapObject对象,该对象代表了Web Service的返回消息,解析该SoapObject对象,即可获取调用Web Service的返回值。

实例:调用基于CXF的Web Service
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值