高级API快速入门之批量图片下载&Socket对话【05】

本文介绍了如何使用正则表达式批量下载网页中的图片,并结合Socket技术实现了服务器与客户端的简单数据交互。涉及Pattern、Matcher和正则匹配规则,展示了Java在网络爬虫和基础通信中的应用。
摘要由CSDN通过智能技术生成

一、批量图片下载

【一】回顾以下正则表达式

     简单符号:
           \d:[0-9]数字
           \w:[a-zA-Z0-9_]
           \s:空格
           [abc]{5}:在abc中任选 重复5次
           [a-f]{2,5}:在abcdef中任选 重复2-5次
           [a-c]{5,}:在abc中任选 至少重复5次
           + :至少出现一次 >=1
          ? : 出现0次或者1次
          * :任意次
          ^ :[^abc] 除了abc以外的所有字符

       具体显示:

【二】Pattern和Matcher
    (1)概述
               java.util.regex 是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。
              它包括两个类:Pattern 和 Matcher


    (2)Pattern
        ① 概述
                  一个 Pattern 是一个正则表达式经编译后的表现模式
        ② 常用方法
            compile(String regex)
                 将给定的正则表达式编译并赋予给 Pattern 类


    (3)Matcher
        ① 概述
             一个 Matcher 对象是一个状态机器,它依据 Pattern 对象做为匹配模式对字符串展开匹配检查
        ② 常用方法
            boolean find()
                尝试在目标字符串里查找下一个匹配子串
            String group(int group)
                返回当前查找而获得的与指定的组匹配的子串内容

【三】匹配和查找
  

        String s = "abc-123!abc-456!";
        String regex = "[\\d]+(!)";
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(s);
        while (m.find()){
           String s1 = m.group(0);   //  正则表达式中匹配到的所有内容
           String s2 = m.group(1);   //  正则表达式中括号内匹配到的内容
           System.out.println(s1 + "    " + s2);
       } 

【四】批量图片下载

      需要依靠正则表达式

package com.lixiangning.test;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 下载多张图片
 * 
 * @author Administrator
 *
 */
public class Demo_01 {

	public static void main(String[] args) throws Exception {
		// 下载鑫博网页的某个页面的源代码 default.html
		URL url = new URL("file:///D:/xb/default.html");
		// 获取并激活网络流
		InputStream is = url.openStream();
		// 转成字符流
		InputStreamReader isr = new InputStreamReader(is, "GBK");
		// 高效
		BufferedReader br = new BufferedReader(isr);
		StringBuffer sb = new StringBuffer();// 所有源代码
		String str = "";
		while (null != (str = br.readLine())) {
			sb.append(str + "\n");
		}

		System.out.println(sb);

		String regex = "<img\\ssrc=\"([^\\\">]+)?\"(\\swidth=\"\\w+\")?(\\sheight=\"\\w+\")?\\s/>";
		// 生成Pattern模式类
		Pattern p = Pattern.compile(regex);
		// 利用p生成Matcher匹配类
		Matcher m = p.matcher(sb);
		// find
		int count = 0;
		while (m.find()) {// 只要能够找到所匹配的字符串内容 都可以进入查找输出,否则结束循环
			count++;
			String imgPath = "file:///D:/xb/" + m.group(1);
			imageLoad(imgPath);
		}
		System.out.println(count);
	}

	public static void imageLoad(String imgPath) throws Exception {
		String fileName = "";
		int index = imgPath.lastIndexOf("/");
		if (index != -1) {
			fileName = imgPath.substring(index);
		}

		URL url = new URL(imgPath);
		InputStream is = url.openStream();
		BufferedInputStream bis = new BufferedInputStream(is);

		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File("D:\\images\\" + fileName)));

		int len = 0;
		while (-1 != (len = bis.read())) {
			bos.write(len);
			bos.flush();
		}
		System.out.println("下载成功");
		bos.close();
		bis.close();
		is.close();
	}

}

   第二种类型:

package com.lixiangning.test;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Demo_02 {
	public static void main(String[] args) throws Exception{
		
		//下载星博网页
		URL url = new URL("file:///D:/xb/default.html");
		InputStream is = url.openStream();
		InputStreamReader isr = new InputStreamReader(is, "GBK");
		BufferedReader br = new BufferedReader(isr);
		//每次读取一行一次保存到一个变量中
		StringBuffer sb = new StringBuffer();
		String str = "";
		while(null!=(str = br.readLine())) {
			sb.append(str+"\n");
		}
		//System.out.println(sb);
		
		//定义正则匹配规则
		String regex = "<img\\ssrc=\"([^\\\">]+)\"\\s/>";
		
		//利用pattern和Matcher类实现找到所有的img标签
		Pattern compile = Pattern.compile(regex);
		Matcher matcher = compile.matcher(sb);
		//利用find和group方法找到所有img标签
		while(matcher.find()) {
			System.out.println(matcher.group(1));
		}
		
	}
}

二、Socket对话

 【一】使用TCP传输协议实现数据交互
            服务器端ServerSocket   客户端Socket
 
        1.先开启服务器   2.客户端再去连接指定开启的服务器

   【二】服务器工作的流程:
             1.开启QQ程序服务器(通过ServerSocket构造函数实现)
             2.等待客户端连接服务器(阻塞的方法)
             3.某时刻--客户端来连接服务器---服务器会做出响应--提示客户端已连接
             4.服务器可以发送消息给客户端了(通过输出流)
             5.某时刻服务器可以接受客户端发送的消息。
             6.关闭服务器以及所有的流对象

package com.lixiangning.test;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * QQ程序服务端
 * @author Administrator
 */
public class ServerTest {

	public static void main(String[] args) throws Exception{
		System.out.println("服务器即将启动.....");
		
		//1.开启QQ程序服务器(通过ServerSocket构造函数实现)
		ServerSocket ss = new ServerSocket(7878);
		System.out.println("服务器已启动.......");
		//为了不让服务器启动后立刻关闭,调用某个方法去等待客户端来连接服务器
		Socket sk = ss.accept();//等待有缘人
		System.out.println("服务器已启动...等待有缘人");
		
		//2.由服务器开头  发消息
		//通过套接字Socket获取输出流  发消息
		OutputStream os = sk.getOutputStream();
		OutputStreamWriter oos = new OutputStreamWriter(os);
		BufferedWriter bw = new BufferedWriter(oos);
		//发送内容
		bw.write("你好,客户端;我是老大-服务器");
		bw.newLine();//跨行
		bw.flush();//刷新
		System.out.println("消息发送完毕,电话直接挂断");
		
		//接受内容
		InputStream is = sk.getInputStream();
		InputStreamReader isr = new InputStreamReader(is);
		BufferedReader br = new BufferedReader(isr);
				
		String readLine = br.readLine();
		System.out.println("客户端说: "+readLine);
	
		
		//关闭资源
		br.close();
		isr.close();
		is.close();
		bw.close();
		oos.close();
		os.close();
		sk.close();
		ss.close();
		
	}

}


【三】 客户端的工作流程:
             先满足有服务器
        1.通过Socket去连接服务器(提供对应的服务器端程序的IP地址以及端口号)
        2.如果连接成功--提示连接成功
        3.接受服务器端发来的消息并做出对应的回复。
        4.关闭(所有资源)

package com.lixiangning.test;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;

/**
 * QQ程序客户端
 * @author Administrator
 */
public class ClientTest {
	public static void main(String[] args) throws Exception{
		System.out.println("客户端即将开启");
		//1.通过Socket去连接服务器(提供对应的服务器端程序的IP地址以及端口号)
		Socket sk = new Socket("127.0.0.1", 7878);
		System.out.println("客户端连接服务器成功");
		//2.接受服务端发送的消息
		InputStream is = sk.getInputStream();
		InputStreamReader isr = new InputStreamReader(is);
		BufferedReader br = new BufferedReader(isr);
		
		String content = br.readLine();
		System.out.println("服务器说: "+content);
		
		//获取输出流给服务器回复
		OutputStream os = sk.getOutputStream();
		OutputStreamWriter oos = new OutputStreamWriter(os);
		BufferedWriter bw = new BufferedWriter(oos);
		
		bw.write("hello,bady");
		bw.newLine();
		bw.flush();
		
		//关闭资源
		bw.close();
		oos.close();
		os.close();
		br.close();
		isr.close();
		is.close();
		sk.close();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ning_ning_03

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值