第1章:网络编程1.1网络编程简介之前我们写的程序都是在本地自己玩,现在我想通过网络把我的数据发给你,你再给我回传过来,这就是网络编程。也就是网络之间的通信。 如果我们进行网络编程,数据传输,那么都需要什么要素呢?假设我要给你说话,我要先找到你,你是不是还要有一个接收数据的地方啊,也就是说你要接受我说的话,正常都是通过耳朵,聋人就不行了,那我给你说话,是不是还有按照一定的协议啊,要是我给你说韩文,说法语,你是不听不懂啊,所以还要有传输规则。 这就是网络通讯的三要素,IP地址+端口号+传输协议 下面来详细分析一下这三要素。 1.2 IP地址首先看IP地址 Ip地址现在大部分都是由四位组成的(IPV4),每位最大值是255, 不过现在IPV6也开始应用了。 每台计算机在没有联网之前,都有一个默认地址值,127.0.0.1 但是这个IP不好记忆,就会给计算机起个名字,,默认情况下使用localhost作为主机名 主机名的出现是为了方便记忆ip地址的。 针对这个IP地址,java有做了封装,在java.net包中有InetAddress。 InetAddress没有构造函数,不能new,但是有静态方法,可以直接用。 获取ip对象,通过getLocalHost方法,获取到ip对象以后就可以获取ip地址和 主机名了。代码如图1.1所示。 图1.1 获取ip和hostname 1.3 端口号两个主机上的QQ和飞秋进行通信,第一台给第二台发消息,把数据发送过去了,但是,数据发送过去之后,具体后面的主机的哪个程序会解析对应的数据呢,这样就没法确定了,所以就给每个应用程序起了一个名字,8000 9000,这个就叫端口号。 每个应用程序都至少有一个端口号。 端口号 用于标识进程的逻辑地址,不同进程的标识 有效端口:0~65535,其中0~1024系统使用或保留端口。 如果我使用了2425端口,飞秋这个软件就不能再使用这个端口了。 1.4 传输协议现在咱们能找到对方主机了,对应应用程序也能解析了 两台机器想要具备数据传输的话,必须还要具备另外一个规则,也就是说两个人要说同一种语言。 通讯规则有TCP和 UDP。 下面分析下这两个协议 UDP 将数据及源和目的封装成数据包中,不需要建立连接 每个数据包的大小在限制在64k内 因无连接,是不可靠协议 不需要建立连接,速度快 UDP就像是在邮局邮递包裹。只管发送,不管对方能不能收到。 TCP 建立连接,形成传输数据的通道。 在连接中进行大数据量传输 通过三次握手完成连接,是可靠协议 必须建立连接,效率会稍低 TCP就像是打电话,必须接通之后才能说话。 一般计算机都支持UDP和TCP协议。 第2章:正则表达式2.1 正则表达式概述一个需求:校验QQ号 实现这个需求需要写很多代码,如图2.1所示。 图2.1 普通java代码校验QQ号 这种太麻烦了,我们再写一种功能 到String类中找一个方法matches。先写一个例子,如图2.2所示。 图2.2 正则代码 下面我们就看一下刚才在reg变量中写的那一串字符串到底是什么含义 其实我们刚才在reg变量里面写的就是正则表达式 正则表达式:其实是一种规则,有自己特殊的应用。主要针对字符串进行操作。 正则就是用于操作字符串的规则,其中是以一些符号来表示规则, 你可以理解为:其实符号就是代表了底层的代码,不用再书写代码,而是使用一些符号来表示,简化了书写。 正则可以简化对字符串的复杂操作。 2.2 正则的功能正则表达式到底都可以实现哪些功能呢? 匹配、切割、替换、获取 下面根据这几个功能一个一个的来学习 2.2.1 匹配先看里面的匹配功能。代码如图2.3所示。 图2.3 正则的匹配应用 查看api中的字符解释,如图2.4所示。 图2.4 正则中的字符解释 写个例子,判断手机号是否正确,代码如图2.5所示。 图2.5 正则判断手机号 注意,这里面的[0-9]可以使用\d来表示 但是这个\在字符串中是个转义字符,所以在这需要再加一个\进行转义。代码如图2.6所示。 图2.6 正则校验手机号 2.2.2 切割功能&正则组演示下String中的split方法,写一个字符串,中间使用逗号隔开,是没问题的, 如果使用. 点的话,切割就会有问题,因为点在正则中表示是任意字符 这个时候需要对点进行转义。代码如图2.7所示。 图2.7 split和正则。 还要注意:字符串中有空格的话可以直接使用空格切开,但是如果有的有多个空格就有问题了,所以可以在空格后面加一个+号。代码如图2.8所示。 图2.8 正则应用 对叠数进行切割。代码如图2.9所示。 图2.9 正则应用 注意:() 这个小括号在真正则中也称为正则组。 多个组嵌套的话,如何区分优先级,用左括号来区分,从左边开始数,如图2.10所示。 图2.10 多个正则组的优先级 2.2.3 替换String中的replaceAll方法 把字符串中的叠词都替换成# 代码如图2.11所示。 图2.11 replaceAll使用正则 2.2.4 获取看需求: 想要获取由3个组成的单词,刚才的功能返回的都是一个结果,只有split返回的是数组,但是它是把规则作为分隔符,不会获取符合规则的内容,这时我们就要用到一些正则对象了, Pattern类,如图2.12所示。 图2.12 API文档介绍 使用Pattern类可以实现规则的编译和内容的提取等功能,代码如图2.13所示。 m.find();//将规则对字符串进行匹配查找 m.group();//在使用group方法之前,必须要先找,找到了才可以取。 图2.13 获取数据 第3章:Java源码反编译3.1 Java源码反编译将.java源文件转换成.class文件的过程称为编译 把.class文件转换成.java源文件的形式称为反编译 可以使用JD-GUI这个小工具实现反编译 演示一下,如图3.1所示。 File-->Open File 找到对应的class文件,打开即可。 图3.1 class反编译 |
|