本次主要介绍网络编程的简单总结,大数据的HDFS原理中RPC协议,Socket 编程,为了更好的学习大数据的内容,这次简单的讲解一下网络编程。
另外本博客会持续更新大数据学习的资料,包括概念,原理,搭建,入门案例,小案例等,感兴趣的童鞋,欢迎关注,多多交流。
本次的网络编程主要分为一下几个部分:
网络编程:是指在操作系统,网络管理软件,网络通信协议的管理和协调下,使用计算机编程语言来实现计算机之间的资源共享和信息传递。
对我们来说即如何用编程语言实现计算机网络中不同计算机之间的通信。
IP地址
IP地址指的是计算机在网络中的唯一标识,32bit(4字节),一般用“点分十进制”表示,举个例子:192.168.25.101,可以分类:
Java编程可采用InetAddress 类来操纵 IP 地址。
public static void main(String[] args) throws UnknownHostException {
InetAddress localHost = InetAddress.getLocalHost();
System.out.println(localHost.getHostAddress());
System.out.println(localHost.getHostName());
}
端口号
传输协议
常见的传输协议有UDP(用户数据报协议)和TCP(传输控制协议)
计算机网络之间以何种规则进行通信,就是网络模型所研究的问题。实际的含义是建立某种模型,实现网络数据的传输,中间会对数据进行多次的封装和拆封,实现最底层的传输要求。
网络模型一般是指 OSI 七层参考模型和 TCP/IP 五层参考模型。
每一层实现各自的功能和协议,并且都为上一层提供业务功能。为了提供这种业务功能,下一层将上一层中的数据并入到本层的数据域中,然后通过加入报头或报尾来实现该层业务功能,该过程叫做数据封装。
用户的数据要经过一次次包装,最后转化成可以在网络上传输的信号,发送到网络上。当到达目标计算机后,再执行相反的数据拆包过程。
每一层的含义具体如下:
物理层
主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。
主要作用是将数据最终编码为用 0、 1 标识的比特流,通过物理介质传输。这一层的数据叫做比特。
数据链路层:
主要将接收到的数据进行 MAC 地址(网卡地址)的封装与解封装。常把这一层的数据叫做帧。这一层常工作的设备是交换机。
网络层:
主要将接收到的数据进行 IP 地址的封装与解封装。常把这一层的数据叫做数据包。这一层设备是路由器。
Socket概述
Socket,又称为套接字, 用于描述 IP 地址和端口。应用程序通常通过 socket向网络发出请求或者应答网络请求。
Socket 就是为网络编程提供的一种机制:通信两端都有 socket;网络通信其实就是 socket 之间的通信;数据在两个 socket 之间通过 IO 传输。
网络编程也称作为Socket 编程,套接字编程。Socket 通信是 Client/Server模型。
基于 UDP 协议的 Socket 通信
// 创建发送端 Socket 服务对象
DatagramSocket dSocket = new DatagramSocket();
// 创建数据,打包数据
String message = "hello ,are u UDP ?";
byte[] bys = message.getBytes();
int length = bys.length;
InetAddress address = InetAddress.getByName("localhost");
int port = 12621;
DatagramPacket dPacket = new DatagramPacket(bys, length, address, port);
// 发送数据
dSocket.send(dPacket);
// 资源释放
dSocket.close();
//创建接收端 Socket 服务对象
DatagramSocket dSocket = new DatagramSocket(12621);
//创建数据包(接收容器)
byte[] bys = new byte[1024];
DatagramPacket dPacket = new DatagramPacket(bys, bys.length);
//调用接收方法
dSocket.receive(dPacket);
//数据包解析
InetAddress address = dPacket.getAddress();
String hostAddress = address.getHostAddress();
byte[] data = dPacket.getData();
String message = new String(data);
System.out.println(hostAddress+"*********:"+message);
//资源释放
dSocket.close();
//建立服务端 socket 服务,并且监听一个端口
ServerSocket ss = new ServerSocket(13131);
//监听连接
Socket s = ss.accept();
//获取输入流, 读取数据
InputStream inputStream = s.getInputStream();
byte[] bys = new byte[1024];
int len = inputStream.read(bys);
System.out.println(new String(bys, 0, len));
//关闭客户端
s.close();
//关闭服务端, 一般服务端不关闭
ss.close();
//创建客户端的 socket 服务,指定目的主机和端口
Socket s = new Socket("127.0.0.1", 13131);
//通过 socket 获取输出流,写数据
OutputStream outputStream = s.getOutputStream();
outputStream.write("hello ,this is tcp?".getBytes());
//释放资源
s.close();
网络通信的本质是网络间的数据 IO。 只要有 IO,就会有阻塞或非阻塞的问题,无论这个 IO 是网络的,还是硬盘的。 原因在于程序是运行在系统之上的任何形式的 IO 操作发起都需要系统的支持。
BIO(阻塞模式)
BIO 即 blocking IO,是一种阻塞式的 IO。jdk1.4 版本之前 Socket 即 BIO 模式。
BIO 的问题在于 accept()、 read()的操作点都是被阻塞的。
原理
务器线程发起一个 accept 动作,询问操作系统是否有新的 socket 信息从端口 X 发 送过来。 注意,是询问操作系统。 如果操作系统没有发现有 socket 从指定的端口 X 来,那么操作系统就会等待。这样 serverSocket.accept()方法就会一直等待。这就是为什么 accept()方法为什么会阻塞。
线程等待
如果想让 BIO 同时处理多个客户端请求,就必须使用多线程,即每次 accept阻塞等待来自客户端请求,一旦收到连接请求就建立通信, 同时开启一个新的线程来处理这个套接字的数据读写请求,然后立刻又继续 accept 等待其他客户端连接请求,即为每一个客户端连接请求都创建一个线程来单独处理。
NIO(非阻塞模式)
NIO 即 non-blocking IO,是一种非阻塞式的 IO。 jdk1.4 之后提供。
NIO 三大核心部分: Channel(通道), Buffer(缓冲区), Selector(选择器)。
阻塞和非阻塞
阻塞 IO 和非阻塞 IO 这两个概念是程序级别的。主要描述的是程序请求操作系统 IO 操作后,如果 IO 资源没有准备好,那么程序该如何处理的问题:
什么是RPC
RPC( Remote Procedure Call Protocol) 远程过程调用协议。
RPC主要特质
RPC原理
实现 RPC 的程序有5 个部分: User、 User-stub、 RPCRuntime、 Server-stub、 Server。
权威参考: 《UNIX 网络编程:卷一》第六章——I/O 复用
网络编程的内容简介就到这里结束。
另外本博客会持续更新大数据学习的资料,包括概念,原理,搭建,入门案例,小案例等,感兴趣的童鞋,欢迎关注,多多交流。