网络编程
计算机网络
所谓计算机⽹络,就是把分布在不同区域的计算机与专⻔的外部设备⽤通信线路相互连接成⼀个规模⼤,⽽且功能强的⽹络系统,从⽽使得计算机之间可以相互传递信息,共享数据、软件等资源
所谓⽹络编程,指的就是在同⼀个⽹络中不同机器之间的通信
计算机之间通信需要的条件
- IP地址
IP地址指的是互联⽹地址(Internet Protocol Address ) ,是联⽹设备与互联⽹之间的唯⼀标识,在同⼀个⽹段中,IP地址是唯⼀的
IP地址是数字型的,是⼀个32位的整数,通常将其分成4个8位的⼆进制数,每8位之
间⽤圆点隔开, 每个8位整数可以转换为⼀个0~255的⼗进制整数,
例如:202.9.128.88
标准分类:分为IPV4和IPV6
IP地址使⽤范围分类
A类:保留给政府结构,1.0.0.1 ~ 126.255.255.254
B类:分配给中型企业,128.0.0.1 ~ 191.255.255.254
C类:分配给任何需要的个⼈,192.0.0.1 ~ 223.255.255.254
D类:⽤于组播,224.0.0.1 ~ 239.255.255.254
E类:⽤于实验,240.0.0.1 ~ 255.255.255.254
回收地址:127.0.0.1,指本地机,⼀般⽤于测试使⽤
IP地址可以唯⼀的确定⽹络上的⼀个通信实体,但⼀个通信实体可以有多个通信程序
同时提供⽹络服务,此时还需要使⽤端⼝
- 端⼝
数据的发送和接收都需要通过端⼝出⼊计算机,端⼝号⽤于唯⼀标识通信实体上进⾏⽹络通讯的程序,同⼀台机器上不能两个程序占⽤同⼀个端⼝
端⼝号的取值范围:0~65535
端⼝分类:
公认端⼝:0~1023
注册端⼝:1025~49151
动态或私有端⼝:1024~65535
常⽤端⼝:
mysql:3306
oracle:1521
tomcat:8080
- 通信协议
需要通信的设备之间需要实现相同的通信协议
⽹络分层(七层协议):物理层,数据链路层,⽹络层,传输层,会话层,表示层,应⽤层
通信协议分类:
- 传输层协议:TCP和UDP
- ⽹络层IP协议:IPV4和IPV6,互联⽹协议
- 应⽤层协议:HTTP
七层协议
应⽤层
与其它计算机进⾏通讯的⼀个应⽤,它是对应应⽤程序的通信服务的。 例如,⼀个没有通信功能的字处理程序就不能执⾏通信的代码, 从事字处理⼯作的程序员也不关⼼OSI的第7层。但是,如果添加了⼀个 传输⽂件的选项,那么字处理器的程序员就需要实现OSI的第7层。 示例:TELNET,HTTP,FTP,NFS,SMTP等。
表示层
这⼀层的主要功能是定义数据格式及加密。例如,FTP允许你选择以⼆进制 或ASCII格式传输。如果选择⼆进制,那么发送⽅和接收⽅不改变⽂件的内容。 如果选择ASCII格式,发送⽅将把⽂本从发送⽅的字符集转换成标准的ASCII后 发送数据。在接收⽅将标准的ASCII转换成接收⽅计算机的字符集。示例:加密,ASCII等。
会话层
它定义了如何开始、控制和结束⼀个会话,包括对多个双向消息的控制和管理, 以便在只完成连续消息的⼀部分时可以通知应⽤,从⽽使表示层看到的数据是连续的,在某些情况下,如果表示层收到了所有的数据,则⽤数据代表表示层。示例:RPC,SQL等。
传输层
这层的功能包括是否选择差错恢复协议还是⽆差错恢复协议,及在同⼀主机上对不同应⽤的数据流的输⼊进⾏复⽤,还包括对收到的顺序不对的数据包的重新排序功能。示例:TCP,UDP,SPX。
⽹络层
这层对端到端的包传输进⾏定义,它定义了能够标识所有结点的逻辑地址,还定义了路由实现的⽅式和学习的⽅式。为了适应最⼤传输单元⻓度⼩于包⻓度的传输介质,⽹络层还定义了如何将⼀个包分解成更⼩的包的分段⽅法。示例:IP,IPX等。
数据链路层
它定义了在单个链路上如何传输数据。这些协议与被讨论的各种介质有关。示例:ATM,FDDI等。
物理层
OSI的物理层规范是有关传输介质的特性标准,这些规范通常也参考了其他组织制定的标准。 连接头、帧、帧的使⽤、电流、编码及光调制等都属于各种物理层规范中的内容。 物理层常⽤多个规范完成对所有细节的定义。示例:Rj45,802.3等。
客户端和服务器
客户端:可以让⽤户直接交互,⽤来访问服务器端
服务器端:给⽤户提供数据的存储,数据的中转,数据的运算
注意:
1.客户端服务器端都是指的是应⽤(app),⽽⾮主机,即 客户端!=主机 服务器端!=主机
2.⼀台主机上可以同时运⾏多个应⽤
3.⼀台主机上可以同时存储客户端和服务器端,也可以分属于不同的主机
4.应⽤就是⼀个进程,所以客户端和服务器端都是独⽴的进程
相关类的使⽤
Java提供了InetAddress类来代表ip地址,是对ip地址的抽取和封装,有两个⼦类:Inet4Address,Inet6Address,分别表示IPv4和IPv6
//1.获取主机:主机名称和ip地址
id1 = InetAddress.getLocalHost();
//2.获取ip地址的字符串表示形式
String str1 = id1.getHostAddress();
//3.获取主机名
String str2 = id1.getHostName();
//4.根据主机或者ip地址获取InetAddress对象
InetAddress id2 = InetAddress.getByName("10.31.165.42");
//5.根据主机或者ip地址获取所有InetAddress对象
InetAddress[] arr = InetAddress.getAllByName("www.baidu.com");
for(InetAddress address:arr) {
//www.baidu.com/115.239.210.27
System.out.println(address.toString());
//115.239.210.27
System.out.println(address.getHostAddress());
//www.baidu.com
System.out.println(address.getHostName());
}
基于TCP的⽹络编程
TCP,Transmission Control Protocol,传输控制协议,基于字节流的传输层通信协议
特点:
a.安全的
b.⾯向连接的
c.效率低
d.传输数据⼤⼩限制,⼀旦连接建⽴,双⽅可以按统⼀的格式传输⼤的数据
TCP的三次握⼿
a.客户端向服务端发送⼀个请求
b.服务端收到请求后,回客户端⼀个响应
c.客户端向收到服务端的响应后,回服务端⼀个确认信息
Socket和ServerSocket
客户端发送消息,服务端接收消息
//客户端
Socket socket = null;
try {
socket = new Socket(InetAddress.getByName("10.31.165.42"),7777);
OutputStream output = socket.getOutputStream();
//3.写⼊
output.write("hello你好吗?".getBytes());
output.flush();
}
//服务端
//1.实例化⼀个ServerSocket的对象
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(7777);
//2.监听,获取连接到的客户端
System.out.println("等待服务端的连接...");
//注意:在未连接成功之前,将⼀直处于阻塞状态
Socket socket = serverSocket.accept();
System.out.println("连接成功");
//3.获取⽹络到内存的⼀个输⼊流
InputStream input = socket.getInputStream();
//4.读取数据
byte[] arr = new byte[1024];
int len = input.read(arr);
String message = new String(arr, 0, len);
//5.组织信息
String ipString =
socket.getInetAddress().getHostAddress();
int port = socket.getPort();
System.out.println(ipString +":" + port + "说:"+ message);
}
UDP编程
User Datagram Protocol的简称,⽤户数据包协议,提供⾯向事务的简单不可靠信息传送服务
特点:
a.不安全
b.⽆连接
c.效率⾼
d.UDP传输数据时是有⼤⼩限制的,每个被传输的数据报必须限定在64KB之内
DatagramSocket和DatagramPacket
//发送⽅
DatagramSocket socket = null;
try {
//1.实例化DatagramSocket的对象
socket = new DatagramSocket();
//2.将需要发送的数据封装为数据报包
DatagramPacket packet = new
DatagramPacket(message.getBytes(),message.length(),
InetAddress.getByName(ip), port);
//3.发送
/将数据写⼊⽹络的过程
socket.send(packet);
}
//接收⽅
DatagramSocket socket = null;
try {
//1.实例化DatagramSocket的对象
socket = new DatagramSocket(6666);
//2.将接收到的数据封装到数据报包中
byte[] arr = new byte[1024];
DatagramPacket packet = new DatagramPacket(arr,arr.length);
//3.接收数据
socket.receive(packet);
//4.获取发送⽅的详细信息
byte[] messages = packet.getData();
String result = new String(messages, 0,messages.length);
//获取发送⽅的ip地址
/**
* InetAddress getAddress()
返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收
到的。
*/
InetAddress address = packet.getAddress();
String ip = address.getHostAddress();
//获取消息是从发送发的哪个端⼝号发出来的
/**
* int getPort()
返回某台远程主机的端⼝号,此数据报将要发往该主机或者是从该主机接
收到的。
*/
int port = packet.getPort();
System.out.println(ip + ":" + port + "说:" +result);
}
RPC
RPC, 远程过程调⽤(Remote Procedure Call,RPC)是⼀个计算机通信协议,该协议允许运⾏于⼀台计算机的程序程调⽤另⼀台计算机的上的程序。通俗讲,RPC通过把⽹络通讯抽象为远程的过程调⽤,调⽤远程的过程就像调⽤本地的⼦程序⼀样⽅便,从⽽屏蔽了通讯复杂性,使开发⼈员可以⽆需关注⽹络编程的细节,将更多的时间和精⼒放在业务逻辑本身的实现上,提⾼⼯作效率。
RPC本质上是⼀种 Inter-process communication(IPC)——进程间通信的形式。常⻅的进程间通信⽅式如管道、共享内存是同⼀台物理机上的两个进程间的通信,⽽RPC就是两个在不同物理机上的进程之间的通信。概括的说,RPC就是在⼀台机器上调⽤另⼀台机器上的⽅法,这种调⽤在远程机器上对代码的执⾏就像在本机上对代码的执⾏⼀样,只是迁移了⼀个执⾏环境⽽已。
1.客户端client发起服务调⽤请求。
2.client stub 可以理解成⼀个代理,会将调⽤⽅法、参数按照⼀定格式进⾏封装,通过服务提供的地址,发起⽹络请求。
3.消息通过⽹络传输到服务端。
4.server stub接受来⾃socket的消息
5.server stub将消息进⾏解包、告诉服务端调⽤的哪个服务,参数是什么
6.结果返回给server stub。
7.sever stub把结果进⾏打包交给socket
8.socket通过⽹络传输消息
9.client slub 从socket拿到消息。
10.client stub解包消息将结果返回给client。
⼀个RPC框架就是把步骤2到9都封装起来。
TCP
传输的是流
是建⽴在连接的基础上
安全性更⾼
传输速度低
适合传输数据量⼤的数据
适合点对点通信
UDP
传输的是包
建⽴在⾮连接的基础上
安全性低
速度⾼
数据量⼩的数据
适合⼴播