A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 农家豆腐 初级黑马   /  2018-12-2 15:38  /  485 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

day11 网络编程


网络编程
软件结构
CS结构    BS结构

网络通信协议分类
UDP: User Datagram Protocol, 用户数据报协议
特点:
1. 无连接的不可靠协议
2. 数据按包发送, 64K一个包
3. 速度快效率高, 容易丢包
用于视频直播, 网络电话

TCP: Transmission Control Protocol, 传输控制协议
特点:
1. 需要建立连接的可靠协议 电话
2. 数据传输无大小限制
3. 速度慢效率低 重发机制
用于文件下载, 浏览网页

网络编程三要素:
1. 通信协议 TCP
2. IP地址
3. 端口号
IP地址: 互联网协议地址(Internet Protocol Address). 是网络中计算机的唯一标识
版本:
IPv4: 192.168.1.2
IPv6: ABCD:EF01:2345:6789:ABCD:EF01:2345:6789
特殊的IP地址: "127.0.0.1", "localhost", 都代表自己的电脑
常用DOS命令:
// 查看自己电脑的IP地址
ipconfig
// 查看是否能连接到指定IP地址
ping IP地址

端口号: 计算机中进程的唯一标识
端口号的取值范围: 0~65535的整数, 其中0~1024不建议使用


TCP通信
java.net.ServerSocket类: TCP服务端
// 构造方法
ServerSocket(int port): 创建一个TCP服务端, 并监听指定端口
// 成员方法
Socket accept(): 监听数据, 会阻塞. 收到数据后返回Socket对象
void close(): 关闭服务端ServerSocket

java.net.Socket类: TCP客户端
// 构造方法
Socket(String ip, int port): 创建TCP客户端对象
// 成员方法
OutputStream getOutputStream(): 获取输出流对象, 用于发送数据
InputStream getInputStream(): 获取输入流, 用于接收数据
void shutdownOutput(): 关闭输出流, 发送结束标记
void close(): 关闭客户端Socket

TCP严格区分为 客户端(Client) 与 服务端(Server)
两端通信时步骤:
1. 服务端程序需要先启动, 等待客户端的连接
2. 客户端主动连接服务器端, 连接成功才能通信. 服务端不可以主动连接客户端
两端之间以 "IO字节流" 进行通信
一个服务端可以和多个客户端同时通信

服务端(ServerSocket)可以通过 accept() 方法等待一个客户端(Socket)主动连接, 从而得到一个客户端对象
(Socket), 来识别不同的客户端
服务端(ServerSocket)没有IO流, 是通过获取到"每个客户端对象(Socket)的IO流对象"来进行通信的.
使用"客户端的InputStream"读取客户端发来的数据
使用"客户端的OutputStream"向客户端回写数据

释放资源时, 关闭Socket同时会关闭流对象


客户端服务器 传递 信息
客户端  把所要上传文件或信息 通过 创建流对象 读出来,再用网络流 Socket 写 给服务器
服务器   监听客户端信息(服务端的accept( ) 方法),所调用出来网络流 把 客户端 写来的内容,通过 网络流 读出来, 如果是文件再通过创建本地流对象 保存到本地   

文件上传案例: 阻塞问题
java.net.Socket类: TCP客户端
void shutdownOutput(): 关闭输出流, 告知服务端数据发送完毕
在客户端用while循环写数据的判定条件时,无法输出 -1, 而 服务端也用while循环读数据的判定条件时,无法接收到 -1,所以无法停止,需在客户端后加

服务端 优化(命名, 循环, 多线程) 时,
服务器 只创建 一次, 所以放 while死循环外
监听客户端连接放在多线程外




day12 函数式接口

函数式接口: JDK 8 新特性
有且仅有一个抽象方法的接口, 适用于函数式编程场景的接口
(默认方法, 静态方法, 私有方法, 与 java.lang.Object 类中定义相同的抽象方法, 都不算作抽象方法)
自定义函数式接口:
接口中有且只有一个抽象方法
@FunctionalInterface的作用:
在接口上使用, 检测当前的接口是否为函数式接口

函数式接口的使用:
作为方法的参数类型, 传递Lambda表达式, 代替匿名内部类方式

Lambda具有"延迟执行"的特点:
传递Lambda对象, 只有当符合执行条件时, 才会执行代码


   Supplier< T >: 生产型函数接口          获取值
Consumer< T >: 消费型函数接口          使用值
Predicate< T >:  条件判断型函数接口   判断值
Function< T >:    转换型函数接口          转换值


Supplier生产型函数接口
抽象方法
T get()  获取


Consumer 消费型函数式接口
抽象方法
void accept ( T t )   使用值或对象
默认方法
andThen    拼接      谁写前面, 谁先消费



Predicate 条件判断函数式接口
抽象方法
boolean  test  ( T t )   判断         

默认方法 (连接多个判断条件)
and  or  negate     与或非



Function 转换型函数型接口
Function< T, R >  T 输入类型 ( 方法内参数 )   
                             R  输出类型 ( 方法返回值类型 )

抽象方法
R apply( T t )  将 T 转换为 R

默认方法( 用于拼接 )
andThen



day13  Stream 方法引用

Stream流式思想
1, 管道特性,链式调用
2, 内部迭代 不用写for循环

Stream流只能用一次


获取Stream流对象
1, {collection接口}集合名 . stream
2, {Stream接口}Stream.of(数组)


延迟方法
1, filter( )  过滤             方法参数 Predicate
2,map( )   转换/映射      方法参数  Function
3,limit( )   截取
4,skip( )    跳过


终结方法
1,forEach    遍历
2,count      统计


静态方法
concat( ) [] 合并两个流


方法引用能简化以下场景: (方法名后不要写小括号)
场景 格式 简化之前的Lambda 方法引用简化后
1. 通过对象名引用成员方法
对象名::成员方法名 ()->person.eat() person::eat
2. 通过类名引用静态方法
类名::静态方法名 i -> Math.abs(i) Math::abs
3. 通过super引用父类成员方法
super::父类方法名 ()->super.eat(); super::eat
4. 通过this引用本类成员方法
this::本类方法名 ()->this.eat(); this::eat
5. 引用某个类的构造方法
类名::new name->new Person(name) Person::new
6. 引用创建数组的方法
数据类型[]::new length->new int[length]; int[]::new


day14  JUnit 反射 注解


JUnit
断言: Assert
使用断言操作来判断结果是否符合预期:
Assert.assertEquals(期望的结果, 运算的结果);
如果 期望的结果 和 运算的结果 相等, 则认为测试通过, 否则测试失败
测试失败的原因提示:
java.lang.AssertionError:

@Before: 修饰的方法会"在每个测试方法执行 之前"被执行
@After: 修饰的方法会"在每个测试方法执行 之后"被执行
注意:
@Before, @After 修饰的方法可以有多个, 但是谁先执行是由JUnit内部来决定的, 没有明显的规律
所以不要写多个@Before, @After 修饰的方法


反射

Java代码在计算机中的3个阶段:
        SOURCE: 源代码阶段
        CLASS: 类对象阶段
        RUNTIME: 运行时阶段
获取一个类的字节码对象的3种方式:
        1. Class.forName("全类名")
        2. 类名.class                         .
        3. 对象.getClass()



获取成员变量Field


1. set ( 指定的对象,  设置的值 )
2. get( 指定的对象 )    获取指定对象的值

void setAccessible( true )
暴力反射,忽略权限修饰符的安全检查.



获取构造方法Constructor

1. T newInstance(Object... initargs):
构造方法   传入参数, 创建对象为有参     不写参数 为无参构造
2. void setAccessible(boolean flag):
注意: 构造方法不能利用此方法忽略权限, 会抛异常
       



反射: 获取成员方法Method

1. Object invoke(Object obj, Object... args):
使用指定对象和指定参数值调用此方法
2. String getName(): 获取方法名
3. void setAccessible( true ):
忽略访问权限修饰符的安全检查. 暴力反射



注解 (Annotation)

使用注解: @注解名称
作用分类:
1. 编写文档: 通过代码里标识的注解生成文档
(生成API文档 @author @version @since @param @return)
2. 代码分析: 通过代码里标识的注解对代码进行分析 (使用反射)
(JUnit提供的 @Test @Before @After)
3. 编译检查: 通过代码里标识的注解让编译器能够实现基本的编译检查
(@Override @FunctionalInterface)


元注解

用于描述注解的注解
常用元注解:
@Target: 描述注解能够作用的位置
ElementType枚举的常用取值:
TYPE:可以作用于类上
METHOD:可以作用于方法上
FIELD:可以作用于成员变量上

@Retention: 描述注解被保留的阶段
RetentionPolicy枚举的取值:
SOURCE: 保留到源代码阶段
CLASS: 保留到类对象阶段
RUNTIME: 保留到运行时阶段

@Documented: 加上后, 当前注解会被抽取到api文档中
@Inherited: 加上后, 当前注解会被子类继承
















0 个回复

您需要登录后才可以回帖 登录 | 加入黑马