1 网络通信
通信双方地址
a)IP
b)端口号
c)OSI参考模型:模型过于理想化,未能在因特网上进行广泛推广
d)TCP/IP参考模型(或TCP/IP协议):事实上的国际标准。
1.1 OSI七层
应用层,表示层,会话层,传输层,数据链路层,物理层,网络层
应用层 : 在网络中向用户提供服务窗口,主要用来支持用户的需求
电子邮件,文件传输等
主要协议 : http(80),DNS,FTP(21)
表示层 : 为通信提供一种公共的语言,方便交互,因为计算机系统结构不同,数据表示方式也就不同
其他功能 可以做数据加密,数据压缩等
传输层 : 两台计算机经过网络进行数据通信
协议有 TCP/UDP
数据链路层 : 可以理解为数据通道
MAC地址表示唯一性
网络层 : 以IP报文的形式进行传递,并且在网络层IP地址表示唯一性
1.2 网络协议
1.2.1 TCP/IP
1.2.1.1 概述
传输层协议中有两个非常重要的协议:
传输控制协议TCP(Transmission Control Protocol)
用户数据报协议UDP(User Datagram Protocol)。
TCP/IP 以其两个主要协议:传输控制协议(TCP)和网络互联协议(IP)而得名,实际上是一组协议,包括多个具有不同功能且互为关联的协议。
IP(Internet Protocol)协议是网络层的主要协议,支持网间互连的数据通信。
TCP/IP协议模型从更实用的角度出发,形成了高效的四层体系结构,即物理链路层、IP层、传输层和应用层。
1.2.1.3 服务端
// 创建对象,支持TCP协议.并开启端口号
ServerSocket ss = new ServerSocket(10000);
System.out.println(“服务器已经启动,等待客户端连接…”);
// 执行该方法的时候,线程就停下来了,等待客户端连接
// 只要有客户端连接,就会返回socket对象,里面封装的是客户端的信息
Socket skt = ss.accept();
System.out.println(“客户端已连接”);
// 获取客户端信息
// 获取客户端对应的输入流
InputStream is = skt.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is,“UTF-8”));
// 给客户端发送数据
// 获取客户端对应的输出流
OutputStream os = skt.getOutputStream();
PrintWriter pw = new PrintWriter(new OutputStreamWriter(os,“UTF-8”));
// 接收用户输入
Scanner scanner = new Scanner(System.in);
String msg = null;
boolean flag = true;
while (flag) {
// 读取数据
String line = br.readLine();
System.out.println("客户端发来消息 : " + line);
msg = scanner.nextLine();
if (msg.equals(“exit”)) {
flag=false;
}
// 给客户端发送数据
pw.println(msg);
pw.flush();
}
// 关闭资源
br.close();
pw.close();
skt.close();
ss.close();
System.out.println(“已断开连接”);
1.2.1.4 客户端
// 客户端对象,指定服务端IP和端口
Socket skt = new Socket("127.0.0.1", 10000);
// 获取客户端信息
// 获取客户端对应的输入流
InputStream is = skt.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is,"UTF-8"));
// 给服务端发送数据
// 获取服务端对应的输出流
OutputStream os = skt.getOutputStream();
PrintWriter pw = new PrintWriter(new OutputStreamWriter(os,"UTF-8"));
// 接收用户输入
Scanner scanner = new Scanner(System.in);
String msg = null;
boolean flag = true;
while (flag) {
// 给服务端发送数据
pw.println(msg);
pw.flush();
msg = scanner.nextLine();
if (msg.equals("exit")) {
flag = false;
}
// 读取数据
String line = br.readLine();
System.out.println("服务端发来消息 : " + line);
}
// 关闭资源
br.close();
pw.close();
skt.close();
1.2.2 UDP/IP
UDP网络通信
流 程:
1.DatagramSocket与DatagramPacket
2.建立发送端,接收端
3.建立数据包
4.调用Socket的发送、接收方法
5.关闭Socket
发送端与接收端是两个独立的运行程序
1.2.2.1 服务端
1.2.2.2 客户端
2. 正则表达式
2.2 Java中的正则表达式
java.util.regex包
PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误
2.3.1 Pattern
用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创建
可以通过Pattern.complie(String regex)创建一个正则表达式
只能做一些简单的匹配操作
使用:
Pattern.split(CharSequence input) ,成员方法, 用于分隔字符串
import java.util.regex.*;
public class TestRegex
{
public static void main(String[] args)
{
String input=“001_天亮_教育_石家庄”;
Pattern pattern=Pattern.compile("_");
String[] strArray=pattern.split(input);
for(String ele:strArray){
System.out.println(ele);
}
}
}
Pattern.matches (String regex,CharSequence input),静态方法,用于快速匹配字符串,该方法适合用于只匹配一次,且匹配全部字符串。
2.3.2 Matcher
构造方法也是私有的,不能随意创建,只能通过Pattern.matcher(CharSequence input)方法得到该类的实例 Matcher m = p.matcher(“aaaaab”);
支持便捷强大的正则匹配操作,包括分组、多次匹配支持
2.3.2.1 字符串匹配
Matcher.matches():对整个字符串进行匹配,只有整个字符串都匹配了才返回true
Matcher.lookingAt():对前面的字符串进行匹配,只有匹配到的字符串在最前面才返回true
Matcher.find():对字符串进行匹配,匹配到的字符串可以在任何位置
// 1 matches : 全词匹配
public static void test1() {
String input = “13113113111”;
String regex = “\d{11}”;
// 创建正则表达式引擎对象
Pattern pattern = Pattern.compile(regex);
// 创建匹配器
Matcher matcher = pattern.matcher(input);
// 匹配
boolean result = matcher.matches();
System.out.println(result);
}
// 2 lookingAt : 从前往后匹配,前面符合条件就行
public static void test2() {
String input = "13113113111asd";
String regex = "\\d{11}";
// 创建正则表达式引擎对象
Pattern pattern = Pattern.compile(regex);
// 创建匹配器
Matcher matcher = pattern.matcher(input);
// 匹配
boolean result = matcher.lookingAt();
System.out.println(result);
}
// 3 find : 任意位置符合条件都可以
public static void test3() {
String input = "asd13113113111asd";
String regex = "\\d{11}";
// 创建正则表达式引擎对象
Pattern pattern = Pattern.compile(regex);
// 创建匹配器
Matcher matcher = pattern.matcher(input);
// 匹配
boolean result = matcher.find();
System.out.println(result);
}
2.3.2.2 数据提取
// 4 group : find和group一起使用,可以做到数据提取
public static void test4() {
String input = “张小三的电话号码是13113113111s@##李四的电话号码是13113113112王五的电话号码是13113113113”;
// [\u4E00-\u9FFF] 汉字范围
String regex = “([\u4E00-\u9FFF]{2,3})的电话号码是(\d{11})”;
// 创建正则表达式引擎对象
Pattern pattern = Pattern.compile(regex);
// 创建匹配器
Matcher matcher = pattern.matcher(input);
// 匹配
while (matcher.find()) {
// group() 和 group(0) 都是提取匹配到的数据
// 1 就是第一组数据(第一个小括号) , 2 就是第二组数据
// System.out.println(matcher.group());
// System.out.println(matcher.group(0));
System.out.println(matcher.group(1)+" : "+matcher.group(2));
}
}
2.3.2.3 叠词去重
// 还原成 : 我要学编程
String input = “我我…我我…我要…要要…要要…学学学…学学…编编编…编程…程.程程…程…程”;
// 1 把.去掉
input = input.replaceAll("[^\u4E00-\u9FFF]", “”);
// 我我我我我要要要要要学学学学学编编编编程程程程程程
System.out.println(input);
// (.) : 任意字符组成
// \\1 获取前面组中的数据
// (\\d)\\1 : 表示两个连续出现的数字, 比如 11,22,33,44
// (\\d)(a)\\1 : 表示 第一个和第三个是相同的数字,且数字中间有个a ,1a1,9a9
// (\\d)(a)\\2 : 表示 第一个是数字,第二个和第三个都是a,1aa,3aa
String regex = "(.)(\\1+)";
// 创建正则表达式引擎对象
Pattern pattern = Pattern.compile(regex);
// 创建匹配器
Matcher matcher = pattern.matcher(input);
// find查找
// while (matcher.find()) {
// // 使用 group(1)把group(0) 替换即可
// input = input.replaceAll(matcher.group(), matcher.group(1));
// }
// $1 就是 group(1) 而 regex 就等于是group();
input = input.replaceAll(regex, "$1");
System.out.println(input);