计算机网络分为网络协议和网络体系结构
通过网络发送数据是一项复杂的操作,必须仔细地协调网络的物理特性以及所发送数据的逻辑特征。通过网络将数据从一台主机发送到另外的主机,这个过程是通过计算机网络通信来完成。
网络通信的不同方面被分解为多个层,层与层之间用接口连接。通信的双方具有相同的层次,层次实现的功能由协议数据单元(PDU)来描述。不同系统中的同一层构成对等层,对等层之间通过对等层协议进行通信,理解批次定义好的规则和约定。每一层表示为物理硬件(即线缆和电流)与所传输信息之间的不同抽象层次。在理论上,每一层只与紧挨其上和其下的层对话。将网络分层,这样就可以修改甚至替换某一层的软件,只要层与层之间的接口保持不变,就不会影响到其他层。
计算机网络体系结构是计算机网络层次和协议的集合,网络体系结构对计算机网络实现的功能,以及网络协议、层次、接口和服务进行了描述,但并不涉及具体的实现。接口是同一节点内相邻层之间交换信息的连接处,也叫服务访问点(SAP)。
网络编程从大的方面说就是对信息的发送与接收(如,打电话,发信息),中间传输为物理线路的作用。
网络编程最主要的工作就是在发送端把信息通过规定好的协议进行打包发送,在接收端按照规定好的协议把包进行解析,从而得到发送端的信息,以此达到通信的目的。中间最主要的就是数据包的组装,数据包的过滤,数据包的捕获,数据包的分析等。
网络分层
为了减少网络设计的复杂性,绝大多数网络采用分层设计方法。所谓分层设计方法,就是按照信息的流动过程将网络的整体功能分解为一个个的功能层,不同机器上的同等功能层之间采用相同的协议,同一机器上的相邻功能层之间通过接口进行信息传递。
做网络编程,首先了解一个概念:套接字
什么是套接字?
源IP地址和目的IP地址以及源端口号和目的端口号的组合称为套接字。其用于标识客户端请求的服务器和服务.
什么是网络编程:
通过使用套接字来达到进程间通信目的的编程就是网络编程, 进程之间的通信:
1):在同一台电脑上,A进程和B进程相互通信.
2):在网络中(外网/内网),A电脑中的aa程序和B电脑中的bb程序相互通信(有网络连接).
网络基础架构
C/S架构
C指代的是Client(客户端),S指代的是Server(服务端),我们用Socket通信的意义就是可以达到服务端可以和客户端通信,反之亦然。
C/S信息传输流程
1、 客户端产生数据,存放在客户端的内存中,然后调用接口将自己内存中的数据发送或者拷贝给本地操作系统内存。
2、客户端操作系统收到数据后,按照客户端指定的协议,调用网卡发送数据
3、网络开始biubiubiu的传输数据
4、服务端调用系统的接口,将数据从操作系统内存拷贝到自己的内存中来
5、服务端操作系统系统收到指令后,使用与客户端相同的规则从网卡读取数据,然后放到服务端内存中给服务端应用使用。
TCP/IP参考模型
TCP/IP是一组用于实现网络互连的通信协议。Internet网络体系结构以TCP/IP为核心。
基于TCP/IP的参考模型将协议分成四个层次,它们分别是:网络访问层、网际互联层、传输层(主机到主机)、和应用层。
1. 应用层
应用层对应于OSI参考模型的高层,为用户提供所需要的各种服务,例如:FTP、Telnet、DNS、SMTP等.
2. 传输层
传输层对应于OSI参考模型的传输层,为应用层实体提供端到端的通信功能,保证了数据包的顺序传送及数据的完整性。该层定义了两个主要的协议:传输控制协议(TCP)和用户数据报协议(UDP).
TCP协议提供的是一种可靠的、通过“三次握手”来连接的数据传输服务;而UDP协议提供的则是不保证可靠的(并不是不可靠)、无连接的数据传输服务.
3. 网际互联层
网际互联层对应于OSI参考模型的网络层,主要解决主机到主机的通信问题。它所包含的协议设计数据包在整个网络上的逻辑传输。注重重新赋予主机一个IP地址来完成对主机的寻址,它还负责数据包在多种网络中的路由。该层有三个主要协议:网际协议(IP)、互联网组管理协议(IGMP)和互联网控制报文协议(ICMP)。
IP协议是网际互联层最重要的协议,它提供的是一个可靠、无连接的数据报传递服务。
4. 网络接入层(即主机-网络层)
网络接入层与OSI参考模型中的物理层和数据链路层相对应。它负责监视数据在主机和网络之间的交换。事实上,TCP/IP本身并未定义该层的协议,而由参与互连的各网络使用自己的物理层和数据链路层协议,然后与TCP/IP的网络接入层进行连接。地址解析协议(ARP)工作在此层,即OSI参考模型的数据链路层。
Java 网络编程实战
聊天室功能与原理
1、聊天室的功能
每个客户端在连接到服务器端时,要通过控制台输入自己的名称,然后开始发送消息到服务端,服务端在接收到客户端的连接时,首先输出谁进入了聊天室,然后把客户端发来的消息转发给其他客户端,实现群聊的功能,如果客户端按照约定以@name#开头的格式输入消息,服务端需要解析到客户端要私聊的对象,把消息单独发送给要私聊的客户端。
2、聊天室的原理
聊天室需要一个服务器来支持,多个客户端连接到服务器端,服务器的作用就是接收不同客户端的数据,并转发到其他客户端。
客户端可发发送数据给服务器端,同时客户端也需要接收服务器端返回的数据。客户端的发送数据和接收数据是两个独立的通道,互不影响。即客户端的输出与输入要独立,可以使用多线程来实现。
服务端要为每一个客户端建立一个通道,服务端也使用多线程来实现。
服务端需要创建一个通道的列表,统一管理客户端的通道,为了实现自己发的消息,别人可以看到,不需要返回自己的通道。这样就实现了群聊的功能。也就是自己发一个消息,其他人都可以看到。
在客户端程序里为每一个客户端设置一个名称,约定以@name#开头的格式为私聊,就可以实现私聊的功能。
当程序中发生异常时,线程就停止执行。
聊天室的代码实现
公共关闭资源方法
由于代码里会处理很多 IO 异常,当程序中发生异常时,线程就停止执行,并且关闭掉对应的资源,因此我们定义一个公告的关闭资源的类和方法。
public class Util {
public static void closeAll(Closeable... io) {
for (Closeable temp : io) {
try {
if (null != temp) {
temp.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
服务端开发
ChatChannel 类,实现服务器端的多线程,维护一个客户端的通道列表,服务器端既能接收客户端的数据,又能把数据转发给对应的客户端。
以上就是今日内容分享,如果你喜欢记得点赞评论哦,你们的支持是我持续分享的动力。
(以上文字及图片整理于网络,如有侵权联系删除)