Da网络编程、正则表达式

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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值