Web连接服务器
连接web服务器两种方式
一 重写URL地址(get post)
package com.example.gdget;
public class MainActivity extends Activity {
private Button downImage;
private ImageView showImage;
private static String URL_PATH="http://192.168.1.108:8080/myhttp/text.jpg";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//从服务器获得图片保存到本地
downImage=(Button) findViewById(R.id.dangloudImage);
showImage=(ImageView)findViewById(R.id.showImage);
downImage.setOnClickListener(new DownImageOnclicklinner());
}
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
Bitmap pic =(Bitmap)msg.obj;
//主线程接收这个信息
showImage.setImageBitmap(pic);
}
};
class DownImageOnclicklinner implements OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
new Thread(){
public void run() {
try {
URL url = new URL(URL_PATH);
//URl 是一个解析器解析地址
HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();
//HttpURLConnection 是URLConnection的子类,这个子类可以实现Http通信
httpURLConnection.setConnectTimeout(3000);
//设置访问时间3秒
httpURLConnection.setDoInput(true);
//setDoInput 允许输入
httpURLConnection.setRequestMethod("GET");
//用GET方法访问
int responseCode=httpURLConnection.getResponseCode();
// 获得服务器的相应码 200 是联通
if(responseCode==200){
InputStream inputStream=httpURLConnection.getInputStream();
Bitmap pic = BitmapFactory.decodeStream(inputStream);
//Bitmap 是解析图片的类
Message message = new Message();
//可以向Message保存信息
message.obj=pic;
//message.obj 可以复制是Object类型
MainActivity.this.handler.sendMessage(message);
//主线程调用Handler的sendMessage() 把这个信息从子线程返回到主线程
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
}.start();
}
}
}
二 Post提交方式Tomcat上面的一种技术
package com.example.gdpost;
public class MainActivity extends Activity {
private EditText name,password;
private Button login;
private TextView showmsg;
private String URL_PATH="http://192.168.1.108:8080/myhttp";
//private Handler mainHandler,childHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
name=(EditText)findViewById(R.id.name);
password=(EditText)findViewById(R.id.password);
showmsg=(TextView)findViewById(R.id.showmsg);
login=(Button)findViewById(R.id.longin);
login.setOnClickListener(new ButtonOnClicklistner() );
//Message message = new Message();
}
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
MainActivity.this.showmsg.setText(msg.obj.toString());
}
};
class ButtonOnClicklistner implements OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
new Thread(){
public void run() {
String name = MainActivity.this.name.getText().toString();
String password=MainActivity.this.password.getText().toString();
System.out.println(name);
System.out.println(password);
List<NameValuePair> list = new ArrayList<NameValuePair>();
list.add(new BasicNameValuePair("username", name));
list.add(new BasicNameValuePair("password", password));
try {
HttpPost httpPost = new HttpPost("http://192.168.1.108:8080/myhttp/login");
UrlEncodedFormEntity entity= new UrlEncodedFormEntity(list, HTTP.UTF_8);
//设定指定参数的编码
httpPost.setEntity(entity);
//向服务器发送实体(里面包含指定参数 和参数的编码)
DefaultHttpClient client = new DefaultHttpClient();
//默认的Http客户端
HttpResponse httpResponse =client.execute(httpPost);
if(httpResponse.getStatusLine().getStatusCode()
==200){
InputStream inputStream= httpResponse.getEntity().getContent();
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
InputStreamReader inputStreamReader = new InputStreamReader(bufferedInputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String result =bufferedReader.readLine();
System.out.println(result);
Message message = new Message();
message.obj=result;
MainActivity.this.handler.sendMessage(message);
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} };
}.start();
}
}
}
流Stream
流可以从文件(对应的电脑的物理内存) ,网络 , 程序读写内容
流的分类
按照数据的方向不同可以分为输入流和输出流
按照数据单位不同可以分为字节流和字符流(字节:一个字节是八位。字符:是一个汉字 或是一个字母 ,一个汉字是两个字节,一个字母是一个字节)
按照功能不同可以分为节点流和处理流
(节点流:直接处理数据。 处理流:是封装节点流的流 例如缓冲流)
字节流 | 字符流 | |
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
字节输入流
(注:以InputStream为结尾的流都是xxx输入字节流,FileInputStream 文件输入流,这个流的读取单位是按照字节的形式读取的)
由于字节访问硬盘的次数非常平凡 所以对硬盘造成的伤害比较高 ,最好在内存建立一个小的空间 叫硬盘每次先填满这个空间在去访问硬盘,这个空间人们常用字节数组来建立 byte[] byte = new bute[1024]()
字节输出流
(对于流要关闭调用close方法 但是关闭之前注意要写flush方法 强制把把内容读完 )
字符输入流
字符输出流
(Write图有错误不是输入是输出)
节点流
节点流 (直接输入或是输出数据相当于管道直接连到我们的数据源上)
Pipe(管道) PipedInputstream:
PipedInputStream类与PipedOutputStream类用于在应用程序中创建管道通信.一个PipedInputStream实例对象必须和一个PipedOutputStream实例对象进行连接而产生一个通信管道.PipedOutputStream可以向管道中写入数据,PipedIntputStream可以读取PipedOutputStream向管道中写入的数据.这两个类主要用来完成线程之间的通信.一个线程的PipedInputStream对象能够从另外一个线程的PipedOutputStream对象中读取数据.
原来如此,不过这只是说说而已,具体怎么实现的呢,爱刨根问底的我可不会轻易放过这些疑惑,于是看了一下SUN源码这两个类的实现,恕本人比较愚钝,把玩了大半天,才稍微参透其中一些奥妙,故将心得体会在此写上,供各位批判:)
首先简单的介绍一下这两个类的实现原理,PipedInputStream和PipedOutputStream的实现原理类似于"生产者-消费者"原理,PipedOutputStream是生产者,PipedInputStream是消费者,在PipedInputStream中有一个buffer字节数组,默认大小为1024,作为缓冲区,存放"生产者"生产出来的东东.还有两个变量,in,out,in是用来记录"生产者"生产了多少,out是用来记录"消费者"消费了多少,in为-1表示消费完了,in==out表示生产满了.当消费者没东西可消费的时候,也就是当in为-1的时候,消费者会一直等待,直到有东西可消费.
因为生产和消费的方法都是synchronized的(写到这里,我去研究了一下synchronized的用法,才知道synchronized是对对象上锁,之前一直以为只是对这个方法上锁,别的synchronized方法仍然可以进入,哎,惭愧惭愧~~),所以肯定是生产者先生产出一定数量的东西,消费者才可以开始消费,所以在生产的时候发现in==out,那一定是满了,同理,在消费的时候发现in==out,那一定是消费完了,因为生产的东西永远要比消费来得早,消费者最多可以消费和生产的数量相等的东西,而不会超出.
好了,介绍完之后,看看SUN高手是怎么实现这些功能的.由于buffer(存放产品的通道)这个关键变量在PipedInputStream消费者这个类中,所以要想对buffer操作,只能通过PipedInputStream来操作,因此将产品放入通道的操作是在PipedInputStream中.
InputStream的个人体会1:
对于读出来的内容最后一定是String
形成String有两种方式 由InputString 读出来的是字节 ,字节可以用 String str = new String()封装一个byte数组对象,如下:
URL url = new URL(str);
HttpURLConnection httpconnectin = (HttpURLConnection)url.openConnection();
byte data[] = new byte[1024];
InputStream in = httpconnectin.getInputStream();
int len =in.read(data);
while(len>0){
String tem= new String(data,0,len).trim();
}
第二种方式是由字节流转化字符流在由转化成String类型
StringBuffer sb = new StringBuffer();
String line = null;
BufferedReader bufferader =null;
try {
url = new URL(urlStr);
InputStream in=url.openStream();
//HttpURLConnection urlConn =(HttpURLConnection)url.openConnection();
bufferader= new BufferedReader(new InputStreamReader(in));
while((line=bufferader.readLine())!=null){
sb.append(line);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
bufferader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return sb.toString();
注意后者比前者要好 因为前者是在读取字节,每次读取一个字节都要访问硬盘一次,对硬盘伤害较大
InputStream的个人体会2
InputStream in = httpconnectin.getInputStream();
BufferedInputStream bufferedInputStream =new BufferedInputStream(in);
/**BufferedInputStream是InputStream的缓冲流不能对其他的流封装
读出来的依旧是字节的形式 只不过就是一组一组的字节
*/
InputStreamReader inputStreamReader = new InputStreamReader(bufferedInputStream);
/** InputStreamReader 是字节流转化成字符的包装过程一个汉字是两个字节 一个字母是一个字节 多个字符组成一个字符串
*/
BufferedReader bufferedReader= new BufferedReader(inputStreamReader);
/** BufferedReader是Reader的缓冲流 Reader是字符流 所以BufferedReader读出来的是一组一组的字符,而一组字符就组成了一个字符串
*/
消息机制Message ,Handler,Looper
消息的封锁类 Message
Message常用变量
Public int what :变量 用于定义此Message属于何种操作
Public Object obj:用于定义此Message传递的信息数据
消息的操作类Handler(用于提取Message封装信息的类)
Handler的常用方法
Public void handleMessage(Message msg) :
处理信息的方法,子类要覆盖此方法
Public final Boolean sendMessage(Message msg) :
发送消息
Handler是把Message的信息返回给主线程Activity这个类,并不是把这个消息返回给Activity的Oncreate方法,所以在Activity类中直接写Handler
的匿名内部类以实现handlerMessage方法
Looper(通道)
Looper的主要方法
Public static final synchronized Looper getMainLooper():取回主线程
Public static final Looper myLooper(): 返回当前线程
Public static final void prepare 初始化Looper对象
Looper是Message与Handler通信的管道在Activity中会自动的定义Looper这个管道,但是在自己定义的类中就没有,这时Message和Handler就无法通信。
Message,Handler,Looper之间的关系
子线程 |
Handler |
主线程Activity或是或是其他的类 |
Handler用于返回Message信息给主线程 |
Looper |
Message封装信息 |
Looper(管道) |
JsonService
public class JsonService {
public void getPerson(){
HttpTooles httpTooles= new HttpTooles();
String str= httpTooles.getJsonConnection();
JsonTooles jsonTooles = new JsonTooles();
Person person= jsonTooles.getPeson(str);
person.getAddress();
int age= person.getAge();
String name= person.getName();
System.out.println( person.getAddress());
System.out.println(name);
System.out.println(age);
}
public void getPersons(){
HttpTooles httpTooles= new HttpTooles();
String str=httpTooles.getJsonConnection();
JsonTooles jsonTooles =new JsonTooles();
List <Person> list = JsonTooles.getListPerson(str);
for (int i = 0; i < list.size(); i++) {
Person person =list.get(i);
System.out.println( person.getAddress());
System.out.println(person.getAge());
System.out.println(person.getName());
}
}
public void getListString(){
HttpTooles httpTooles= new HttpTooles();
String str=httpTooles.getJsonConnection();
JsonTooles jsonTooles =new JsonTooles();
List <String> list = JsonTooles.getListString(str);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
public void getListMap(){
HttpTooles httpTooles= new HttpTooles();
String str=httpTooles.getJsonConnection();
JsonTooles jsonTooles =new JsonTooles();
List<Map<String, String>> list= jsonTooles.getListMap(str);
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
Map<String, String> map = (Map<String, String>) iterator.next();
System.out.println(map.get("地址"));
}
}
}
Activity implement OnclickListener
public class MainActivity extends Activity implements OnClickListener {
private Button person ,persons,listString ,listMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
person =(Button)findViewById(R.id.person);
persons =(Button)findViewById(R.id.persons);
listString =(Button)findViewById(R.id.listString);
listMap =(Button)findViewById(R.id.listMap);
person.setOnClickListener(this);
persons.setOnClickListener(this);
listString.setOnClickListener(this);
listMap.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.person:
new Thread(){
public void run() {
JsonService jsonService = new JsonService();
jsonService.getPerson();
};
}.start();
break;
case R.id.persons:
new Thread(){
public void run() {
JsonService jsonService = new JsonService();
jsonService.getPersons();};
}.start();
break;
case R.id.listMap:
new Thread(){
public void run() {
JsonService jsonService = new JsonService();
jsonService.getListMap();
};
}.start();
break;
case R.id.listString:
new Thread(){
public void run() {
JsonService jsonService = new JsonService();
jsonService.getListString();
};
}.start();
break;
default:
break;
}
}
JsonTooles
package com.example.JsonTooles;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.example.person.Person;
public class JsonTooles {
//把Json串 拆解 组成Person对象
public static Person getPeson(String str){
Person person = new Person();
try {
JSONObject jsonObject = new JSONObject(str);
JSONObject jsonObject2=jsonObject.getJSONObject("person");
String address =jsonObject2.getString("address");
int age =jsonObject2.getInt("age");
String name =jsonObject2.getString("name");
person.setAddress(address);
person.setAge(age);
person.setName(name);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return person;
}
public static List<Person> getListPerson(String str){
List <Person> list = new ArrayList<Person>();
try {
JSONObject jsonObject = new JSONObject(str);
JSONArray jsonArray = jsonObject.getJSONArray("persons");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject2 = jsonArray.getJSONObject(i);
Person person= new Person();
person.setAddress(jsonObject2.getString("address"));
person.setAge( jsonObject2.getInt("age"));
person.setName( jsonObject2.getString("name"));
list.add(person);
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
public static List<String> getListString(String str){
List<String> list = new ArrayList<String>();
try {
JSONObject jsonObject = new JSONObject(str);
JSONArray jsonArray =jsonObject.getJSONArray("liststring");
for (int i = 0; i < jsonArray.length(); i++) {
String msg= jsonArray.getString(i);
list.add(msg);
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
public static List<Map<String,String>> getListMap(String str){
List<Map<String ,String>> list = new ArrayList<Map<String, String>>();
try {
JSONObject jsonObject = new JSONObject(str);
JSONArray jsonArray = jsonObject.getJSONArray("listMap");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject2 = jsonArray.getJSONObject(i);
Map<String , String> map= new HashMap<String, String>();
Iterator<String > iterator =jsonObject2.keys();
while(iterator.hasNext()){
String json_key =iterator.next();
String json_value=jsonObject2.getString(json_key);
if(json_value==null){
json_value="";
}
map.put(json_key, json_value);
}
list.add(map);
}
} catch (Exception e) {
// TODO: handle exception
}
return list;
}
}