Android 实现联网


Android 实现联网(一)——package 说明 包 描述 java.net 提供与联网有关的类,包括流和数据包(datagram) sockets、Internet 协议和常见 HTTP 处理。该包 是一个多功能网络资源。有经验的 Java 开发人员 可以立即使用这个熟悉的包创建应用程序。 java.io 虽然没有提供显式的联网功能,但是仍然非常重 要。该包中的类由其他 Java 包中提供的 socket 和连接使用。它们还用于与本地文件(在与网络进 行交互时会经常出现)的交互。 java.nio 包含表示特定数据类型的缓冲区的类。适合用于两 个基于 Java 语言的端点之间的通信。 org.apache.* 表示许多为 HTTP 通信提供精确控制和功能的包。 可以将 Apache 视为流行的开源 Web 服务器。 android.net 除核心 java.net.* 类以外,包含额外的网络访问 socket。该包包括 URI 类,后者频繁用于 Android 应用程序开发,而不仅仅是传统的联网方面 android.net.http 包含处理 SSL 证书的类。 android.net.wifi 包含在 Android 平台上管理有关 WiFi(802.11 无线 Ethernet)所有方面的类。并不是所有设备 都配备了 WiFi 功能,特别是 Android 在 Motorola 和 LG 等手机制造商的 “翻盖手机” 领域获得了成功。 android.telephony.gsm 包含用于管理和发送 SMS(文本)消息的类。一段 时间后,可能会引入额外的包来来为非 GSM 网络 提供类似的功能,比如 CDMA 或 android.telephony.cdma 等网络。 界面部分的代码简要明了,就不此额外说明了,下面详细解析核心代码,如下: final Button button = (Button) findViewById(R.id.ButtonGo); button.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { try{ tView.setText(”"); // 获取输入的 URL 地址 URL url = new URL(eText.getText().toString()); URLConnection conn = url.openConnection(); //获取网页数据流 BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line = “”; //读取数据 while ((line = rd.readLine()) != null) { Message lmsg; lmsg = new Message(); lmsg.obj = line; lmsg.what = 0; //将数据显示在界面上 h.sendMessage(lmsg); } } catch (Exception e) { //输出异常信息 Log.v(”Browse”, e.toString()); } } }); 简要解析如下:URL 和 URLConnection 类共同提供与用户所选的 Web 站点的连接。BufferedReader 的一个实例负责从 Web 站点连接中读取传入的数据。每读取一行代码,文本就被附加到一个 TextView。 数据并没有直接指定给 TextView,而是引入了一种设计模式,即创建一个消息对象并将该对象发送到一 个处理程序的实例。这是更新 UI 的一种比较可取的方法,对可能需要同时运行多个线程的应用程序而言 尤其如此。 实际上,在前面的 Snake 游戏深入解析篇幅中,我们已经介绍了 Android SDK 提供的 Handle 类:A Handler allows you to send and process Message and Runnable objects associated with a thread’s MessageQueue,这句话简单明了,相信大家一看就完全明白了。 补充说明 以上程序,在实际运行中可能会导致异常,catch (Exception e) 输出异常信息: java.net.SocketException: Permission denied(maybe missing INTERNET permission) 需要在 AndroidManifest.xml 中定义相应的权限,如下: 注意在也可以定义 INTERNET 权限,如下: 这种权限似乎还是会导致异常,看来两种权限除了作用的范围有所不同,具体的作用也是有些不同的,以 后开发中需要注意两者的区别。 总结说明 本篇幅就简要说明 Android SDK 提供的与网络有关的 package,并列举了一个的简单的网络实例,后续 篇幅中会有更加详细的介绍。 Android 实现联网(二)——java.net 漫游 相比较 C++,JAVA 在网络编程方面的优势是不言而喻的。想当初学习 MFC 网络方面的痛苦,现在看到 java.net 包中的类,感觉轻松多了。说点题外话:在 C++网络方面可以推荐给大家一个很好的开源项目 POCO 库,这个库在网络方面的功能只能用:那是相当强大,有兴趣的可以去学习下。 在 Android 实现联网(一)——package 说明篇幅中,我们简要介绍了 Android 网络方面的包,本篇 幅我们漫游 java.net 包,按照网络方面的知识来逐步学习 java 网络编程,并给大家介绍一些小例子,边 学习边写代码。 首先,IP 地址 IP 地址估计大家都明白,我们就直接来看 java.net 中的类吧。 详细介绍就不多说了,看 2 个简单的小例子如下: String GetHostAddress(String strHostName) { InetAddress address = null; try { address = InetAddress.getByName(strHostName); } catch(UnknownHostException e) { System.out.println(e.getMessage()); } return InetAddress.getHostAddress() ; } void GetAllIP(String strHostName) { InetAddress[] add = null; try { add = InetAddress.getAllByName(strHostName); for(int i=0;i 0) { // 如果知道响应的长度,调用 publishProgress()更新进度 publishProgress((int) ((count / (float) length) * 100)); } // 为了在模拟器中清楚地看到进度,让线程休眠 100ms Thread.sleep(100); } s = new String(baos.toByteArray()); } // 返回结果 return s; } catch (Exception e) { e.printStackTrace(); } return null; } @Override protected void onCancelled() { super.onCancelled(); } @Override protected void onPostExecute(String result) { // 返回 HTML 页面的内容 message.setText(result); } @Override protected void onPreExecute() { // 任务启动,可以在这里显示一个对话框,这里简单处理 message.setText(R.string.task_started); } @Override protected void onProgressUpdate(Integer… values) { // 更新进度 message.setText(values[0]); } } 执行 PageTask 非常简单,只需要调用如下代码。 PageTask task = new PageTask(); task.execute(url.getText().toString()); 总结说明 Handler 在前面我们已经学习过,今天突然看到 AsyncTask,以及学习其他人的博客基础上,做出了上 面的总结,感觉自己收获很多,在这里与大家分享。 Android 实现联网(四)——TCP/UDP 在 java.net 漫游篇幅中,我们详细介绍了与网络相关的基础类,本篇幅我们详细介绍 TCP、UDP,以及 如何在 Android 实现联网中使用 TCP、UDP 协议。 TCP(Transmission Control Protocol:传输控制协议) TCP 模型结构图,如下图所示: 服务器端与客户端的交互图,如下图所示: 对上图,解释如下  服务器程序编写 1. 调用 ServerSocket(int port)创建一个服务器套接字,并绑定到指定端口上; 2. 调用 accept(),监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字; 3. 调用 Socket 类的 getOutputStream()和 getInputStream()获取输出和输入流,开始网络数 据的发送和接收; 4. 最后关闭通信套接字。  客户端程序编写 1. 调用 Socket()创建一个流套接字,并连接到服务器端; 2. 调用 Socket 类的 getOutputStream()和 getInputStream()获取输出和输入流,开始网络数 据的发送和接收; 3. 关闭通信套接字。 具体如何使用的例子,相信大家已经看了很多了,在这里就不详细说明了。 UDP (User DataPram Protocol:用户数据报协议) UDP 模型结构图,如下图所示: 服务器端与客户端的交互图,如下图所示: 对上图,解释如下:  接收端程序编写: 1. 调用 DatagramSocket (int port)创建一个数据报套接字,并绑定到指定端口上; 2. 调用 DatagramPacket(byte[] buf,int length),建立一个字节数组以接收 UDP 包; 3. 调用 DatagramSocket 类的 receive(),接受 UDP 包; 4. 最后关闭数据报套接字。  发送端程序编写: 1. 调用 DatagramSocket()创建一个数据包套接字; 2. 调用 DatagramPacket(byte[] buf,int offset,int length,InetAddress address,int port), 建立要发送的 UDP 包; 3. 调用 DatagramSocket 类的 send()发送 UDP 包; 4. 最后关闭数据报套接字。 下面举个具体的例子,通过 send()/recv()分别实现数据报的发送与接受,如下图所示: 相关文章  Android 实现联网(三)——在线程中联网  Android 实现联网(二)——java.net 漫游  Android 实现联网(一)——package 说明  Tags: Android 实现联网, TCP UDP 3 Responses to Android 实现联网(四) ——TCP/UDP TCP 模型结构图,如下图所示: 服务器端与客户端的交互图,如下图所示: 对上图,解释如下  服务器程序编写 1. 调用 ServerSocket(int port)创建一个服务器套接字,并绑定到指定端口上; 2. 调用 accept(),监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字; 3. 调用 Socket 类的 getOutputStream()和 getInputStream()获取输出和输入流,开始网络数 据的发送和接收; 4. 最后关闭通信套接字。  客户端程序编写 1. 调用 Socket()创建一个流套接字,并连接到服务器端; 2. 调用 Socket 类的 getOutputStream()和 getInputStream()获取输出和输入流,开始网络数 据的发送和接收; 3. 关闭通信套接字。 具体如何使用的例子,相信大家已经看了很多了,在这里就不详细说明了。 UDP (User DataPram Protocol:用户数据报协议) UDP 模型结构图,如下图所示: 服务器端与客户端的交互图,如下图所示: 对上图,解释如下:  接收端程序编写: 1. 调用 DatagramSocket (int port)创建一个数据报套接字,并绑定到指定端口上; 2. 调用 DatagramPacket(byte[] buf,int length),建立一个字节数组以接收 UDP 包; 3. 调用 DatagramSocket 类的 receive(),接受 UDP 包; 4. 最后关闭数据报套接字。  发送端程序编写: 1. 调用 DatagramSocket()创建一个数据包套接字; 2. 调用 DatagramPacket(byte[] buf,int offset,int length,InetAddress address,int port), 建立要发送的 UDP 包; 3. 调用 DatagramSocket 类的 send()发送 UDP 包; 4. 最后关闭数据报套接字。 下面举个具体的例子,通过 send()/recv()分别实现数据报的发送与接受,如下图所示:
还剩20页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

wacky56

贡献于2014-04-09

下载需要 8 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf