# 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/](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了,我們本篇也結束了
版權聲明:本文為博主原創文章,博客地址:http://blog.csdn.net/qq_26787115,未經博主允許不得轉載。
- 0-發現
- AndroidInterview-Q-A
- Android能讓你少走彎路的干貨整理
- LearningNotes
- temp
- temp11
- 部分地址
- 0-待辦任務
- 待補充列表
- 0-未分類
- AndroidView事件分發與滑動沖突處理
- Spannable
- 事件分發機制詳解
- 1-Java
- 1-Java-01基礎
- 未歸檔
- 你應該知道的JDK知識
- 集合框架
- 1-Java-04合集
- Java之旅0
- Java之旅
- JAVA之旅01
- JAVA之旅02
- JAVA之旅03
- JAVA之旅04
- JAVA之旅05
- JAVA之旅06
- JAVA之旅07
- JAVA之旅08
- JAVA之旅09
- java之旅1
- JAVA之旅10
- JAVA之旅11
- JAVA之旅12
- JAVA之旅13
- JAVA之旅14
- JAVA之旅15
- JAVA之旅16
- JAVA之旅17
- JAVA之旅18
- JAVA之旅19
- java之旅2
- JAVA之旅20
- JAVA之旅21
- JAVA之旅22
- JAVA之旅23
- JAVA之旅24
- JAVA之旅25
- JAVA之旅26
- JAVA之旅27
- JAVA之旅28
- JAVA之旅29
- java之旅3
- JAVA之旅30
- JAVA之旅31
- JAVA之旅32
- JAVA之旅33
- JAVA之旅34
- JAVA之旅35
- 1-Java-05辨析
- HashMapArrayMap
- Java8新特性
- Java8接口默認方法
- 圖解HashMap(1)
- 圖解HashMap(2)
- 2-Android
- 2-Android-1-基礎
- View繪制流程
- 事件分發
- AndroidView的事件分發機制和滑動沖突解決
- 自定義View基礎
- 1-安卓自定義View基礎-坐標系
- 2-安卓自定義View基礎-角度弧度
- 3-安卓自定義View基礎-顏色
- 自定義View進階
- 1-安卓自定義View進階-分類和流程
- 10-安卓自定義View進階-Matrix詳解
- 11-安卓自定義View進階-MatrixCamera
- 12-安卓自定義View進階-事件分發機制原理
- 13-安卓自定義View進階-事件分發機制詳解
- 14-安卓自定義View進階-MotionEvent詳解
- 15-安卓自定義View進階-特殊形狀控件事件處理方案
- 16-安卓自定義View進階-多點觸控詳解
- 17-安卓自定義View進階-手勢檢測GestureDetector
- 2-安卓自定義View進階-繪制基本圖形
- 3-安卓自定義View進階-畫布操作
- 4-安卓自定義View進階-圖片文字
- 5-安卓自定義View進階-Path基本操作
- 6-安卓自定義View進階-貝塞爾曲線
- 7-安卓自定義View進階-Path完結篇偽
- 8-安卓自定義View進階-Path玩出花樣PathMeasure
- 9-安卓自定義View進階-Matrix原理
- 通用類介紹
- Application
- 2-Android-2-使用
- 2-Android-02控件
- ViewGroup
- ConstraintLayout
- CoordinatorLayout
- 2-Android-03三方使用
- Dagger2
- Dagger2圖文完全教程
- Dagger2最清晰的使用教程
- Dagger2讓你愛不釋手-終結篇
- Dagger2讓你愛不釋手-重點概念講解、融合篇
- dagger2讓你愛不釋手:基礎依賴注入框架篇
- 閱讀筆記
- Glide
- Google推薦的圖片加載庫Glide:最新版使用指南(含新特性)
- rxjava
- 這可能是最好的RxJava2.x入門教程完結版
- 這可能是最好的RxJava2.x入門教程(一)
- 這可能是最好的RxJava2.x入門教程(三)
- 這可能是最好的RxJava2.x入門教程(二)
- 這可能是最好的RxJava2.x入門教程(五)
- 這可能是最好的RxJava2.x入門教程(四)
- 2-Android-3-優化
- 優化概況
- 各種優化
- Android端秒開優化
- apk大小優化
- 內存分析
- 混淆
- 2-Android-4-工具
- adb命令
- 一鍵分析Android的BugReport
- 版本控制
- git
- git章節簡述
- 2-Android-5-源碼
- HandlerThread 源碼分析
- IntentService的使用和源碼分析
- 2-Android-9-辨析
- LRU算法
- 什么是Bitmap
- 常見圖片壓縮方式
- 3-Kotlin
- Kotlin使用筆記1-草稿
- Kotlin使用筆記2
- kotlin特性草稿
- Kotlin草稿-Delegation
- Kotlin草稿-Field
- Kotlin草稿-object
- 4-JavaScript
- 5-Python
- 6-Other
- Git
- Gradle
- Android中ProGuard配置和總結
- gradle使用筆記
- Nexus私服搭建
- 編譯提速最佳實踐
- 7-設計模式與架構
- 組件化
- 組件化探索(OKR)
- 1-參考列表
- 2-1-組件化概述
- 2-2-gradle配置
- 2-3-代碼編寫
- 2-4-常見問題
- 2-9-值得一讀
- 8-數據結構與算法
- 0臨時文件
- 漢諾塔
- 8-數據-1數據結構
- HashMap
- HashMap、Hashtable、HashSet 和 ConcurrentHashMap 的比較
- 遲到一年HashMap解讀
- 8-數據-2算法
- 1個就夠了
- Java常用排序算法(必須掌握的8大排序算法)
- 常用排序算法總結(性能+代碼)
- 必須知道的八大種排序算法(java實現)
- 9-職業
- 閱讀
- 書單
- 面試
- 面試-01-java
- Java面試題全集駱昊(上)
- Java面試題全集駱昊(下)
- Java面試題全集駱昊(中)
- 面試-02-android
- 40道Android面試題
- 面試-03-開源源碼
- Android圖片加載框架最全解析(二),從源碼的角度理解Glide的執行流程
- 面試-07-設計模式
- 面試-08-算法
- 面試-09-其他
- SUMMARY
- 版權說明
- temp111