第1节 概述
通过通信线路(有线或⽆线)可以把不同地理位置且相互独⽴的计算机连同其外部设备连接起来,组成计算机网络。在操作系统、⽹络管理软件及网络通信协议的管理和协调下,可以实现计算机之间的资源共享和信息的传递。 网络编程是指⽤来实现网络互联的不同计算机上运⾏的程序间可以进⾏数据交换。对我们来说即如何⽤编程语⾔ java 实现计算机网络中不同计算机之间的通信。
第2节 网络通信三要素
IP地址
网络中计算机的唯⼀标识; 32bit(4 字节),⼀般⽤“点分⼗进制”表示,如 192.168.1.158;
IP地址=⽹络地址+主机地址
可分类: A 类:第 1 个 8 位表示⽹络地址。剩下的 3 个 8 位表示主机地址(主要留给ZF或者⼤型企业)
B 类:前 2 个 8 位表示⽹络地址。剩下的 2 个 8 位表示主机地址 (主要分配给中等规模的公司)
C 类:前 3 个 8 位表示⽹络地址。剩下的 1 个 8 位表示主机地址 (分配给⼩公司或者个⼈)
D 类地址⽤于在 IP ⽹络中的组播 E 类地址保留作研究之⽤。
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());
}
端口号:
⽤于标识进程的逻辑地址,不同进程的标识; 有效端口: 0-65535,其中 0-1024 系统使⽤或保留端口。
传输协议
通讯的规则 常⻅协议: UDP(⽤户数据报协议)、 TCP(传输控制协议)
UDP 将数据及源和⽬的封装成数据包中。不需要建⽴连接 每个数据报的⼤⼩在限制在64k内 因⽆连接,是不可靠协议 不需要建⽴连接,速度快。
TCP 建⽴连接,形成传输数据的通道。 在连接中进⾏⼤数据量传输 通过三次握⼿完成连接,是可靠协议 必须建⽴连接,效率会稍低。
第3节 网络模型
计算机⽹络之间以何种规则进⾏通信,就是⽹络模型所研究的问题。 ⽹络模型⼀般是指 OSI 七层参考模型和 TCP/IP 五层参考模型。
每⼀层实现各⾃的功能和协议,并且都为上⼀层提供业务功能。为了提供这种业务功能,下⼀层将上⼀层中的数据并⼊到本层的数据域中,然后通过加⼊报头或报尾来实现该层业务功能,该过程叫做数据封装。⽤户的数据要经过⼀次次包装,最后转化成可以在⽹络上传输的信号,发送到⽹络上。当到达⽬标计算机后,再执⾏相反的数据拆包过程。
物理层:
主要定义物理设备标准,如⽹线的接⼝类型、光纤的接⼝类型、各种传输介质的传输速率等。主要作⽤是将数据最终编码为⽤ 0、 1 标识的⽐特流,通过物理介质传输。 这⼀层的数据叫做⽐特。
数据链路层
主要将接收到的数据进⾏ MAC 地址(⽹卡地址)的封装与解封装。 常把这⼀层的数据叫做帧。这⼀层常⼯作的设备是交换机。
网络层:
主要将接收到的数据进⾏ IP 地址的封装与解封装。 常把这⼀层的数据叫做数据包。这⼀层设备是路由器。
传输层:
定义了⼀些数据传输的协议和端⼝号。 主要将接收的数据进⾏分段和传输,到达⽬的地址后在进⾏重组。 常把这⼀层的数据叫做段。
会话层:
通过传输层建⽴数据传输的通路。 主要在系统之间发起会话或者接收会话请求。
表示层:
主要进⾏对接收数据的解释、加密与解密、压缩与解压缩。 确保⼀个系统的应⽤层发送的数据能被另⼀个系统的应⽤层识别。
应用层:
主要是为⼀些终端应⽤程序提供服务。直接⾯对着⽤户的 。
第4节 Socket 机制
4.1 Socket 概述
Socket,⼜称为套接字,⽤于描述 IP 地址和端⼝。应⽤程序通常通过 socket向⽹络发出请求或者应答网络请求。 Socket 就是为⽹络编程提供的⼀种机制: 通信两端都有 socket; ⽹络通信其实就是 socket之间的通信; 数据在两个 socket 之间通过 IO 传输。 ⽹络编程也称作为 Socket 编程,套接字编程。Socket 通信是 Client/Server 模型。
4.2基于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();
4.3 基于TCP 协议的Socket 通信
服务端
核心 API: ServerSocket流程:
创建 ServerSocket 服务,然后绑定在服务器的 IP 地址和端⼝
监听连接请求
接受请求,建⽴了 TCP 连接
获取输⼊流读取数据,并显示
释放资源
//建⽴服务端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();
客户端
核⼼API: Socket流程:
创建客户端 socket 对象
向服务端请求建⽴ tcp 连接
从 tcp 连接中获取输出流,写数据 释放资源
//创建客户端的socket 服务,指定⽬的主机和端⼝
Socket s = new Socket("127.0.0.1", 13131);
//通过socket 获取输出流,写数据
OutputStream outputStream = s.getOutputStream(); outputStream.write("hello,this is tcp?".getBytes());
//释放资源
s.close();