JAVA之旅(三十四)——自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫
我们接着来说网络编程,TCP
一.自定义服务端
我们直接写一个服务端,让本机去连接,可以看到什么样的效果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 1package com.lgl.socket;
2
3import java.io.IOException;
4import java.io.PrintWriter;
5import java.net.ServerSocket;
6import java.net.Socket;
7
8public class BrowserServer {
9
10 //http://192.168.1.103:11000/
11
12 public static void main(String[] args) {
13 try {
14 ServerSocket ss = new ServerSocket(11000);
15 Socket s = ss.accept();
16 System.out.println(s.getInetAddress().getHostName() + ":" + s.getInetAddress().getHostAddress());
17 PrintWriter out = new PrintWriter(s.getOutputStream(), true);
18 out.println("Hello Client");
19 s.close();
20 ss.close();
21 } catch (IOException e) {
22 // TODO Auto-generated catch block
23 e.printStackTrace();
24 }
25 }
26
27}
28
29
我们运行了之后直接访问http://192.168.1.103:11000/就知道什么效果
我们控制台也打印出我们的地址来了
比较有意思的是,既然是网页打开,那么他是支持html的,我们来输出这句
1
2 1out.println("<font color='red' size='30'>Hello Client");
2
你就可以看到
二.URLConnection
先看URL的用法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 1package com.lgl.socket;
2
3import java.net.MalformedURLException;
4import java.net.URL;
5
6public class URLDemo {
7
8 public static void main(String[] args) {
9 try {
10 URL url = new URL("http://192.168.1.102/myweb/test.html?name=zhangsan&age=18");
11 // 协议
12 System.out.println(url.getProtocol());
13 // 主机
14 System.out.println(url.getHost());
15 // 端口
16 System.out.println(url.getPort());
17 // 路径
18 System.out.println(url.getPath());
19 // 查询部
20 System.out.println(url.getQuery());
21 } catch (MalformedURLException e) {
22 // TODO Auto-generated catch block
23 e.printStackTrace();
24 }
25 }
26
27}
28
29
得到的结果
继续来看
1
2
3
4
5
6
7
8 1// 返回一个url连接对象
2URLConnection openConnection = url.openConnection();
3System.out.println(openConnection);
4InputStream inputStream = openConnection.getInputStream();
5byte[] buf = new byte[1024];
6int len = inputStream.read(buf);
7System.out.println(new String(buf, 0, len));
8
其实可以读取流,我们从流中拿到我们想要的东西
三.正则表达式特点
正则表达式:你可以理解为符合一定规则的表达式,正则我们虽然用的不多,但是确实比较适用的,我们主要来看他的做用
- 专门操作字符串
我们直接来看下使用方法
我们现在有一个需求
- 对QQ号码进行效验,要求5-15位,不能开头,只能是数字
先看一下我们的传统方式是怎么去计算的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 1public class Test {
2
3 public static void main(String[] args) {
4 /**
5 * 对QQ号码进行效验,要求5-15位,不能开头,只能是数字
6 */
7 String qq = "11299923";
8 int len = qq.length();
9 // 长度
10 if (len > 5 && len <= 15) {
11 // 不能0开头
12 if (!qq.startsWith("0")) {
13 // 全部是数字
14 char[] charArray = qq.toCharArray();
15 boolean flag = false;
16 for (int i = 0; i < charArray.length; i++) {
17 if (!(charArray[i] >= '0' && charArray[i] <= '9')) {
18 flag = true;
19 break;
20 }
21 }
22 if (flag) {
23 System.err.println("QQ:" + qq);
24 } else {
25 System.out.println("非纯数字");
26 }
27 } else {
28 System.out.println("0开头不符合规范");
29 }
30 } else {
31 System.out.println("QQ长度有问题");
32 }
33 }
34}
35
36
这是一件非常麻烦的事情的,而我们来看下正则表达式,是怎么表示的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 1public class Test1 {
2
3 public static void main(String[] args) {
4
5 String qq = "789152";
6 /**
7 * 我只要告诉你对与错就行
8 */
9 String regex = "[1-9][0-9]{4,14}";
10 boolean flag = qq.matches(regex);
11 if (flag) {
12 System.out.println("QQ:" + qq);
13 } else {
14 System.out.println("错误");
15 }
16 }
17}
18
19
非常的强大,只要几行代码就可以显示,牛啊,这符号定义我们稍后解答
四.匹配
正则很厉害,我们来看下他的作用
-
特点:用一些特定的符号来表示一些代码操作,这样就简化了书写,学习正则表达式就是用来学习一些特殊符号的使用
-
1.匹配:matches
我们来看下这段代码
1
2
3
4
5
6
7
8 1 String str = "c";
2 /**
3 * 这个字符串只能是bcd中的其中一个,而且只能是一个字符
4 */
5 String reg = "[bcd]";
6 boolean flag = str.matches(reg);
7 System.out.println(flag);
8
含义理解清楚,其实就比较顺眼了一点点了,我们继续
1
2
3
4
5
6
7 1 /**
2 * 这个字符的第二位是a-z就行
3 */
4 String reg1 = "[bcd][a-z]";
5 boolean flag1 = str.matches(reg);
6 System.out.println(flag1);
7
到现在是否是有点概念?我们继续,如果我现在想我第一个是个字母第二个是个数字,该怎么去拼?
1
2
3
4 1 String reg2 = "[a-zA-Z][0-9]";
2 boolean flag2 = str.matches(reg2);
3 System.out.println(flag2);
4
大致的讲解一下,因为我也不是很熟,嘿嘿
五.切割
这个切割,在string也是一个切割split,而我们的正则,也是有的,我们继续看
1
2
3
4
5
6
7
8
9
10
11
12
13
14 1public class Test2 {
2
3 public static void main(String[] args) {
4
5 String str = "zhangsan,lisi,wangwu";
6 String reg = ",";
7 String[] split = str.split(reg);
8 for (String s : split) {
9 System.out.println(s);
10 }
11 }
12}
13
14
我们输出
六.替换
正则表达式就是string的操作,我们看下替换
1
2
3
4
5
6
7
8
9
10
11
12
13
14 1public class Test2 {
2
3 public static void main(String[] args) {
4 // 将数字连续超过五个替换成#号
5 replaceAll("fwfsda777777fs74666677s", "\\d{5,}", "#");
6 }
7
8 public static void replaceAll(String str, String reg, String newStr) {
9 str = str.replaceAll(reg, newStr);
10 System.out.println(str);
11 }
12}
13
14
得到的结果
七.获取
-
1.将正则表达式封装成对象
-
2.让正则表达式和要操作的对象进行关联
-
3.关联后,获取正则匹配引擎
-
4.通过引擎对符合规则的子串进行操作,比如取出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 1import java.util.regex.Matcher;
2import java.util.regex.Pattern;
3
4public class Test2 {
5
6 public static void main(String[] args) {
7
8
9 String string = " hello java android c cc ccc cccc ccccc";
10 //test
11 String reg = "[a-z]";
12
13 //将规则封装成对象
14 Pattern p = Pattern.compile(reg);
15 //让正则对象和要作用的字符串相关联,获取匹配器对象
16 Matcher matcher = p.matcher(string);
17 System.out.println(matcher.matches());
18 }
19
20}
21
22
体现了一个模式而已,我们可用通过这个模式去获取字符串
八.网页爬虫
爬虫我们再熟悉不过了,也俗称蜘蛛,其实就是获取一些数据罢了,我们也是可以用到我们正则中的获取功能的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 1import java.io.BufferedReader;
2import java.io.FileNotFoundException;
3import java.io.FileReader;
4import java.io.IOException;
5import java.util.regex.Matcher;
6import java.util.regex.Pattern;
7
8public class Test2 {
9
10 public static void main(String[] args) {
11
12 }
13
14 /**
15 * 获取指定文档中的邮箱地址
16 */
17 public static void getEmail() {
18 try {
19 BufferedReader bufr = new BufferedReader(
20 new FileReader("email.txt"));
21 String line = null;
22 String emailreg = "\\w+@\\w+(\\.\\w+)+";
23 Pattern p = Pattern.compile(emailreg);
24 while ((line = bufr.readLine()) != null) {
25 System.out.println(line);
26 // 判断邮箱
27 Matcher m = p.matcher(line);
28 while (m.find()) {
29 System.out.println(m.group());
30 // 这样就拿到所有的邮箱了
31 }
32 }
33 } catch (FileNotFoundException e) {
34 // TODO Auto-generated catch block
35 e.printStackTrace();
36 } catch (IOException e) {
37 // TODO Auto-generated catch block
38 e.printStackTrace();
39 }
40 }
41}
42
43
这样我们的所有邮箱号码就拿到了,当然,这只是一个简单的爬虫概念,爬虫博大精深,我们要学习的话还是要系统的了解一下才好!!!
好的,我们的java之旅也到这里over了,我们本篇也结束了