手机本身是作为手机终端使用的,因此它的计算能力,存储能力都是有限的。它的主要优势是携带方便,可以随时打开,而且手机通常总是处于联网状态。因此网络支持对于手机应用非常重要。
Android完全支持JDK本身的TCP,UDP网络通信API,也可以使用ServerSocket,Socket来建立基于TCP/IP协议的网络通信,也可以使用DatagramSocket,Datagrampacket来建立基于UDP协议的网络通信。
Android也支持JDK提供的URL,URLConnection等网络通信API。
Android还内置了HttpClient,和HttpUrlConnection这样可以非常方便地发送HTTP请求,并获取Http响应。
——基于TCP协议的编程
使用Socket,ServerSocket编程:
使用多线程,handler机制完成网络编程.
注意:由于手机无线上网的IP地址通常都是由移动运营公司动态分配的,一般不会有自己固定的IP地址,因此很少在手机上运行服务器端,服务器端通常运行在有固定IP的服务器上。
①跟网络有关的就要加Internet权限
②网络数据的请求要在子线程中进行
③更新UI需要借助Handler机制
④编码问题:Android默认编码为UTF-8 Java默认编码为GB2312
⑤本机IP地址问题:使用127.0.0.1在模拟中不能访问到本地的服务器,因为模拟器也在本机
最后有使用Socket,ServerSocket网络编程的示例
——使用URL进行网络编程
**——使用URL访问网络资源**
URL对象代表统一资源定位符。它是指向互联网中的资源。该资源可以是简单的文件或目录。也可以是对更复杂的对象的引用。
URL的格式:protocol://host:port/resourceName
可以使用构造器创建URL对象,一旦获得URL对象,可以调用如下的方法访问该URL对应的资源:
String getFile():获取URL的资源名
String getHost():获取URL的主机名
String getPath():获取URL的路径部分
int getPort():获取URL的端口号
String getProtocol():获取URL的协议名称
String getQuery():获取URL的查询字符串部分
InputStream url.openStream():打开URL的连接,返回一个读取该资源的InputStream。
**——使用URLConnection提交请求**
URL的openConnection()方法将返回一个URLConnection,该对象表示应用程序和URL之间的通信连接,程序可以通过URLConnection实例向该URL发送请求,读取URL引用的资源。通常创建一个和URL的连接,并发送请求,读取此URL引用的资源。
需要如下步骤:
a)通过调用URL对象openConnection()方法来创建URLConnection对象
b)设置URLConnection的参数和普通请求属性
conn.setRequestProperty("accept","*/*");
conn.setRequestProperty("connection","Keep-Alive");
conn.setRequestProperty("user-agent","Mozilla/4.0(compatible;MSIE 6.0;Windows NT 5.1;SV1)");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
//发送POST请求必须设置如下两行**
conn.setDoInput(true):设置该URLConnection的doInput请求头字段的值
coon.setDoOutput(true):
c)调用connect():打开到此URL引用的资源的通信链接(如果尚未建立这样的连接)。
如果在已打开连接(此时 connected 字段的值为 true)的情况下调用 connect 方法,则忽略该调用.
URLConnection 对象经历两个阶段:首先创建对象,然后建立连接。
在创建对象之后,建立连接之前,可指定各种选项(例如doInput和UseCaches).连接后再进行设置就会发生错误。连接后才能进行的操作(例如getContentLength),如有必要,将隐式执行连接.
d)如果只是发送GET方式请求,使用connect方法建立和远程资源之间的实际连接即可,在请求的地址中传入数据。
如果需要发送Post方法请求。需要获取
URLConnection实例对应的输出流来发送请求参数,
PrintWriter out=new PrintWriter(conn.getOutputStream());
//解决乱码问题
String n=EncodingUtils.getString("张三".getBytes(),"UTF-8");
out.write("name="+n+"&pwd="+pwd);
out.flush();//刷新输出流的缓冲
e)远程资源变为可用,程序可以访问远程资源的头字段或通过输入流读取远程资源的数据。
getInputStream()获取输入流。
从输入流读取response的数据。
注意:
1)如果既要使用输入流读取URLConnection响应的内容,也要使用输出流发送请求参数,一定要先使用输出流,再使用输入流。
2)借助于URLConnection类的帮助,应用程序可以非常方便地与指定站点交换信息,包括发送GET请求,POST请求,并获取网站的响应等。
使用Socket,ServerSocket编程示例:
效果:
ServerHuadong为服务器
基于TCPIP协议网络编程为客户端