网络编程的常识
七层网络模型
- OSI(Open System Interconnect),即开放式系统互联, 是ISO组织在1985年研究的网络互连模型
- OSI七层模型和TCP/IP五层模型的划分如下:
- 当发送数据时,需要对发送的内容按照上述七层模型进行层层加包后发送出去
- 当接收数据时,需要对接收的内容按照上述七层模型相反的次序层层拆包并显示出来
相关的协议
协议的概念
计算机在网络中实现通信就必须有一些约定或规则,这种约定和规则就叫做通信协议.
通信协议可以对速率, 传输代码, 代码结构, 传输控制步骤, 出错控制等制定统一的标准
TCP协议
传输控制协议(Transmission Control Protocol), 是一种面向连接的协议,类似于打电话
- 建立连接 => 进行通信 => 断开连接
- 在传输前采用"三次握手"方式
- 在通信的整修过程中全程保持连接,形成数据传输通道
- 保证了数据传输的可靠性和有序性
- 是一种全双工的字节流通信方式,可以进行大数据量的传输
- 传输完毕后需要释放已建立的连接, 发送数据的效率比较低
UDP协议
用户数据报协议(User Datagram Protocool),是一种非面向连接的协议,类似于定信
- 在通信的整修过程中不需要保持连接, 其实是不需要建立连接
- 不保证数据传输的可靠性和有序性
- 是一种全双工的数据报通信方式, 每个数据报的大小限制在64k以内
- 发送数据完毕后无需释放资源,开销小,发送数据的效率比较高,速度快
IP地址
- 192.168.1.1 绝大多数路由器的登录地址,主要配置用户名和密码以及Mac过滤
- IP地址是互联网中的唯一地址标识,本质上是由32位二进制组成的整数,叫做IPv4,当然也有128位二进制组成的整数,叫做IPv6,目前主流的还是IPv4
- 日常生活中采用点分十进制表示法来进行IP地址的描述,将每个字节的二进制转化为一个十进制整数,不同的整数之间采用小数点隔开
- 特殊的地址: 本机回环地址:127.0.0.1;主机名:localhost
端口号
- IP地址 - 可以定位到具体某一台设备。
- 端口号 - 可以定位到该设备中具体某一个进程。
- 端口号本质上是16位二进制组成的整数,表示范围是:0 ~ 65535,其中0 ~ 1024之间的端口号通
常被系统占用,建议编程从1025开始使用。
- 特殊的端口:
HTTP:80 FTP:21 Oracle:1521 MySQL:3306 Tomcat:8080 - 网络编程需要提供:IP地址 + 端口号,组合在一起叫做网络套接字:Socket。
基于tcp协议的编程模型
C/S架构的简介
- 在C/S模式下客户向服务器发出服务请求,服务器接收请求后提供服务。
- 例如:在一个酒店中,顾客找服务员点菜,服务员把点菜单通知厨师,厨师按点菜单做好菜后让服
务员端给客户,这就是一种C/S工作方式。如果把酒店看作一个系统,服务员就是客户端,厨师就
是服务器。这种系统分工和协同工作的方式就是C/S的工作方式。
- 客户端部分:为每个用户所专有的,负责执行前台功能。
- 服务器部分:由多个用户共享的信息与功能,招待后台服务。
编程模型
服务器
- 创建
SeverSocket
类型的对象并提供端口号 - 等待客户端的连接请求,调用
accept()
方法 - 使用输入输出流进行通信
- 关闭
Socket
- 创建
客户端
- 创建
Socket
类型的对象并提供服务器的IP地址和端口号 - 使用输入输出流进行通信
- 关闭
Socket
- 创建
相关类和方法的解析
ServerSocket类
java.net.ServerSocket
类主要用于描述服务器套接字信息常用的方法如下
功能介绍 方法声明 根据参数指定端口号来构造对象 ServerSocket(int port)
侦听关接收到此套接字的连接请求 Socket accept()
用于关闭套接字 void close()
Socket类
java.net.Socket
类主要用于描述客户端套接字,是两台机器间通信的端点常用的方法如下
功能介绍 方法声明 根据指定主机名和端口来构造对象 Socket(String ip, int port)
用于获取当前套接字的输入流 InputStream getInputStream()
用于获取当前套接字的输出流 OutputStream getOutputStream()
用于关闭套接字 void close()
注意事项
- 客户端
Socket
与服务器端Socket
对应,都包含输入和输出流 - 客户端的
socket.getInputStream()
连接于服务器的socket.getOutputStream()
- 客户端的
socket.getOutputStream()
连接于服务器的socket.getInputStream()
基于udp协议的编程模型
编程模型
- 接收方:
(1)创建DatagramSocket类型的对象并提供端口号;
(2)创建DatagramPacket类型的对象并提供缓冲区;
(3)通过Socket接收数据内容存放到Packet中,调用receive方法;
(4)关闭Socket; - 发送方:
(1)创建DatagramSocket类型的对象;
(2)创建DatagramPacket类型的对象并提供接收方的通信地址;
(3)通过Socket将Packet中的数据内容发送出去,调用send方法;
(4)关闭Socket;
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。