Android的三种网络通信方式
Android平台有三种网络接口可以使用,他们分别是:java.net.*(标准Java接口)、Org.apache接口和Android.net.*(Android网络接口)。下面分别介绍这些接口的功能和作用。
1.标准Java接口
java.net.*提供与联网有关的类,包括流、数据包套接字(socket)、Internet协议、常见Http处理等。比如:创建URL,以及URLConnection/HttpURLConnection对象、设置链接参数、链接到服务器、向服务器写数据、从服务器读取数据等通信。这些在Java网络编程中均有涉及,我们看一个简单的socket编程,实现服务器回发客户端信息。
服务端:
- public class Server implements Runnable{
- @Override
- public void run() {
- Socket socket = null;
- try {
- ServerSocket server = new ServerSocket(18888);
- //循环监听客户端链接请求
- while(true){
- System.out.println("start...");
- //接收请求
- socket = server.accept();
- System.out.println("accept...");
- //接收客户端消息
- BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
- String message = in.readLine();
- //发送消息,向客户端
- PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
- out.println("Server:" + message);
- //关闭流
- in.close();
- out.close();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }finally{
- if (null != socket){
- try {
- socket.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
- //启动服务器
- public static void main(String[] args){
- Thread server = new Thread(new Server());
- server.start();
- }
- }
客户端,MainActivity
- public class MainActivity extends Activity {
- private EditText editText;
- private Button button;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- editText = (EditText)findViewById(R.id.editText1);
- button = (Button)findViewById(R.id.button1);
- button.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- Socket socket = null;
- String message = editText.getText().toString()+ "\r\n" ;
- try {
- //创建客户端socket,注意:不能用localhost或127.0.0.1,Android模拟器把自己作为localhost
- socket = new Socket("<span style="font-weight: bold;">10.0.2.2</span>",18888);
- PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter
- (socket.getOutputStream())),true);
- //发送数据
- out.println(message);
- //接收数据
- BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
- String msg = in.readLine();
- if (null != msg){
- editText.setText(msg);
- System.out.println(msg);
- }
- else{
- editText.setText("data error");
- }
- out.close();
- in.close();
- } catch (UnknownHostException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- finally{
- try {
- if (null != socket){
- socket.close();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- });
- }
- }
布局文件:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical" android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <TextView android:layout_width="fill_parent"
- android:layout_height="wrap_content" android:text="@string/hello" />
- <EditText android:layout_width="match_parent" android:id="@+id/editText1"
- android:layout_height="wrap_content"
- android:hint="input the message and click the send button"
- ></EditText>
- <Button android:text="send" android:id="@+id/button1"
- android:layout_width="fill_parent" android:layout_height="wrap_content"></Button>
- </LinearLayout>
启动服务器:
- javac com/test/socket/Server.java
- java com.test.socket.Server
运行客户端程序:
结果如图:
注意:服务器与客户端无法链接的可能原因有:
没有加访问网络的权限:<uses-permission android:name="android.permission.INTERNET"></uses-permission>
IP地址要使用:10.0.2.2
模拟器不能配置代理。
2。Apache接口
对于大部分应用程序而言JDK本身提供的网络功能已远远不够,这时就需要Android提供的Apache HttpClient了。它是一个开源项目,功能更加完善,为客户端的Http编程提供高效、最新、功能丰富的工具包支持。
下面我们以一个简单例子来看看如何使用HttpClient在Android客户端访问Web。
首先,要在你的机器上搭建一个web应用myapp,只有很简单的一个http.jsp
内容如下:
- <%@page language="java" import="java.util.*" pageEncoding="utf-8"%>
- <html>
- <head>
- <title>
- Http Test
- </title>
- </head>
- <body>
- <%
- String type = request.getParameter("parameter");
- String result = new String(type.getBytes("iso-8859-1"),"utf-8");
- out.println("<h1>" + result + "</h1>");
- %>
- </body>
- </html>
然后实现Android客户端,分别以post、get方式去访问myapp,代码如下:
布局文件:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <TextView
- android:gravity="center"
- android:id="@+id/textView"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="@string/hello"
- />
- <Button android:text="get" android:id="@+id/get" android:layout_width="match_parent" android:layout_height="wrap_content"></Button>
- <Button android:text="post" android:id="@+id/post" android:layout_width="match_parent" android:layout_height="wrap_content"></Button>
- </LinearLayout>
资源文件:
strings.xml
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <string name="hello">通过按钮选择不同方式访问网页</string>
- <string name="app_name">Http Get</string>
- </resources>
主Activity:
- public class MainActivity extends Activity {
- private TextView textView;
- private Button get,post;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- textView = (TextView)findViewById(R.id.textView);
- get = (Button)findViewById(R.id.get);
- post = (Button)findViewById(R.id.post);
- //绑定按钮监听器
- get.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- //注意:此处ip不能用127.0.0.1或localhost,Android模拟器已将它自己作为了localhost
- String uri = "http://192.168.22.28:8080/myapp/http.jsp?parameter=以Get方式发送请求";
- textView.setText(get(uri));
- }
- });
- //绑定按钮监听器
- post.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- String uri = "http://192.168.22.28:8080/myapp/http.jsp";
- textView.setText(post(uri));
- }
- });
- }
- /**
- * 以get方式发送请求,访问web
- * @param uri web地址
- * @return 响应数据
- */
- private static String get(String uri){
- BufferedReader reader = null;
- StringBuffer sb = null;
- String result = "";
- HttpClient client = new DefaultHttpClient();
- HttpGet request = new HttpGet(uri);
- try {
- //发送请求,得到响应
- HttpResponse response = client.execute(request);
- //请求成功
- if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
- reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
- sb = new StringBuffer();
- String line = "";
- String NL = System.getProperty("line.separator");
- while((line = reader.readLine()) != null){
- sb.append(line);
- }
- }
- } catch (ClientProtocolException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- finally{
- try {
- if (null != reader){
- reader.close();
- reader = null;
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- if (null != sb){
- result = sb.toString();
- }
- return result;
- }
- /**
- * 以post方式发送请求,访问web
- * @param uri web地址
- * @return 响应数据
- */
- private static String post(String uri){
- BufferedReader reader = null;
- StringBuffer sb = null;
- String result = "";
- HttpClient client = new DefaultHttpClient();
- HttpPost request = new HttpPost(uri);
- //保存要传递的参数
- List<NameValuePair> params = new ArrayList<NameValuePair>();
- //添加参数
- params.add(new BasicNameValuePair("parameter","以Post方式发送请求"));
- try {
- //设置字符集
- HttpEntity entity = new UrlEncodedFormEntity(params,"utf-8");
- //请求对象
- request.setEntity(entity);
- //发送请求
- HttpResponse response = client.execute(request);
- //请求成功
- if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
- System.out.println("post success");
- reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
- sb = new StringBuffer();
- String line = "";
- String NL = System.getProperty("line.separator");
- while((line = reader.readLine()) != null){
- sb.append(line);
- }
- }
- } catch (ClientProtocolException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- finally{
- try {
- //关闭流
- if (null != reader){
- reader.close();
- reader = null;
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- if (null != sb){
- result = sb.toString();
- }
- return result;
- }
- }
运行结果如下:
3.android.net编程:
常常使用此包下的类进行Android特有的网络编程,如:访问WiFi,访问Android联网信息,邮件等功能。这里不详细讲。
Android的三种网络通信方式的更多相关文章
- VMware的三种网络连接方式区别
关于VMware的三种网络连接方式,NAT,Bridged,Host-Only ,在刚接触的时候通常会遇到主机Ping不通虚拟机而虚拟机能Ping得通主机:主机与虚拟机互不相通等等网络问题.本文就这三 ...
- 简单区分VMware的三种网络连接模式(bridged、NAT、host-only)
艺搜简介 VMware在安装时默认安装了两块虚拟网卡,VMnet1和VMnet8,另外还有VMnet0.这些虚拟网卡的配置都是由Vmware虚拟机自动生成的,一般来说不需要用户自行设置. Vmware ...
- vmware虚拟机三种网络模式详解_转
原文来自http://note.youdao.com/share/web/file.html?id=236896997b6ffbaa8e0d92eacd13abbf&type=note 由于L ...
- VMware虚拟系统 bridged、NAT、host-only三种网络连接模式
目录 前言 bridged(桥接模式) NAT(网络地址转换模式) host-only(仅主机模式) 总结 前言 如果你想利用VMWare安装虚拟机,或想创建一个与网内其他机器相隔离的虚拟系统,进行特 ...
- Android动画 三种动画
Android可以使用三种动画 Frame Animation-帧动画 ,就像GIF图片,通过一系列Drawable依次显示来模拟动画的效果 Tween Animation-补间动画,给出两个关键帧, ...
- Vmware虚拟机三种网络模式详解
原文来自http://note.youdao.com/share/web/file.html?id=236896997b6ffbaa8e0d92eacd13abbf&type=note 我怕链 ...
- VMware三种网络模式
VMware网络配置详解一:三种网络模式简介安装好虚拟机以后,在网络连接里面可以看到多了两块网卡: 其中VMnet1是虚拟机Host-only模式的网络接口,VMnet8是NAT模式的网络接口,这些后 ...
- Host Only、NAT和Bridge三种网络连接
Host Only.NAT和Bridge三种网络连接 在安装好了Linux镜像之后,如何连接物理机和虚拟机呢?这就需要网络连接,网络连接有三种:HostOnly.NAT.Bridge,它们都可用于Gu ...
- vmware三种网络模式的工作原理及配置详解
vmware为我们提供了三种网络工作模式,它们分别是:Bridged(桥接模式).NAT(网络地址转换模式).Host-Only(仅主机模式). 打开vmware虚拟机,我们可以在选项栏的“编辑”下的 ...
随机推荐
- (转)使用SVN+CruiseControl+ANT实现持续集成之一
在前面的文章中, 介绍自己当时所在团队的处境(使用.NET开发),一个不到十个人的研发团队在保证正常开发进度同时需要并发支持四.五十个项目问题处理,经常为了程序版 本冲突.日常测试版本.发布版本提供等 ...
- [Bootstrap]概述
——1.html,css,javascript框架 ——2.一般开发响应式布局或者移动优先的项目可以优先考虑 优点 1.css开发版本(可以直接上手)和源码版本(可根据l ...
- emacs_1
--> 正在处理依赖关系 perl(VMS::Filespec),它被软件包 perl-PathTools-3.2701-1.el5.rf.x86_64 需要---> 软件包 perl-p ...
- 小黑的镇魂曲(HDU2155:贪心+dfs+奇葩解法)
题目:点这里 题目的意思跟所谓的是英雄就下100层一个意思……在T秒内能够下到地面,就可以了(还有一个板与板之间不能超过H高). 接触这题目是在昨晚的训练赛,当时拍拍地打了个贪心+dfs,果断跟我想的 ...
- linux命令之vim使用-(转)vim的保存文件和退出命令
博客地址: http://blog.sina.com.cn/s/blog_5e357d2d0100zmth.html
- H5全景视频VR视频
公司的有个专题页面涉及到全景视频展示这个技术点,找到一个相关的库. http://www.utovr.com/sdk/download 这里有个免费的SDK可以下载. 里面也有案例可以看,代码就照着 ...
- Redis 与 数据库处理数据的两种模式(转)
Redis 是一个高性能的key-value数据库. redis的出现,很大程度补偿了memcached这类key-value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用.它提供了Pyt ...
- HTML5会砸掉iOS和Android开发者的饭碗么?
原生App的颠覆 HTML5的“性工能”障碍得到解决,可以接近原生App的效果,所以它就可以替代原生App吗?很多人认为,即使HTML5会发展的比现在好,也将是与原生App各占一部分市场的格局,要求不 ...
- phpcms v9二级栏目生成到根目录后三级栏目无法访问的解决办法
这个栏目问题折腾了我一天多,可怜我这个美工又不会程序!!! 我的问题是: 我的栏目设置如下: 一级栏目[生成到根目录(是)]> 二级栏目[生成到根目录(是)] > 三级栏目[生成到根目录( ...
- PHP的$_SERVER['HTTP_HOST']获取服务器地址功能详解,$_SERVER['HTTP_X_FORWARDED_HOST']
uchome的index文件中的二级域名功能判断,使用了php的$_SERVER['HTTP_HOST'],开始对这个不是很了解,所以百度了一下,发现一篇帖子有点意思,转发过来做个记录. 在php中, ...