Java网络编程必知知识
- TCP/IP协议的四层结构:1)物理层 2)网络层 3)传输层 4)应用层
- ISO/OSI七层模型(开放系统互连参考模型)
- HTTP协议是位于应用层的一个协议
- DNS协议
- URL统一资源定界符
以上三个协议过一段时间会写博客总结一下
Java实现基础的图片下载功能
private void core() {
//HTTP(生态系统)
//UrlConnection,apache HttpClient,android okhttp
//模式
try {
URL u = new URL(url);
String []string = url.split(".");
System.out.println(string[1]);
//String lastname =
//http是应用层的协议,基于TCP(传输层)套接字实现
//TCP/IP: 1)物理层 2)网络层 3)传输层 4)应用层
//ISO的OSI(开放系统互连参考模型) 7层 (理论概念)
HttpURLConnection conn = (HttpURLConnection) u.openConnection();
//写,发送数据
//conn.getOutputStream();
// conn.setDoInput(true);
// conn.setDoOutput(true);
//连接超时
conn.setConnectTimeout(5000);
//读取超时
conn.setReadTimeout(10000);
//读,接受数据(从本地的文件(磁盘))
InputStream in = conn.getInputStream();
byte [] buf = new byte[1024*4];
ByteArrayOutputStream bout = new ByteArrayOutputStream();
int size;
while(-1!=(size = in.read(buf))) {
bout.write(buf,0,size);
}
//从网络获取数据
byte[] data = bout.toByteArray();
byte [] hash = MessageDigest.getInstance("SHA-256").digest(url.getBytes());
String name = new BigInteger(1,hash).toString(16);
FileOutputStream out = new FileOutputStream(name+".png");
out.write(data);
out.close();
System.out.println("over");
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
分析:
上面使用了java核心API实现图片下载功能:
首先通过创建一个URL对象-->使用u.openConnection打开连接-->使用getInputStream或getOutStream获得输入输出流,进行数据的传输,最后将输入流读到byteArrayOutputStream输出到内存,然后通过SHA-256安全散列算法得到URL的散列值,最后写出到文件即可.
OkHttp的介绍和使用
android网络框架之OKhttp
,一个处理网络请求的开源项目,是安卓端最火热的轻量级框架,用于替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除HttpClient,现在已经打不出来)
相比Apach的 HttpClient,OkHttp更加轻量级,便于使用,并且产生的较晚,使用了版本较新的java api,推荐大家使用OkHttp
OkHttp包的下载:
推荐使用Mavan直接下载:(我使用的是当前最新版3.12.1)
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.12.1</version>
</dependency>
OkHttp的使用:
这里举一个例子,给出一个下载图片的方法:
public void download() {
File path = new File("pic");
if (!path.exists())
path.mkdir();
String name = String.format("%03d_%s.jpg", film.getId(), film.getTitle().split(" ")[0]);
try (BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(new File(path, name)));) {
byte[] data = new OkHttpClient.Builder()
.connectTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.build()
.newCall(new Request.Builder().url(film.getPath()).build()).execute().body().bytes();
out.write(data);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
也可以将OkHttp这些分开来写:
OkHttpClient client = new OkHttpClient();
Response res = client.newCall(null).execute();
res.headers();
res.body();
res.body().bytes();
res.body().string();
注意:这里OkHttp作为一个网络连接的工具,推荐使用第一种写法