了解这一部分前,先认识了两个概念:
计算机网络 是通过传输介质、通信设施和通信协议,将分散在不同点的计算机设备互联起来实现资源共享和数据传输的系统。
网络编程 就是编写程序使联网的两个或多个设备直接进行传输
一、OSI模型
国际标准组织提出网络开发互联模型OSI(open System Interconnect),将网络划分成7层。
应用层 | ftp\http\smtp “hello,你好” |
---|---|
表示层 | 对应用层的数据进行封装,校验,加密等操作 |
会话层 | 在于对通信开始、结束、异常中断进行处理 |
传输层 | 保持通信双方的端对端的联系(端口) |
网络层 | 在于通信双方主机与主机的联系(IP) |
数据链路层 | 在于保证网络中相邻节点的可靠通信、物理地址(Mac地址) ->arp,rarp |
物理层 | 数据以bit流的形式在通信介质上传输 |
tips: 端口数量:65536(2^32)个端口,端口1~1024为系统端口,1025以后可以自由使用
二、TCP/IP 模型
各层的介绍
-
应用层
- 应用:各种应用程序、APP
- 协议:FTP协议、SMTP协议、HTTP协议
- FTP(File transfer protocol):文件传输协议<端口:21>,减少或者消除不同操作系统下处理文件的不兼容性。
- HTTP(HyperText transfer protocol)超文本传输协议<端口:80>
- SMTP(Simple Mail transfer protocol) 简单邮件协议<端口: 25> 用于发送邮件
-
传输层
- 数据单元:数据段
- 协议:TCP、UDP
- TCP(Transmission Control Protocol)传输控制协议,提供可靠的连接服务,进行数据传输之前需要建立连接(三次握手),建立连接后才能通信,通信结束断开连接(四次挥手)
- UDP(User Datagram Protocol)用户数据报协议,发送数据前不需要建立连接
-
网络层
- 应用:路由器、交换机
- 数据单元:数据包
- 协议
- IP(IPv4/IPV6)(Internet Protocol):网络互连协议
- ARP(Address Resolution Protocol):地址解析协议,实现通过IP地址得到物理地址
- RARP(Reverse Address Resolution Protocol):逆地址解析协议,实现通过物理地址得到IP地址
- ICMP(Internet Control Message Protocol):网络控制报文协议,TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息
-
数据链路层
- 数据单元:帧
-
物理层
- 应用:网线
- 数据单元:比特
三、C/S模型
C/S结构即Client/Server (客户机/服务器) 结构,是软件系统体系结构,通过将任务合理分配到Client端和Server端,降低了系统的通讯开销,需要安装客户端才可进行管理操作。
客户端和服务器端的程序不同,用户的程序主要在客户端,服务器端主要提供数据管理、数据共享、数据及系统维护和并发控制等,客户端程序主要完成用户的具体的业务。
**特点:**开发比较容易,操作简便,但应用程序的升级和客户端程序的维护较为困难。
四、网络基于C/S模型在TCP中的交互
一、步骤
服务端(Server) | 客户端(Client) |
---|---|
bind(端口) | |
connect(连接 IP+端口) | |
listen(监听状态) | |
accept(返回和客户端连接的) | |
read/write(读写) | read/write(读写) |
close(关闭资源) | close(关闭资源) |
二、代码展示
服务端:
public class TCPServer {
public static void main(String[] args) throws IOException {
//创建ServerSocket的实例
ServerSocket serverSocket = new ServerSocket();
//绑定端口
serverSocket.bind(new InetSocketAddress(8888));
//监听
Socket socket = serverSocket.accept();
System.out.println("服务端启动了");
//读写
BufferedReader reader = new BufferedReader(new InputStreamReader( socket.getInputStream()));
String message = null;
while ((message = reader.readLine()) != null){
System.out.println(message);
}
serverSocket.close();
socket.close();
reader.close();
}
}
客户端:
public class TCPClient {
public static void main(String[] args) throws IOException {
//创建socket实例
Socket socket = new Socket();
//连接服务器
try {
socket.connect(new InetSocketAddress("127.0.0.1",8888));
System.out.println("客户端连接上服务器了");
//发送消息
OutputStream outputStream = socket.getOutputStream();
outputStream.write("hello\n".getBytes());
} catch (IOException e) {
e.printStackTrace();
}finally {
//关闭资源
socket.close();
}
}
}
注意!!!客户端连接服务端时,服务端必须先启动