什么是计算机网络
把分布在不同的地理区域的计算机与专门的外部设备用通信线路互相连成一个规模大、功能强的网络系统,从而使众多的计算机可以方便地互相传递信息,共享硬件、软件、数据等信息资源。
计算机网络的主要功能
- 资源共享
- 信息传递和集中处理
- 均衡负荷与分布处理
- 综合信息服务(www/综合业务数字网络 ISDN)
什么是网络通信协议
计算机网络中实现通信必须有一些约定即建立通信工具(即接口),使彼此之间能进行信息交换,接口包括两部分
硬件装置:实现结点之间的信息传送
软件装置:规定双方的进行通信的约定协议
事实上网络编程简单的理解就是两台计算机相互通讯数据而已。java.net包提供开发者进行网络编程
网络的七层协议
OSI是一个开放性的通信系统互连参考模型,他是一个定义的非常好的协议规范。OSI模型有7层结构,每层都有几个子层,OSI的7层从上到下分别是
其中高层,即7、6、5、4层定义了应用程序的功能,下面3层,即3、2、1层主要面向通过网络的端到端的数据流。
分层的优点
- 可以很容易的讨论和学习协议的规范细节。
- 层间的标准接口方便了工程模块化。
- 创建一个更好的互连环境。
- 降低了复杂度,使程序更容易被修改,产品开发的速度更快。
- 每层利用紧邻的下层服务,更容易记住各层的功能。
常用的网络协议
TCP/IP协议族中包括上百个互为关联的协议,不同功能的协议分布在不同的协议层, 几个常
用协议如下:
- Telnet(Remote Login):提供远程登录功能,一台计算机用户可以登录到远程的另一台
计算机上,如同在远程主机上直接操作一样。 - FTP(File Transfer Protocol):远程文件传输协议,允许用户将远程主机上的文件拷贝
到自己的计算机上。 - SMTP(Simple Mail transfer Protocol):简单邮政传输协议,用于传输电子邮件。
- NFS(Network File Server):网络文件服务器,可使多台计算机透明地访问彼此的目
录。 - UDP(User Datagram Protocol):用户数据包协议,它和TCP一样位于传输层,和IP协
议配合使用,在传输数据时省去包头,但它不能提供数据包的重传,所以适合传输较短的
文件
基于Socket的Java网络编程
IP协议
IP(Internet Protocol)协议是网际层的主要协议,支持网间互连的数据通报,它提供的主要功能
有:
- 无连接数据报传送
- 数据报路由选择和差错控制
IP的概念
1.IP地址:所有主机都会分配一个IP地址(不重复) ipv4 4位组成 0-255,网关,子掩码。
2.端口:为了确定主机上的应用程序。0-65535 能使用的端口 1024-65535
3.域名:在万维网上注册的网站名称。通过域名解析变成ip地址。
特殊IP
127.0.0.1 : 本机
192.168.1.1: 网关
192.168.1.255: 广播地址
TCP协议
TCP是Tranfer Control Protocol的简称,是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个socket之间必须建立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送 或接收操作。
TCP的特点
- 面向连接的协议,在socket之间进行数据传输之前必然要建立连接,所以在TCP中需要连
接时间。
-TCP传输数据大小限制,一旦连接建立起来,双方的socket就可以按统一的格式传输大的
数据。 - TCP是一个可靠的协议,它确保接收方完全正确地获取发送方所发送的全部数据。
Java Socket数据分发网络模型
基于TCP协议的通信原理
Socket的定义
1.网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。
2.Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。
3.Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的。在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。
Socket通讯的过程
ServerSocket类实现了一个服务器socket,一个服务器socket等待客户端网络请求,然后基于这些请求执行操作,并返回给请求者一个结果。ServerSocket提供了bind、accept和close三个方法。bind方法为ServerSocket绑定一个IP地址和端口,并开始监听该端口。accept方法为ServerSocket接受请求并返回一个Socket对象,accept方法调用后,将一直阻塞直到有请求到达。close方法关闭一个ServerSocket对象。
Socket类实现了一个客户端socket,作为两台机器通信的终端,默认采用的传输层协议为TCP,是一个可靠传输的协议。Socket类除了构造函数返回一个socket外,还提供了connect,getOutputStream, getInputStream和close方法。connect方法用于请求一个socket连接,getOutputStream用于获得写socket的输出流,getInputStream用于获得读socket的输入流,close方法用于关闭一个流。
对于一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:
(1) 创建Socket;
(2) 打开连接到Socket的输入/出流;
(3) 按照一定的协议对Socket进行读/写操作;
(4) 关闭Socket.
创建Socket
ava在包java.net中提供了两个类Socket和ServerSocket,分别用来表示双向连接的客户端和
服务端。这是两个封装得非常好的类,使用很方便。其构造方法如下:
Socket(String host, int prot);
Socket(String host, int prot, boolean stream);
Socket(InetAddress address, int port);
Socket(InetAddress address, int port, boolean stream);
其中address、host和port分别是双向连接中另一方的IP地址、主机名和端口号,stream指明socket是流socket还是数据报socket
TCP具体过程和使用函数
服务器端(server):
- 构建一个ServerSocket实例,指定本地的端口。这个socket就是用来监听指定端口的连接
请求的。 - 重复如下几个步骤:
1. 调用socket的accept()方法来获得下面客户端的连接请求。通过accept()方法返回的
socket实例,建立了一个和客户端的新连接。
2.通过这个返回的socket实例获取InputStream和OutputStream,可以通过这两个
stream来分别读和写数据。
3.结束的时候调用socket实例的close()方法关闭socket连接。
客户端(client):
- 构建Socket实例,通过指定的远程服务器地址和端口来建立连接。
- 通过Socket实例包含的InputStream和OutputStream来进行数据的读写。
-操作结束后调用socket实例的close方法,关闭。
UDP协议
在TCP/IP协议的传输层除了TCP协议之外还有一个UDP协议,相比而言UDP的应用不如TCP广泛,几个标准的应用层协议HTTP,FTP,SMTP…使用的都是TCP协议。但是,UDP协议可以应用在需要很强的实时交互性的场合,如网络游戏,视频会议等。
UDP是User Datagram Protocol的简称,是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。
UDP的特点
- 每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接。
- UDP传输数据时是有大小限制的,每个被传输的数据报必须限定在64KB之内。
- UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。
UDP协议模型图解
Datagram(数据报)
数据报(Datagram)就跟日常生活中的邮件系统一样,是不能保证可靠的寄到的,而面向链
接的TCP就好比电话,双方能肯定对方接受到了信息。
Datagram通讯
java.net中提供了两个类DatagramSocket和DatagramPacket用来支持数据报通信,DatagramSocket用于在程序之间建立传送数据报的通信连接,DatagramPacket则用来表示一个数据报。
DatagramSocket的构造方法:
DatagramSocket();
DatagramSocket(int prot);
DatagramSocket(int port, InetAddress laddr);
其中,port指明socket所使用的端口号,如果未指明端口号,则把socket连接到 本地主机上一个可用的端口。laddr指明一个可用的本地地址。给出端口号时要保证不发生端口冲突,否则会生成SocketException类例外。
注意:上述的两个构造方法都声明抛弃非运行时例外SocketException,程序中必须进行处理,或者捕获、或者声明抛弃。
DatagramSocket类
DatagramSocket类实现了一个发送和接收数据报的socket,传输层协议使用UDP,不能保证数据报的可靠传输。DataGramSocket主要有send, receive和close三个方法。send用于发送一个数据报,Java提供了DatagramPacket对象用来表达一个数据报。receive用于接收一个数据报,调用该方法后,一直阻塞接收到直到数据报或者超时。close是关闭一个socket。
SocketAddress
SocketAddress提供了一个socket地址,不关心传输层协议。这是一个虚类,由子类来具体实现功能、绑定传输协议。它提供了一个不可变的对象,被socket用来绑定、连接或者返回数值。
InetSocketAddress
InetSocketAddress实现了IP地址的SocketAddress,也就是有IP地址和端口号表达Socket地址。如果不制定具体的IP地址和端口号,那么IP地址默认为本机地址,端口号随机选择一个。
DatagramPacket
DatagramSocket是面向数据报socket通信的一个可选通道。数据报通道不是对网络数据报socket通信的完全抽象。socket通信的控制由DatagramSocket对象实现。DatagramPacket需要与DatagramSocket配合使用才能完成基于数据报的socket通信。
UDP具体过程和使用函数
1.构造DatagramSocket实例,指定本地端口。
2.通过DatagramSocket实例的receive方法接收DatagramPacket.DatagramPacket中间就包含了通信的内容。
3.通过DatagramSocket的send和receive方法来收和发DatagramPacket报文。
4.结束后,调用DatagramSocket的close方法关闭。
TCP和UDP的对比
- TCP,可靠,传输大小无限制,但是需要连接建立时间,差错控制开销大。
- UDP,不可靠,差错控制开销较小,传输大小限制在64K以下,不需要建立连接。
TCP与UDP的应用场合
- TCP在网络通信上有极强的生命力,例如远程连接(Telnet)和文件传输(FTP)都需要不
定长度的数据被可靠地传输。但是可靠的传输是要付出代价的,对数据内容正确性的检验
必然占用计算机的处理时间和网络的带宽,因此TCP传输的效率不如UDP高。 - UDP操作简单,而且仅需要较少的监护,因此通常用于局域网高可靠性的分散系统中
client/server应用程序。例如视频会议系统,并不要求音频视频数据绝对的正确,只要保
证连贯性就可以了,这种情况下显然使用UDP会更合理一些