网络原理和TCP传输,supplier接口,consumer接口,函数式接口

软件结构
c/s结构(client/server):客户端/服务器结构,开发成本高,服务器端压力小
b/s结构(borwser/server):浏览器/服务器结构,成本低,服务器端压力大
网络通讯的三要素
IP地址:网络设备的唯一标识
端口号:每一个进程(程序)的唯一标识
协议:用来确定计算机和计算机之间的数据传输格式.分为UDP协议和TCP协议
InetAddress实现IP地址
一个该类对象就代表一个IP地址(没有构造方法,不能new.类名.xxx)
常用的静态方法:
getLocalHost();获得本地主机的IP地址对象
getByName(String host);根据主机名/IP地址字符串获得IP地址对象
成员方法:
String getHostName();获得主机名
String getHostAddress();获得IP地址字符串
UDP协议
特点:面向无连接,只管发送不管对方是否接收的到,速度快但是不可靠,基于数据包(<=64)进行数据传输.主要使用在即时通讯,在线视频,网络电话
UDP的两个常用类
DatagramPacket 数据包对象,用来封装要发送或要接受的数据
构造方法:
DatagramPacket(byte[] buf,intlength,InetAddress address,
int port);创建发送端数据包对象,要发送的内容,其长度,接收端IP地址,接收端端口号
DatagramPacket(byte[] buf,intlength);创建接收端数据包对象,用来储存接收到的数据的字节数组,能够接收的长度
DatagremSocket 发送对象,用来发送/接收数据包
构造方法:
DatagramSocket();创建发送端发送对象
DatagramSocket(int port)创建接收端接收对象,port端口号
常用方法:
void sent(DatagramSocket dp);发送数据包
void receive(DatagramSocket dp);接收数据包
代码实现:
发送端:1.将发送的数据封装成数据包2.创建发送对象3.发送数据包.4.关闭socket
接收端:1.创建接收对象.2.创建接收端数据包对象3.接收数据包4.关闭socket
TCP协议
特点:面向连接协议,三次握手建立连接,四次挥手断开连接,基于IO流进行数据传输,数据大小无限制,速度慢但是可靠.主要使用在文件上传下载,邮件发送接收,远程登录
TCP常用两个类
socket;一个该类的对象就代表一个客户端程序
构造方法
socket(String host,int port);根据IP地址字符串和端口号创建客户端对象
常用方法
OutputStream getOutputStream(); 获得字节输出流对象
InputStream getInputStream(); 获得字节输入流对象
ServerSocket;一个该类对象就是一颗服务器端程序
构造方法
serversocket(int port);创建服务器端对象并指明端口号
常用方法
socket accept();等待客户端连接并获得与客户端关联的socket对象
TCP客户端代码实现步骤:
1. 创建客户端Socket对象指定服务器地址和端口号
2. 调用Socket对象的getOutputStream获得字节输出流
3. 调用字节输出流对象的write方法往服务器端输出数据
4. 调用Socket对象的getInputStream获得字节输入流
5. 调用字节输入流对象的read方法读取服务器返回的数据
6. 关闭socket断开连接。
TCP服务器端代码实现步骤
1. 创建服务器端的ServerSocket对象并指定端口号。
2. 调用ServerSocket对象的accept方法等待客户端连接并获得与客户端关联的Socket对象
3. 调用Socket对象的getInputStream方法获得字节输入流对象
4. 调用字节输入流对象的read方法读取客户端发送的数据
5. 调用Socket对象的getOutputStream方法获得字节输出流对象
6. 调用字节输出流对象的write方法返回数据给客户端
7. 关闭Socket和ServerSocket对象。
注意:
socket.shutdownOutput();告诉服务器端数据已经传输完毕(输出一个结束标记给服务器)
解释;客户端从硬盘读取数据,当读取到-1就停止读取,数据读取完毕,-1没有传输到服务器端,所有这一批数据没有结束标记,当服务器从客户端读取数据是无法以-1判定结束,所有会一直等待客户端传输数据
函数式接口
接口中有且只有一个抽象方法的接口就是函数式接口
常见的:Runnable run ; Callable call
Comparator Compare ; FileFilter accept
接口格式:
interface 接口名{
返回值类型 方法名(参数列表);//抽象方法只能有一个
default void 方法名(){}//可以有多个默认方法
}
@Ovrride注解:用来修饰方法声明,告诉编译器该方法是重写父类的方法,如果父类没有该方法会编译失败。
@FunctionalInterface注解:用来修饰接口的定义,告诉编译器该接口是函数式接口,如果不是则会编译失败
小结:当函数式接口作为方法参数或方法返回值类型时,可以直接lambda表达式作为返回参数或方法返回值。
输出语句方法引用: list.forEach(System.out::println);
方法引用
IDK1.8新特性,通过类名/方法名引用已经存在的方法来简化Lambda表达式
Lambda表达时使用前提:必须有函数式接口
方法引用前提是必须能使用Lambda,Lambda表达式仅仅调用一个已经存在的方法
方法引用四种类型
静态方法引用(类名::静态方法名);
注意事项:
* 被引用的方法和函数式接口中的抽象方法必须有相同的参数列表。
* 如果函数式接口中的抽象方法没有返回值类型,则被引用的方法可以有返回值,也可以没有返回值。
* 如果函数式接口中的抽象方法有返回值类型,则被引用的方法必须有相同的返回值类型。
对象方法引用(对象名::非静态方法名);
注意事项:
* 被引用的方法和函数式接口中的抽象方法必须有相同的参数列表。
* 如果函数式接口中的抽象方法没有返回值类型,则被引用的方法可以有返回值,也可以没有返回值。
* 如果函数式接口中的抽象方法有返回值类型,则被引用的方法必须有相同的返回值类型。

构造方法引用(类名/数组类型[]::new);

注意事项:
* 被引用的类中必须有一个构造方法的参数列表和函数式接口抽象方法的参数列表一致。
特定类型实例方法(特定类型的数据类型名::非静态方法名)
注意事项:
* 被引用的方法要比函数式接口中的抽象方法少一个参数。
* 一定是函数式接口中的抽象方法参数列表的第一个参数调用被引用的方法,其他参数作为被引用方法的参数传递。
原理:创建函数式接口的匿名内部类对象
重写函数式接口的抽象方法并在方法中调用被引用的方法
好处:简化Lambda表达式,重复利用已经存在的方法

26.11_通过this引用成员方法

this代表当前对象,如果需要引用方法就是当前类中的成员方法,那么可以使用“this::成员方法”的格式来使用方法引用。

26.12_通过super引用成员方法

如果存在继承关系,当Lambda中需要出现super调用时,也可以使用方法引用进行替代

方法引用的选择
* 只有当lambda表达式中仅仅调用了一个已经存在的方法时,才去考虑方法引用,否则不需要考虑。
* 如果 lambda表达式中是执行了一条创建对象或数组的语句,则可以考虑使用构造方法引用。
* 如果lambda表达式中是调用的是静态方法, 则考虑使用静态方法引用。
* 如果lambda表达式中是调用的是非静态方法,则考虑使用对象方法引用。
* Supplier接口
概述:用来生产数据,是一个泛型接口,生产数据的类型通过泛型变量指定
Supplier的抽象方法: T get(); 生产数据,返回生产的数据
* Consumer接口
概述:用来消费数据,也是泛型接口,消费数据的类型是通过泛型变量指定
Consumer的抽象方法:void accept(T t);消费指定类型数据t
Consumer的默认方法:andThen;一步接一步的操作
这两个接口都是只有一个抽象方法的函数式接口,所以可以使用Lambda进行操作.
生产数据就是通过重写这个抽象方法对数据进行处理并输出
消费数据

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值