JAVA之旅(三十四)——自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫
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/就知道什么效果
我们控制台也打印出我们的地址来了
比较有意思的是,既然是网页打开,那么他是支持html的,我们来输出这句
out.println("<font color='red' size='30'>Hello Client");
你就可以看到
二.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();
}
}
}
得到的结果
继续来看
// 返回一个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("错误");
}
}
}
非常的强大,只要几行代码就可以显示,牛啊,这符号定义我们稍后解答
四.匹配
正则很厉害,我们来看下他的作用
- 特点:用一些特定的符号来表示一些代码操作,这样就简化了书写,学习正则表达式就是用来学习一些特殊符号的使用
- 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);
}
}
}
我们输出
六.替换
正则表达式就是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);
}
}
得到的结果
七.获取
- 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,正则表达式特点,匹配,切割,替换,获取,网页爬虫的更多相关文章
- JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制
JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是clas ...
- “全栈2019”Java多线程第三十四章:超时自动唤醒被等待的线程
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- java 面向对象(三十四):泛型三 自定义泛型类、泛型接口、泛型方法
1.举例: [Order.java] public class Order<T> { String orderName; int orderId; //类的内部结构就可以使用类的泛型 T ...
- JAVA学习第三十四课 (经常使用对象API)—List集合及其子类特点
整个集合框架中最经常使用的就是List(列表)和Set(集) 一.List集合 && Set的特点 Collection的子接口: 1.List:有序(存入和取出的顺序一致),元素都有 ...
- 菜鸡的Java笔记 第三十四 Annotation
Annotation 多例模式特点: 1. 多例类可以有多个实例 2. 多例类必须自己创建自己的实例,并管理自己的实例,和向外界提供自己的实例 ...
- Java基础(三十四)String、StringBuffer类和数据缓冲区Buffer类
一.String类 1.创建字符串对象 创建字符串对象有两种方法:直接用“=”或者使用“new String(...)” String aStr = "TMZ"; String b ...
- Java开发学习(三十四)----Maven私服(二)本地仓库访问私服配置与私服资源上传下载
一.本地仓库访问私服配置 我们通过IDEA将开发的模块上传到私服,中间是要经过本地Maven的 本地Maven需要知道私服的访问地址以及私服访问的用户名和密码 私服中的仓库很多,Maven最终要把资源 ...
- JAVA之旅(三十)——打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码
JAVA之旅(三十)--打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码 三十篇了,又是一个 ...
- JAVA之旅(十九)——ListIterator列表迭代器,List的三个子类对象,Vector的枚举,LinkedList,ArrayList和LinkedList的小练习
JAVA之旅(十九)--ListIterator列表迭代器,List的三个子类对象,Vector的枚举,LinkedList,ArrayList和LinkedList的小练习 关于数据结构,所讲的知识 ...
随机推荐
- [USACO15OPEN]回文的路径Palindromic Paths 2.0版
题目描述 农夫FJ的农场是一个N*N的正方形矩阵(2\le N\le 5002≤N≤500),每一块用一个字母作标记.比如说: ABCD BXZX CDXB WCBA 某一天,FJ从农场的左上角走到右 ...
- BZOJ 1510: Kra-The Disks
Johnny 在生日时收到了一件特殊的礼物,这件礼物由一个奇形怪状的管子和一些盘子组成. 这个管子是由许多不同直径的圆筒(直径也可以相同) 同轴连接而成. 这个管子的底部是封闭的,顶部是打开的. 下图 ...
- 【BZOJ1059】【ZJOI2007】矩阵游戏
Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两 ...
- 线性规划与网络流24题●09方格取数问题&13星际转移问题
●(做codevs1908时,发现测试数据也涵盖了1907,想要一并做了,但因为“技术”不佳,搞了一上午) ●09方格取数问题(codevs1907 方格取数3) 想了半天,也没成功建好图: 无奈下 ...
- 决战 状压dp
决定在这个小巷里排兵布阵.小巷可以抽象成一个们彼此之间并不是十分和♂谐.具体来说,一个哲学家会有一个的矩形.每一位哲学家会占据一个格子.然而哲学家的01矩阵来表示他自己的守备范围.哲学家自己位于这个矩 ...
- Java8的重要新特性
一.Lambda表达式 java8中Lambda表达式的书写方式: (参数) -> 表达式 (参数) -> 单行语句 (参数) -> { 语句 } 1.Lambda遍历List和Ma ...
- Zend引擎探索 之 PHP中前置递增不返回左值
首先来讲,一般我们对"左值"的理解就是可以出现在赋值运算符的左侧的标识符,也就是可以被赋值.这样讲也许并不十分确切,在不同的语言中对左值的定义也不尽相同.在这里我们讨论前置递增(和 ...
- ajaxStart()和ajaxStop()
Jquery中当一个Ajax请求启动时,并且没有其他未完成的Ajax请求时,将调用ajaxStart()方法.同样,ajaxStop()方法则是在所有Ajax请求都完成时调用.这些方法的参数都是一个函 ...
- HTMLParser使用简介
HTMLParser具有小巧,快速的优点,缺点是相关文档比较少(英文的也少),很多功能需要自己摸索.对于初学者还是要费一些功夫的,而一旦上手以后,会发现HTMLParser的结构设计很巧妙,非常实用, ...
- Lintcode392 Is Subsequence solution 题解
[题目描述] Given a string s and a string t, check if s is subsequence of t. You may assume that there is ...