JAVA之旅(三十四)——自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫

时间:2022-03-13 04:44:13

JAVA之旅(三十四)——自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫


我们接着来说网络编程,TCP

一.自定义服务端

我们直接写一个服务端,让本机去连接,可以看到什么样的效果

package com.lgl.socket;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class BrowserServer {

    //http://192.168.1.103:11000/

    public static void main(String[] args) {
        try {
            ServerSocket ss = new ServerSocket(11000);
            Socket s = ss.accept();
            System.out.println(s.getInetAddress().getHostName() + ":" + s.getInetAddress().getHostAddress());
            PrintWriter out = new PrintWriter(s.getOutputStream(), true);
            out.println("Hello Client");
            s.close();
            ss.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

我们运行了之后直接访问http://192.168.1.103:11000/就知道什么效果

JAVA之旅(三十四)——自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫

我们控制台也打印出我们的地址来了

JAVA之旅(三十四)——自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫

比较有意思的是,既然是网页打开,那么他是支持html的,我们来输出这句

out.println("<font color='red' size='30'>Hello Client");

你就可以看到

JAVA之旅(三十四)——自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫

二.URLConnection

先看URL的用法

package com.lgl.socket;

import java.net.MalformedURLException;
import java.net.URL;

public class URLDemo {

    public static void main(String[] args) {
        try {
            URL url = new URL("http://192.168.1.102/myweb/test.html?name=zhangsan&age=18");
            // 协议
            System.out.println(url.getProtocol());
            // 主机
            System.out.println(url.getHost());
            // 端口
            System.out.println(url.getPort());
            // 路径
            System.out.println(url.getPath());
            // 查询部
            System.out.println(url.getQuery());
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

得到的结果

JAVA之旅(三十四)——自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫

继续来看

// 返回一个url连接对象
URLConnection openConnection = url.openConnection();
System.out.println(openConnection);
InputStream inputStream = openConnection.getInputStream();
byte[] buf = new byte[1024];
int len = inputStream.read(buf);
System.out.println(new String(buf, 0, len));

其实可以读取流,我们从流中拿到我们想要的东西

三.正则表达式特点

正则表达式:你可以理解为符合一定规则的表达式,正则我们虽然用的不多,但是确实比较适用的,我们主要来看他的做用

  • 专门操作字符串

我们直接来看下使用方法

我们现在有一个需求

  • 对QQ号码进行效验,要求5-15位,不能开头,只能是数字

先看一下我们的传统方式是怎么去计算的

public class Test {

    public static void main(String[] args) {
        /**
         * 对QQ号码进行效验,要求5-15位,不能开头,只能是数字
         */
        String qq = "11299923";
        int len = qq.length();
        // 长度
        if (len > 5 && len <= 15) {
            // 不能0开头
            if (!qq.startsWith("0")) {
                // 全部是数字
                char[] charArray = qq.toCharArray();
                boolean flag = false;
                for (int i = 0; i < charArray.length; i++) {
                    if (!(charArray[i] >= '0' && charArray[i] <= '9')) {
                        flag = true;
                        break;
                    }
                }
                if (flag) {
                    System.err.println("QQ:" + qq);
                } else {
                    System.out.println("非纯数字");
                }
            } else {
                System.out.println("0开头不符合规范");
            }
        } else {
            System.out.println("QQ长度有问题");
        }
    }
}

这是一件非常麻烦的事情的,而我们来看下正则表达式,是怎么表示的

public class Test1 {

    public static void main(String[] args) {

        String qq = "789152";
        /**
         * 我只要告诉你对与错就行
         */
        String regex = "[1-9][0-9]{4,14}";
        boolean flag = qq.matches(regex);
        if (flag) {
            System.out.println("QQ:" + qq);
        } else {
            System.out.println("错误");
        }
    }
}

非常的强大,只要几行代码就可以显示,牛啊,这符号定义我们稍后解答

四.匹配

正则很厉害,我们来看下他的作用

  • 特点:用一些特定的符号来表示一些代码操作,这样就简化了书写,学习正则表达式就是用来学习一些特殊符号的使用

JAVA之旅(三十四)——自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫

  • 1.匹配:matches

我们来看下这段代码

        String str = "c";
        /**
         * 这个字符串只能是bcd中的其中一个,而且只能是一个字符
         */
        String reg = "[bcd]";
        boolean flag = str.matches(reg);
        System.out.println(flag);

含义理解清楚,其实就比较顺眼了一点点了,我们继续

        /**
         * 这个字符的第二位是a-z就行
         */
        String reg1 = "[bcd][a-z]";
        boolean flag1 = str.matches(reg);
        System.out.println(flag1);

到现在是否是有点概念?我们继续,如果我现在想我第一个是个字母第二个是个数字,该怎么去拼?

    String reg2 = "[a-zA-Z][0-9]";
    boolean flag2 = str.matches(reg2);
    System.out.println(flag2);

大致的讲解一下,因为我也不是很熟,嘿嘿

五.切割

这个切割,在string也是一个切割split,而我们的正则,也是有的,我们继续看

public class Test2 {

    public static void main(String[] args) {

        String str = "zhangsan,lisi,wangwu";
        String reg = ",";
        String[] split = str.split(reg);
        for (String s : split) {
            System.out.println(s);
        }
    }
}

我们输出

JAVA之旅(三十四)——自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫

六.替换

正则表达式就是string的操作,我们看下替换

public class Test2 {

    public static void main(String[] args) {
        // 将数字连续超过五个替换成#号
        replaceAll("fwfsda777777fs74666677s", "\\d{5,}", "#");
    }

    public static void replaceAll(String str, String reg, String newStr) {
        str = str.replaceAll(reg, newStr);
        System.out.println(str);
    }
}

得到的结果

JAVA之旅(三十四)——自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫

七.获取

  • 1.将正则表达式封装成对象
  • 2.让正则表达式和要操作的对象进行关联
  • 3.关联后,获取正则匹配引擎
  • 4.通过引擎对符合规则的子串进行操作,比如取出
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test2 {

    public static void main(String[] args) {

        String string  = " hello java android c cc ccc cccc ccccc";
        //test
        String reg = "[a-z]";

        //将规则封装成对象
        Pattern p = Pattern.compile(reg);
        //让正则对象和要作用的字符串相关联,获取匹配器对象
        Matcher matcher = p.matcher(string);
        System.out.println(matcher.matches());
    }

}

体现了一个模式而已,我们可用通过这个模式去获取字符串

八.网页爬虫

爬虫我们再熟悉不过了,也俗称蜘蛛,其实就是获取一些数据罢了,我们也是可以用到我们正则中的获取功能的

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test2 {

    public static void main(String[] args) {

    }

    /**
     * 获取指定文档中的邮箱地址
     */
    public static void getEmail() {
        try {
            BufferedReader bufr = new BufferedReader(
                    new FileReader("email.txt"));
            String line = null;
            String emailreg = "\\w+@\\w+(\\.\\w+)+";
            Pattern p = Pattern.compile(emailreg);
            while ((line = bufr.readLine()) != null) {
                System.out.println(line);
                // 判断邮箱
                Matcher m = p.matcher(line);
                while (m.find()) {
                    System.out.println(m.group());
                    // 这样就拿到所有的邮箱了
                }
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

这样我们的所有邮箱号码就拿到了,当然,这只是一个简单的爬虫概念,爬虫博大精深,我们要学习的话还是要系统的了解一下才好!!!

好的,我们的java之旅也到这里over了,我们本篇也结束了

JAVA之旅(三十四)——自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫的更多相关文章

  1. JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制

    JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是clas ...

  2. &OpenCurlyDoubleQuote;全栈2019”Java多线程第三十四章:超时自动唤醒被等待的线程

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  3. java 面向对象(三十四):泛型三 自定义泛型类、泛型接口、泛型方法

    1.举例: [Order.java] public class Order<T> { String orderName; int orderId; //类的内部结构就可以使用类的泛型 T ...

  4. JAVA学习第三十四课 &lpar;经常使用对象API&rpar;—List集合及其子类特点

    整个集合框架中最经常使用的就是List(列表)和Set(集) 一.List集合 && Set的特点 Collection的子接口: 1.List:有序(存入和取出的顺序一致),元素都有 ...

  5. 菜鸡的Java笔记 第三十四 Annotation

    Annotation        多例模式特点:            1. 多例类可以有多个实例            2. 多例类必须自己创建自己的实例,并管理自己的实例,和向外界提供自己的实例 ...

  6. Java基础(三十四)String、StringBuffer类和数据缓冲区Buffer类

    一.String类 1.创建字符串对象 创建字符串对象有两种方法:直接用“=”或者使用“new String(...)” String aStr = "TMZ"; String b ...

  7. JAVA之旅(三十)——打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码

    JAVA之旅(三十)--打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码 三十篇了,又是一个 ...

  8. JAVA之旅(十九)——ListIterator列表迭代器,List的三个子类对象,Vector的枚举,LinkedList&comma;ArrayList和LinkedList的小练习

    JAVA之旅(十九)--ListIterator列表迭代器,List的三个子类对象,Vector的枚举,LinkedList,ArrayList和LinkedList的小练习 关于数据结构,所讲的知识 ...

  9. Java进阶&lpar;三十四&rpar;Integer与int的种种比较你知道多少?

    Java进阶(三十四)Integer与int的种种比较你知道多少? 前言 如果面试官问Integer与int的区别:估计大多数人只会说到两点:Ingeter是int的包装类,注意是一个类:int的初值 ...

随机推荐

  1. 【圣诞呈献】高性能 Socket 组件 HP-Socket v3&period;1&period;1 正式发布

    HP-Socket 是一套通用的高性能 Windows Socket 组件包,包含服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP ...

  2. SQL&lowbar;递归查询&lpar;复杂查询示例&rpar;

    需求: 一篇文章里有很多评论,每个评论又有很多回复评论,要求: 页面将文章展示出来,且文章的主评论按照评论时间分页展示,回复评论的评论完全展示在每个主评论下面,且按照回复时间排序 最终查询结果SQL查 ...

  3. mysql几个命令

    1.格式化输出 select * from mysql.user\G 2.显示版本 show version() 3.显示引擎 show engines mysql> show engines; ...

  4. &lpar;mac&rpar;Android Studio安装以及Fetching android sdk component information超时的解决方案

    解决Mac下面Fetching android sdk component information加载过久问题, 关于windows中可以参考前面一篇文章 关于安装和下载可以百度一下地址.安装完成后, ...

  5. 使用PHP开发一个简单的后台接口(响应移动端的get请求和post请求)

    写一个简单的后台,在接到app请求数据的时候,返回对应的内容: index.php文件如下: <?php $id = $_POST['id']; if($id==001){ echo json_ ...

  6. JAVA程序员成长历程(二)

    提几个方向可以去尝试下: 1.订阅一些牛人的博客,这里面包括技术,学习,生活等等.不一定学技术,他们的经验都会让人受益匪浅. 我经常看的: 唐巧,IOS程序员.http://blog.devtang. ...

  7. 项目总结20:阿里云免费https证书申请

    项目总结20:阿里云免费https证书申请 1. 登录阿里云控制台 www.aliyun.com,用账户信息登录 2. 在”产品与服务”搜索SSL,选择SSL证书 3. 点击购买证书 4. 选择” S ...

  8. python实现简单的定时任务

    1.首先安装 schedule 模块 命令行安装 pip install schedule pyCharm编辑器安装 File->setting->project:youProject-& ...

  9. 11&period;1、socket连接中的粘包、精确传输问题

    粘包: 发生原因: 当调用send的时候,数据并不是即时发给客户端的.而是放到了系统的socket发送缓冲区里,等缓冲区满了.或者数据等待超时了,数据才会发送,所以有时候发送太快的话,前一份数据还没有 ...

  10. THUWC2018酱油记

    Day 0 今年的THUWC在我们学校,听说有pretest,感觉有不好的预感.... Day 1 早上7:00在校门口集合,车7:30以后才到,感觉就像在围观 期末考试.来到雅礼洋湖,在这里看到了初 ...