1.5.2 UDP/IP
1.5.2.1 概述
DatagramSocket与DatagramPacket
建立发送端,接收端
建立数据包
调用Socket的发送、接收方法
关闭Socket
注:发送端与接收端使两个独立的运行程序
1.5.2.2 服务端
//打开UDP对象,并监听某个端口,用于接收数据
DatagramSocket ds = new DatagramSocket(10000);
//创建字节数组,用于保存接收到的数据
byte[] buf = new byte[1024];
//声明一个包接收器
DatagramPacket dp = new DatagramPacket(buf,buf.length);
while(true){
//通过开启的端口接收数据
ds.receive(dp);
ByteArrayInputStream bais = new ByteArrayInputStream(buf);
DataInputStream dis = new DataInputStream(bais);
System.out.println(dis.readUTF());
}
1.5.2.3 客户端
//要发送的数据
String string = "你asd123好sd";
//创建字节数组输出流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//创建数据流
DataOutputStream dos = new DataOutputStream(baos);
//写出数据,把数据写到字节数组流中,同时保存了数据类型
dos.writeUTF(string);
//把数据转换为字节数组
byte[] buf = baos.toByteArray();
//数据传输
//创建数据包,把数据进行打包,并绑定服务端地址和端口
DatagramPacket dp = new DatagramPacket(buf,buf.length,new InetSocktAddress("127.0.0.1",10000));
//传输需要本地开启端口把数据发送出去
DatagramSocket ds = new DatagramSocket(9999);
//发送数据包
ds.send(dp);
//关闭资源
ds.close();
System.out.println("发送完成");
2.正则表达式
2.1 概述
定义了字符串的模式,可以用来搜索,编辑,处理文本,并不仅限于某一种语言
但每种语言都会有细微差别
保存在java.util.regex包下
2.2 常用语法
\:转义符,把有意义的字符转换为无意义字符
范围相关:
[abc]:可能是a/b/c
[a-z]:可以匹配到小写字母
[A-Za-z0-9]:可以匹配到大小写字母数字
[^0-9]:匹配不是数字
简洁表示方式:
.:匹配任意字符,如果想匹配. 需要转义 \.
\d:表示数字
\D:表示非数字
\s:第哦啊是由空字符组成
\S:表示非空
\w:表示字母数字下划线
\W:表示非字母数字下划线
数量相关:
?:表示出现0次或1次
+:表示出现一次或多次
*:大于等于0
{n}:表示出现n次
{n,}:表示出现n次或n次以上
{n,m}:表示出现n到m次
|:或,x|y表示出现x或是y
():子表达式,看作一个整体
2.3 Java中的正则表达式
Java.util.regex包
PatternSyntaxException是一个非强制异常类,它表示一个正则表达式模式中的语法错误
2.3.1 Pattern
用于创建一个正则表达式,也可以说创建一个匹配模式,私有的,不可以直接创建
可以通过Pattern.complie(String regex)创建一个正则表达式
只能做一些简单的匹配操作
//匹配
//内容
String str = "23.465";
//正则表达式
String rege = "\\d+(\\.\\d+)?"
//创建引擎对象
Pattern pattern = Pattern.compile(regex);
//匹配,并且是全词匹配
boolean result = pattern.matches(regex,str);
System.out.println(result);
//拆分
String string = "1.2.3.4.5";
//创建正则表达式引擎对象
Pattern pattern = Pattern.compile("\\.");
//调用拆分方法
String[] arr = pattern.split(string);
for(String stirng2 : arr){
System.out.println(sting2);
}
2.3.2 Matcher
//1.matches:全词匹配
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:从前往后匹配,前面符合条件就行
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:任意位置符合条件都可以
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);
//4.group:find和group一起使用,可以做到数据提取
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 = "我我...我我...我要..要要...要要...学学学....学学...编编编..编程..程.程程...程...程";
//把.去掉
input = input.replaceAll("[^\u4E00-\u9FFF]","");
// (.) : 任意字符组成
// \\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查找,$1就是group(1),regex就等于group();
input = input.replaceAll(regex,"$1");
System.out.println(input);