网络通信与服务

1.web服务器简介

web:www,world wide web。服务器,主要有如下几类:

IIS:Internet Informatioin Services缩写,是微软公司出品的服务器产品,主要解析的是微信开发多一些编程语言,例如asp.net等。

apache:开源的,主要是web服务

tomcat:apace子项目,主要是java语言,这个就不再讲了,将来我们的服务器交互以java的服务器交互为主。

2.HTTP简介

超文本传输协议,浏览器与web服务器交互的应用层通信协议。

3.get/post请求

get:请求一把是通过url来访问资源,用的是明文的方式,基本都是?参数名=值格式,这个有大小限制。

post请求:是用于表单向服务器提交信息,这个大小不限。

4.通过HTTP访问网络(安卓)

1.HttpURLConnection

继承自URLConnection抽象类,无法直接实例化对象,必须通过openCollection()来获取对象实例。可以通过get和post请求来获取的和服务器http请求和响应。

//1.创建URL对象

URL urlConn=new URL(网址) //可以是外网http://www.163.com 也可以是内网 http://localhost

//2.获取HttpURLConnection对象

HttpURLConnection urlConn=(HttpURLConnection)url.openConnection(); //强转

//3.调用getInputStream()方法获取服务器返回的输入流

InputStream in=conn.getInputStream();

//4.读取并处理(解码)服务器返回的输入流

bitmap =BitmapFactory.decodeStream(is);

//5.关闭连接

urlConn.disconnect();

6.案例

6.1 设计界面

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content"
xmlns:android="http://schemas.android.com/apk/res/android">
<!--组件 -->
<TextView
android:layout_width="wrap_content" android:id="@+id/textView1"
android:layout_height="wrap_content" android:text="下载一个图片"/>
<ImageView
android:layout_width="wrap_content" android:id="@+id/imageView1"
android:layout_height="wrap_content"/>
<Button
android:layout_width="wrap_content" android:id="@+id/button1"
android:layout_height="wrap_content" android:text="开始下载"/>
</LinearLayout>

6.2 后台代码

package com.aaa.httpurldemo;

import androidx.appcompat.app.AppCompatActivity;
import androidx.loader.content.AsyncTaskLoader;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class MainActivity extends AppCompatActivity {
//1.定义相应的对象;都是空,好处是需要的时候给他们赋值,节省内存空间;
Button visitWebBtn=null;
Button button1=null;
TextView textView1=null;
ImageView imageView1=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//---------------------
// 2.获取对象;
imageView1=(ImageView) findViewById(R.id.imageView1);
button1=(Button) findViewById(R.id.button1);
//3.创建下载图片按钮的事件监听;
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//定义一个url,图片地址;
String imgUrl;
imgUrl="https://img-blog.csdnimg.cn/2ca5b2d594b7464d832713fc3c481b75.jpg?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAdGVhX3llYXI=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center";
//也可以自建本地的url地址;
//imgUrl="http://192.168.1.1:8080/java.jpg"
new DownImageAsyncTask().execute(imgUrl);
}
});
}
//从指定的URL来获取图片;可以实现绘图操作
private Bitmap getImageBitmap(String url){ //url:传入的后台地址;
URL imgUrl=null; // 一个是url地址;
Bitmap bitmap=null; //返回的图像对象;
//下面这里是核心代码;
try{
//1.创建url对象,
imgUrl=new URL(url);
//2.获取HttpURLConnection对象实例;
HttpURLConnection conn=(HttpURLConnection) imgUrl.openConnection();
conn.setDoInput(true);
conn.connect(); //开始连接;
//3.获取服务器返回的数据流;
InputStream is=conn.getInputStream();
//4.解码数据流;
bitmap= BitmapFactory.decodeStream(is); //解码输入字节流
is.close(); //关闭输入流对象;
//5.断开连接;
conn.disconnect();
}catch (MalformedURLException e) { //URL地址异常,没找到地址;
// e.printStackTrace();
Toast.makeText(this, "图片下载失败,请确定地址是否正确", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
// e.printStackTrace();
Toast.makeText(this,"图片下载失败,请确定网络服务是否正常",Toast.LENGTH_LONG).show();
}
return bitmap;
}
//利用异步任务机制来下载图片;
public class DownImageAsyncTask extends AsyncTask<String, Void, Bitmap> {
//下载之前,清空操作
@Override
protected void onPreExecute() {
super.onPreExecute();
imageView1.setImageBitmap(null);
}
//这个是下载
@Override
protected Bitmap doInBackground(String... params) {
Bitmap b=getImageBitmap(params[0]);//下载了一个图片,也可以同时下载多个,params[1],...,params[n]
return b;
}
//这个是结束
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
if(result!=null)
imageView1.setImageBitmap(result);
}
}
}