Android的网络编程部分,基本上和Java的网络编程是一样的,基本上也分成两种,一种是基于Socket的,另外一种是基于Http协议的。本文就简单介绍下在Android平台中如何进行网络编程。
跟Java里面的用法是一样的,Socket网络编程分为TCP和UDP,两种实现的步骤不太一样。如果要开发一款多人联网的游戏,Http已经不能很好的满足要求了。这时就需要Socket通信了。
Socket通常称为"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。它是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必需的5种信息: 连接使用的协议、本地主机的IP地址、本地进程的协议端口、远地主机的IP地址、远地进程的协议端口。
Socket有两种主要操作方式:面向连接的 和 无连接的。
面向连接的Socket操作就像一部电话机,必须要等对方接上之后才能通话。所有的数据到达的顺序与它出发时的顺序是一样的。面向连接的操作使用TCP协议,即此模式下必须先连接上目的地的Socket,连接上后Socket就可以使用一个流接口进行打开、读、写、关闭等操作。所有所发信息都会在另一端以同样的顺序被接收。安全性高,但效率低。
无连接的就像是一个邮件投递,没有保证,多个邮件到达时的顺序可能与出发时的顺序不一样。无连接的操作使用数据报协议,一个数据报是一个独立的单元,它包含了这次投递的所有信息。可将其想象成一个信封,这个模式下的Socket不需要连接一个目的Socket,它只是简单的投出数据报。无连接的操作时快速和高效的,但是数据安全性不高。
到底用哪种由我们所要写的应用程序的需要所决定。如:文件服务器需要数据的正确性和有序性,因选面向连接的。
服务端:
1:启动一个服务器端的socket:ServerSocket server = new ServerSocket(1234);
2:开始侦听请求:Socket client = server.accept();
3:取得输入和输出流:
4:然后就可以通过流来进行网络传输了
5:最好要记得关闭流和Server
客户端:
1:发起一个socket连接:Socket server = new Socket("192.168.1.2",1234);
2:取得输入和输出流:
3:然后就可以通过流来进行网络传输了
4:最好要记得关闭流和Socket
接收方创建步骤:
1. 创建一个DatagramSocket对象,并指定监听的端口号
DatagramSocket socket = new DatagramSocket (4444);
2. 创建一个byte数组用于接收
byte data[] = new byte[1024];
3. 创建一个空的DatagramPackage对象
DatagramPackage package = new DatagramPackage(data , data.length);
4. 使用receive方法接收发送方所发送的数据,同时这也是一个阻塞的方法
socket.receive(package);
5. 得到发送过来的数据
new String(package.getData() , package.getOffset() , package.getLength());
发送方创建步骤:
1. 创建一个DatagramSocket对象
DatagramSocket socket = new DatagramSocket (4444);
2. 创建一个 InetAddress , 相当于是地址
InetAddress serverAddress = InetAddress.getByName("想要发送到的那个IP地址");
3. 这是随意发送一个数据
String str = "hello";
4. 转为byte类型
byte data[] = str.getBytes();
5. 创建一个DatagramPacket 对象,并指定要讲这个数据包发送到网络当中的哪个地址,以及端口号
DatagramPacket package = new DatagramPacket (data , data.length , serverAddress , 4567);
6. 调用DatagramSocket对象的send方法 发送数据
socket . send(package);
Android提供了HttpURLConnection和HttpClient接口来开发Http程序。
Http(Hyper Text Transfer Protocol,超文本传输协议)用于传输WWW方式的数据。HTTP通信中客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程为"一次连接"。要保证客户端程序在线状态,需要不断地向服务器发送连接请求。通常的做法是即使不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求,也就是所谓的心跳,服务器在收到该请求后对客户端进行回复,表明知道客户端在线。若长时间无法收到客户端的请求,则认为客户端下线,若客户端长时间无法收到服务器的回复,则认为网络已经断开。很多情况下,需要服务器端主动向客户端发送数据以保持客户端与服务器数据的实时与同步。
Http通信中,服务器需要等到客户端发送一次请求后才能将数据传回给客户端,因此,客户端定时向服务器端发送连接请求,不仅可以保持在线,同时也是在"询问"服务器是否有新数据,如果有就将数据传给客户端。
Http采用请求/响应的模式。客户端向服务器发送一个请求,请求头包含了请求方法,URI,协议版本,以及包含请求修饰符,客户信息和内容,类似于MIME消息结构。服务器以一个状态行作为响应,响应的内容包含消息协议的版本,成功或错误编码,还包含服务器消息,实体元信息以及可能的实体内容。它是一个属于应用层的面向对象的协议,适用于分布式超媒体信息系统。
许多HTTP通信是由一个用户代理初始化的,并且包括一个申请在源服务器上资源的请求。最简单的情况可能是在用户代理和服务器之间通过一个单独的连接来完成。
在Internet上,Http通信通常发生在TCP/IP连接上,缺省端口是TCP80.其他端口也是可用的。
java.net.*下面提供了访问 HTTP 服务的基本功能,包括流和数据包套接字、Internet协议、常见HTTP处理。使用这部分接口的基本操作主要包括:
创建 URL 以及 URLConnection / HttpURLConnection 对象
设置连接参数
连接到服务器
向服务器写数据
从服务器读取数据
常见java.net包的Http例子: try{ URL url = new URL("http://www.google.com%22)//定义地址 HttpURLConnection http = (HttpURLConnection) url.openConnection();//打开连接 int nRC = http.getResponseCode();//得到连接状态 if(nRC == HttpURLConnection.HTTP_OK){ InputStream is = http.getInputStream();//取得数据 .....//处理数据 } }catch(Exception e){ //因是连接网络,不免会出现一些异常,所以必须处理这些异常 }
Apache HttpClient 是一个开源项目,弥补了 java.net.* 灵活性不足的缺点,为客户端的HTTP编程提供高效、最新、功能丰富的工具包支持。Android 平台引入了 Apache HttpClient 的同时还提供了对它的一些封装和扩展,例如设置缺省的HTTP超时和缓存大小等。早期的 Android 曾同时包括 Commons HttpClient (org.apache.commons.httpclient.*)和 HttpComponents (org.apache.http.client.* ),不过当前版本 (1.5) 中开发者只能使用后者,也就是说类似以下的一些类:
使用这部分接口的基本操作与 java.net.* 基本类似,主要包括:
创建 HttpClient 以及 GetMethod / PostMethod, HttpRequest 等对象
设置连接参数
执行 HTTP 操作
处理服务器返回结果
使用android.net.http.*包的例子: try{ HttpClient hc = new DefaultHttpClient();//创建HttpClient,这里使用DefaultHttpClient表示默认属性 HttpGet hg = new HttpGet("http://www.google.com%22);//HttpGet实例 HttpResponse rp = hc.execute(hg);//连接 if(rp.getStatusLine().getStatusCode() == HttpStatus.SC_OK){ InputStream is = rp.getEntity().getContent(); .....//处理数据 } }catch(IOEeception e){ }
android.net.* 实际上是通过对 Apache 的 HttpClient 的封装来实现的一个 HTTP 编程接口,同时还提供了 HTTP 请求队列管理,以及 HTTP 连接池管理,以提高并发请求情况下(如转载网页时)的处理效率,除此之外还有网络状态监视等接口,网络访问的Socket,常用的Uri类以及有关WiFi相关的类等等。
最简单的Socket连接: try{ InetAddress ia = InetAddress.getByName("192.168.1.110");//IP地址 Socket sk = new Socket(inetAddress,61203,true);//端口 InputStream is =sk.getInputStream();//得到数据 OutputStream os = sk.getOutputStream(); .....//数据处理 os.close(); is.close(); sk.close(); }catch(UnknownHostException e){ }catch(IOException e){ }