首页 Android_实现联网

Android_实现联网

举报
开通vip

Android_实现联网 Android 实现联网(一)——package说明 包 描述 java.net 提供与联网有关的类,包括流和数据包(datagram) sockets、Internet 协议和常见 HTTP 处理。该包 是一个多功能网络资源。有经验的 Java 开发人员 可以立即使用这个熟悉的包创建应用程序。 java.io 虽然没有提供显式的联网功能,但是仍然非常重 要。该包中的类由其他 Java 包中提供的 socket 和连接使用。它们还用于与本地文件(在与网络进 行交互时会经常出现)的交互。 java....

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,而是引入了一种 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 模式,即创建一个消息对象并将该对象发送到一 个处理程序的实例。这是更新 UI 的一种比较可取的 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 ,对可能需要同时运行多个线程的应用程序而言 尤其如此。 实际上,在前面的 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 内容 财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容 。如果此连接动作直接 在主线程,也就是 UI 线程中处理,会发生什么情况呢?整个程序处于等待状态,界面似乎是“死”掉了。为 了解决这个问题,必须把这个任务放置到单独线程中运行,避免阻塞 UI 线程,这样就不会对主线程有任 何影响。举个例子如下: private void connect(String strURL){ new Thread() { public void run() { try { HttpClient client = new DefaultHttpClient(); // params[0]代表连接的 url HttpGet get = new HttpGet(url.getText().toString()); HttpResponse response = client.execute(get); HttpEntity entity = response.getEntity(); long length = entity.getContentLength(); InputStream is = entity.getContent(); String s = null; if (is != null) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buf = new byte[128]; int ch = -1; int count = 0; while ((ch = is.read(buf)) != -1) { baos.write(buf, 0, ch); count += ch; } s = new String(baos.toByteArray()); Log.V(“moandroid sample”,s); } } catch (Exception e) { e.printStackTrace(); } } }.start(); } 使用 Handler 更新界面 如何将下载的信息显示在界面上了,比如说下载的进度。Android SDK 平台只允许在主线程中调用相关 View 的方法来更新界面。如果返回结果在新线程中获得,那么必须借助 Handler 来更新界面。为此,在 界面 Activity 中创建一个 Handler 对象,并在 handleMessage()中更新 UI。 //Task 在另外的线程执行,不能直接在 Task 中更新 UI,因此创建了 Handler private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { String m = (String) msg.obj; message.setText(m); } }; 只需要将上面的 Log.V(“moandroid sample”,s); 替换为: s = new String(baos.toByteArray()); Message mg = Message.obtain(); mg.obj = s; handler.sendMessage(mg); AsyncTask 看上去修改后的 connect()方法已经可用了,但是这种匿名程的方式是存在缺陷的:  线程的开销较大,如果每个任务都要创建一个线程,那么应用程 序的效率要低很多;  线程无法管理,匿名线程创建并启动后就不受程序的控制了,如果有很多个请求发送,那么就会 启动非常多的线程,系统将不堪重负。  另外,前面已经看到,在新线程中更新 UI 还必须要引入 handler,这让代码看上去非常臃肿。 为了解决这一问题,Android 在 1.5 版本引入了 AsyncTask。AsyncTask 的特点是任务在主线程之外运 行,而回调方法是在主线程中执行,这就有效地避免了使用 Handler 带来的麻烦。阅读 AsyncTask 的源 码可知,AsyncTask 是使用 java.util.concurrent 框架来管理线程以及任务的执行的,concurrent 框 架是一个非常成熟,高效的框架,经过了严格的测试。这说明 AsyncTask 的设计很好的解决了匿名线程 存在的问题。 AsyncTask 是抽象类,其结构图如下图所示: AsyncTask 定义了三种泛型类型 Params,Progress 和 Result。  Params 启动任务执行的输入参数,比如 HTTP 请求的 URL。  Progress 后台任务执行的百分比。  Result 后台执行任务最终返回的结果,比如 String。 子类必须实现抽象方法 doInBackground(Params… p) ,在此方法中实现任务的执行工作,比如连接网 络获取数据等。通常还应该实现 onPostExecute(Result r)方法,因为应用程序关心的结果在此方法中返 回。需要注意的是 AsyncTask 一定要在主线程中创建实例。 AsyncTask 的执行分为四个步骤,每一步都对应一个回调方法,需要注意的是这些方法不应该由应用程序 调用,开发者需要做的就是实现这些方法。在任务的执行过程中,这些方法被自动调用,运行过程,如下 图所示:  onPreExecute() 当任务执行之前开始调用此方法,可以在这里显示进度对话框。  doInBackground(Params…) 此方法在后台线程执行,完成任务的主要工作,通常需要较长的 时间。在执行过程中可以调用 publicProgress(Progress…)来更新任务的进度。  onProgressUpdate(Progress…) 此方法在主线程执行,用于显示任务执行的进度。  onPostExecute(Result) 此方法在主线程执行,任务执行的结果作为此方法的参数返回。 举个简单的例子如下: // 设置三种类型参数分别为 String,Integer,String class PageTask extends AsyncTask { // 可变长的输入参数,与 AsyncTask.exucute()对应 @Override protected String doInBackground(String… params) { try { HttpClient client = new DefaultHttpClient(); // params[0]代表连接的 url HttpGet get = new HttpGet(params[0]); HttpResponse response = client.execute(get); HttpEntity entity = response.getEntity(); long length = entity.getContentLength(); InputStream is = entity.getContent(); String s = null; if (is != null) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buf = new byte[128]; int ch = -1; int count = 0; while ((ch = is.read(buf)) != -1) { baos.write(buf, 0, ch); count += ch; if (length > 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()分别实现数据报的发送与接受,如下图所示:
本文档为【Android_实现联网】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_322752
暂无简介~
格式:pdf
大小:871KB
软件:PDF阅读器
页数:0
分类:互联网
上传时间:2013-05-07
浏览量:12