一、Android网络通信

  android网络通信一般有三种:java.net.*(标准Java接口)、org.apache接口(基于http协议)和android.net.*(Android网络接口),涉及到包括流、数据包套接字(socket)、Internet协议、常见Http处理等。android 内置HttpClient,简化和网站间的交互。但是不支持Web Services,需要利用ksoap2_android才能支持。

1、使用Socket进行通信
  Socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。Android Socket开发和JAVA Socket开发类似
无非是创建一个Socket服务端和Socket客户端进行通信。
Socket服务端代码:

 try{
// 新建服务器Socket
ServerSocket ss = new ServerSocket(8888);
System.out.println("Listening...");
while(true){
// 监听是否有客户端连上
Socket socket = ss.accept();
System.out.println("Client Connected...");
DataOutputStream dout = new DataOutputStream(socket.getOutputStream());
Date d = new Date();
// 演示传送个 当前时间给客户端
dout.writeUTF(d.toLocaleString());
dout.close();
socket.close();
}
}
catch(Exception e){
e.printStackTrace();
}
}

Socket客户端代码:

 public void connectToServer(){                    //方法:连接客户端
try{
Socket socket = new Socket("10.0.2.2", 8888);//创建Socket对象
DataInputStream din = new DataInputStream(socket.getInputStream()); //获得DataInputStream对象
String msg = din.readUTF(); //读取服务端发来的消息
EditText et = (EditText)findViewById(R.id.et); //获得EditText对象
if (null != msg) {
et.setText(msg); //设置EditText对象
}else {
et.setText("error data");
} }
catch(Exception e){ //捕获并打印异常
e.printStackTrace();
}
}

  服务端是普通JAVA项目,先启动服务端,再启动客户端Android项目,客户端连上服务端,把当前时间数据从服务端发往客户端显示出来

注意:服务器与客户端无法链接的可能原因有:
a、AndroidManifest没有加访问网络的权限:<uses-permission android:name="android.permission.INTERNET"></uses-permission>
b、IP地址要使用:10.0.2.2,不能用localhost
c、模拟器不能配置代理

2、使用Http进行通信
  使用HttpClient在Android客户端访问Web,有点html知识都知道,提交表单有两种方式
get和post,Android客户端访问Web也是这两种方式。在本机先建个web应用(方便演示)。
data.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>

启动tomcat,访问http://192.168.1.101:8080/test/data.jsp?parameter=发送的参数

注意:192.168.1.101是我本机的IP,要替换成自己的IP。

按钮监听代码:

 //绑定按钮监听器
get.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//注意:此处ip不能用127.0.0.1或localhost,Android模拟器已将它自己作为了localhost
String uri = "http://192.168.1.101:8080/test/data.jsp?parameter=以Get方式发送请求";
textView.setText(get(uri));
}
});
//绑定按钮监听器
post.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String uri = "http://192.168.1.101:8080/test/data.jsp";
textView.setText(post(uri));
}
});

get方式请求代码:

 /**
* 以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方式请求代码:

 /**
* 以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;
}

点击'get'按钮:

点击'post'按钮

3、获取http网络资源

  其实这里就是前面讲Android数据存储的最后一种:网络存储。将txt文件和png图片放在tomcat服务器上,模拟器通过http路径去获取资源显示出来。

获取路径为:

     String stringURL = "http://192.168.1.101:8080/test/test.txt";
String bitmapURL = "http://192.168.1.101:8080/test/crab.png";

获取文本资源代码:

 //方法,根据指定URL字符串获取网络资源
public void getStringURLResources(){
try{
URL myUrl = new URL(stringURL);
URLConnection myConn = myUrl.openConnection(); //打开连接
InputStream in = myConn.getInputStream(); //获取输入流
BufferedInputStream bis = new BufferedInputStream(in);//获取BufferedInputStream对象
ByteArrayBuffer baf = new ByteArrayBuffer(bis.available());
int data = 0;
while((data = bis.read())!= -1){ //读取BufferedInputStream中数据
baf.append((byte)data); //将数据读取到ByteArrayBuffer中
}
String msg = EncodingUtils.getString(baf.toByteArray(), "GBK"); //转换为字符串,用UTF-8中文会乱码
EditText et = (EditText)findViewById(R.id.et); //获得EditText对象
et.setText(msg); //设置EditText控件中的内容
}
catch(Exception e){
e.printStackTrace();
}
}

获取图片资源代码:

 public void getBitmapURLResources(){
try{
URL myUrl = new URL(bitmapURL); //创建URL对象
URLConnection myConn = myUrl.openConnection(); //打开连接
InputStream in = myConn.getInputStream(); //获得InputStream对象
Bitmap bmp = BitmapFactory.decodeStream(in); //创建Bitmap
ImageView iv = (ImageView)findViewById(R.id.iv); //获得ImageView对象
iv.setImageBitmap(bmp); //设置ImageView显示的内容
}
catch(Exception e){
e.printStackTrace();
}
}

 注意:String msg = EncodingUtils.getString(baf.toByteArray(), "GBK");//转换为字符串,用UTF-8中文会乱码

运行效果:

android学习日记14--网络通信的更多相关文章

  1. android学习日记05--Activity间的跳转Intent实现

    Activity间的跳转 Android中的Activity就是Android应用与用户的接口,所以了解Activity间的跳转还是必要的.在 Android 中,不同的 Activity 实例可能运 ...

  2. android学习日记03--常用控件Dialog

    常用控件 9.Dialog 我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择.这些功能我们叫它Android Dialog对话框 对话框,要创建对话框之前首先要创建Bui ...

  3. android学习日记03--常用控件checkbox/radiobutton

    常用控件3.checkbox 复选框,确定是否勾选,点击一下勾选,点击第二下取消,当有一系列备选项时适合用checkbox控件,方便用户提交数据. 贴上例子Activity的java代码 packag ...

  4. android学习日记03--常用控件button/imagebutton

    常用控件 控件是对数据和方法的封装.控件可以有自己的属性和方法.属性是控件数据的简单访问者.方法则是控件的一些简单而可见的功能.所有控件都是继承View类 介绍android原生提供几种常用的控件bu ...

  5. android学习日记20--连接组件之Intent和IntentFilter

    上次刚了解完Android的四大组件,现在学习组件间通信的Intent和IntentFilter 一.Intent 1.简述 Intent(意图)在应用程序运行时连接两个不同组件,是一种运行时的绑定机 ...

  6. android学习日记0--开发需要掌握的技能

    一.开发android,我们需要哪些技能基础 1.Java基础知识 2.Linux基础知识 3.数据库基础知识 4.网络协议 5.Android基础知识 6.服务器端开发知识 1.Java基础知识 很 ...

  7. android学习日记06--View视图

    一.android 界面开发 1.三个重要的类:View视图.Canvas画布.Paint画笔2.android 界面开发常用三种视图 View            --只能在主线程中更新,没有缓存 ...

  8. android学习日记02--Activity简介

    一.Activity活动 学习Android,第一个都会接触Activity滴,Activity表示一个用户界面,是Android应用程序的入口,可以同时有多个界面,但只会显示栈顶的界面. Activ ...

  9. 【转】android学习日记01--综述

    转自:http://www.cnblogs.com/aiguozhe/p/3541941.html 一.总体框架 先上一张google提供官方的Android框架图: Android系统架构由5部分组 ...

随机推荐

  1. How to Keep Alive SSH Sessions

    How to Keep Alive SSH Sessions Many NAT firewalls time out idle sessions after a certain period of t ...

  2. Ubuntu14.04下安装QQ 国际版

    在/etc/apt/source.list文件中添加: deb http://packages.linuxdeepin.com/deepin trusty main non-free universe ...

  3. python异常以及面向对象编程

    一.面向对象 需要注意的是,在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__na ...

  4. JIT(动态编译)和AOT(静态编译)编译技术比较

    Java 应用程序的性能经常成为开发社区中的讨论热点.因为该语言的设计初衷是使用解释的方式支持应用程序的可移植性目标,早期 Java 运行时所提供的性能级别远低于 C 和 C++ 之类的编译语言.尽管 ...

  5. 第三百二十二天 how can I 坚持

    昨晚好像一直在做梦,模模糊糊的,其实很难受. 真不知道该怎么办了,是没有勇气,还是怕什么,总之, 不知道该咋办了. 搞不懂. 回来第二天了,节奏又一点的开始了,一年又会很快过去. 刘松说要来北京,整天 ...

  6. 转】MyEclipse10安装Log4E插件

    原博文出自于:http://www.cnblogs.com/xdp-gacl/p/4231812.html 感谢! 一. Log4E插件下载 下载地址:http://log4e.jayefem.de/ ...

  7. 【131】如何讲好PPT

    1 列提纲2 写稿子3 背稿子4 演练5遍,用自己的话说出来,最好和稿子一样,但不强求一样,关键要理解5 不一定要做,但是做好了会有很大提高,讲的时候也会很NB:有时间可以再演练几遍,录出来看看哪里需 ...

  8. [原创]Devexpress XtraReports 系列 6 创建并排报表

    昨天我们已经介绍了如何创建交叉报表,详见:[原创]Devexpress XtraReports 系列 5 创建交叉报表 今天我们继续我们的XtraReports系列.Demo和数据库文件最后会附上. ...

  9. excel分组求和

    =SUMPRODUCT((C2:C99=F2)*(B2:B99)) 说明: C2:C99=F2 找到C2到C99之间的等于F2的值 如果有多个判断条件,采用*来管理 B2:B99 求和

  10. Field 'SCHED_TIME' doesn't have a default value

    出现这个情况的原因是: 我jar包使用的是quartz-2.1.7版本,但是初始化集群的dbTables脚本用的却是2.2.1版本的,导致出现这个异常,改用2.1.7的dbTables脚本之后即解决问 ...