一、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. ios自定义View自动布局时计算大小

    https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/Impleme ...

  2. python 使用 setup.py 方式安装及包的卸载

     安装:         可通过 --home 或 --prefix 指定安装目录 --prefix=xx/xxx    选择安装目录 --record files.txt   记录所有安装文件的路径 ...

  3. Rdlc报表出现空白页解决方法

    在使用RDLC报表时,碰到这种情况:当只有一页数据时,报表确显示两页,第二页除了报表头之外数据为空.然后,当有多页数据时,最后一页为空. RDLC報表設計好後,在ReportViewer預覽報表時,頁 ...

  4. Codeforces 707 E. Garlands (二维树状数组)

    题目链接:http://codeforces.com/problemset/problem/707/E 给你nxm的网格,有k条链,每条链上有len个节点,每个节点有一个值. 有q个操作,操作ask问 ...

  5. halcon,C# 学习

    Halcon学习之一:查询图像参数 1.get_grayval ( Image : : Row, Column : Grayval ) 计算Image图像中坐标为(Row,Column)的点的灰度值G ...

  6. java 对excel操作 读取、写入、修改数据;导出数据库数据到excel

    ============前提加入jar包jxl.jar========================= // 从数据库导出数据到excel public List<Xskh> outPu ...

  7. 26.怎样在Swift中定义宏?

    Swift 中没有宏定义,苹果建议使用let 或者 get 属性来替代宏定义值.虽然没有#define,但我们仍然可以使用 #if 并配合编译的配置来完成条件编译.下面会列出Swift项目开发中的一些 ...

  8. extjs tablepanel 高度自适应有关问题

    extjs tablepanel 高度自适应问题 项目中为了给客户好点的功能切换体验,想到了用extjs的tabpanel 在页面中用了tabpanel后,高度新打开的tab页的iframe 的高度总 ...

  9. 分享一个导出Excel时页面不跳转的小技巧

    今天在点击客户档案导出的时候,发现先是打开了一个新标签,然后新标签自动关掉,弹出一个文件下载确认的窗口,点击确认后开始下载导出的Excel文件.这样的过程感觉窗口闪来闪去,而且可能会给用户带来困惑,是 ...

  10. VPW Communication Protocol

    http://www.fastfieros.com/tech/vpw_communication_protocol.htm Breakdown of the j1850 3 byte Header f ...