计算机网络是指将分布在不同地理区域的具有独立功能的计算机通过通信设备及传输媒体被互联起来,在通信软件的支持下,实现计算机间资源共享、信息交换或协同工作的系统
数据通信是计算机网络的基本功能之一,用于实现计算机之间的信息传送如在网上收发电子邮件,发布新闻消息,进行电子商务、远程教育、远程医疗,传递文字、图像、声音、视频等信息
通信协议
各个独立的计算机系统之间要保证有条不紊地进行数据通信,合理地共享资源,必须达成某种默契,严格遵守事先约定好的一整套通信规程,包括严格规定要交换的数据格式、控制信息的格式和控制功能以及通信过程中事件执行的顺序等。这些通信规程我们称之为网络协议(Protocol)。
网络协议的组织方式
对于结构复杂的网络协议来说,最好的组织方式是层次结构,计算机网络的协议就是分层的,层与层之间相对独立,各层完成特定的功能,每一层都为上一层提供某种服务,简化了每一层的功能,降低网络通信的复杂度。我们将网络层次结构模型与计算机网络各层协议的集合称为网络的体系结构或参考模型
1977年,国际标准化组织提出了开放系统互连参考模型(OSI,Open System Interconnection)的概念,1984年10月正式发布了整套OSI国际标准
OSI参考模型将网络的功能划分为7个层次:
如图:![](http://bbs.51cto.com/images/default/attachimg.gif)
数据通信是计算机网络的基本功能之一,用于实现计算机之间的信息传送如在网上收发电子邮件,发布新闻消息,进行电子商务、远程教育、远程医疗,传递文字、图像、声音、视频等信息
通信协议
各个独立的计算机系统之间要保证有条不紊地进行数据通信,合理地共享资源,必须达成某种默契,严格遵守事先约定好的一整套通信规程,包括严格规定要交换的数据格式、控制信息的格式和控制功能以及通信过程中事件执行的顺序等。这些通信规程我们称之为网络协议(Protocol)。
网络协议的组织方式
对于结构复杂的网络协议来说,最好的组织方式是层次结构,计算机网络的协议就是分层的,层与层之间相对独立,各层完成特定的功能,每一层都为上一层提供某种服务,简化了每一层的功能,降低网络通信的复杂度。我们将网络层次结构模型与计算机网络各层协议的集合称为网络的体系结构或参考模型
1977年,国际标准化组织提出了开放系统互连参考模型(OSI,Open System Interconnection)的概念,1984年10月正式发布了整套OSI国际标准
OSI参考模型将网络的功能划分为7个层次:
如图:
![](http://bbs.51cto.com/images/default/attachimg.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a44dcdc03ec522fcd1cd08f8aad79caa.jpeg)
![](http://bbs.51cto.com/images/default/attachimg.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6fdfa13788806fe16c8ecd418241ffb9.jpeg)
TCP/IP协议是1974年由Vinton Cerf和Robert Kahn开发的,随着Internet的飞速发展,TCP/IP协议现已成为事实上的国际标准。TCP/IP协议实际上是一组协议,是一个完整的体系结构。如图所示:
TCP/IP与OSI参考模型的对比,如图:
![](http://bbs.51cto.com/images/default/attachimg.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a3d803bcb2a384d089bd55536444b9b5.jpeg)
常用的网络协议
互联网层协议
IP(internet protocol)协议:提供关于数据应如何传输以及传输到何处的信息
ARP(Address Resolution Protocol)协议:处理信息的路由以及主机地址解析
传输层协议
TCP(Transmission Control Protocol )协议:传输控制协议,该协议主要用于在主机间建立一个虚拟连接,以实现高可靠性的数据包交换 .如文件下载
UDP(User Datapram Protocol)协议:用户数据报协议,一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务 。如QQ聊天
应用层协议
HTTP(Hyper Text Transport Protocol,):超文本传输协议
FTP(File Transfer Protocol ):文件传输协议
TELNET:远程登录协议,用于远程联接服务的标准协议或者实现此协议的软件,利用远程计算机完成当前计算机不能完成的功能
端口号
逻辑意义上的数据传输通道,用整数形式表示,TCP/IP规定每台计算机拥有65535个逻辑通道
每个端口号为计算机某个特定应用程序服务,www服务端口为80,FTP服务端口为21,SQL数据库服务端口为1433等
1024以内的端口号已绑定了相应的服务程序,用户编程中若用到端口号应选择1024以上的端口
Java.net包
Java中和网络通信有关的类都集中在java.net包中
基于TCP传输协议的类为URL、URLConnection、Socket和ServerSocket
基于UDP传输协议的类为DatagramPacket、DatagramSocket和MulticastSocket
java.net 包可以大致分为两个部分
低级 API,用于处理以下抽象
地址,也就是网络标识符,如 IP 地址
套接字,也就是基本双向数据通信机制
接口,用来描述网络接口
高级 API,用于处理以下抽象
URI,表示统一资源标识符
URL,表示统一资源定位符
连接,表示到 URL 所指向资源的连接
URL类
URL是WWW统一资源定位器(Uniform Resource Locator)的简写,它规范了WWW资源网络定位地址的表示方法。
WWW资源包括Web页、文本文件、图形文件、声频片段等
URL基本格式
protocol://hostname:port/resourcename#anchor
protocol:使用的协议,可以是http,ftp,news,telnet等
hostname:主机名
port:端口号,可选
resourcename:资源名,主机上能访问到的目录或文件
anchor:标记,可选,指定文件中的有特定标记的位置
InterAddress
在 java.net包中提供了网络编程所用到的类,其中InetAddress 类提供将主机名解析为其 IP 地址(或反之)的方法
InetAddress常用方法
在给定主机名的情况下确定主机的 IP 地址
public static InetAddress getByName(String host)
返回本地主机
public static InetAddress getLocalHost()
获取当前 IP 地址的主机名
public String getHostName()
获取当前IP地址的IP地址字符串
public String getHostAddress()
01 | public class TestInetAddress { |
02 | public static void main(String[] args) { |
03 | try { |
04 | //当前主机 |
05 | InetAddress ia1 = InetAddress.getLocalHost(); |
06 | System.out.println(ia1); |
07 | System.out.println(ia1.getHostName()); |
08 | System.out.println(ia1.getHostAddress()); |
09 | //百度主机 |
10 | InetAddress ia2 = InetAddress.getByName( "www.baidu.com" ); |
11 | System.out.println(ia2); |
12 | System.out.println(ia2.getHostName()); |
13 | System.out.println(ia2.getHostAddress()); |
14 | } catch (Exception ex){ |
15 | ex.printStackTrace(); |
16 | } |
17 | } |
18 | } |
网络通信
网络通信即是联网的计算机之间进行数据通信,编写网络应用程序,就是在不同的计算机之间建立关联,能够将数据发送到其他计算机或者从其他计算机获取数据
网络通信的两种协议类型
UDP:用户数据报协议,面向非连接的协议
TCP:传输控制协议,面向连接的协议
简单的编程UDP_发送端
01 | public class UdpSender { |
02 | public static void main(String[] args) { |
03 | try { |
04 | DatagramSocket ds = new DatagramSocket(); //ds相当于邮局 |
05 | String sendStr = "hello world!" ; |
06 | //对数据打包,数据,数据长度,发送到的IP地址和端口号,端口号设定一个没被其他应用程序占用的端口 |
07 | DatagramPacket dp = new DatagramPacket(sendStr.getBytes(),sendStr.length(),InetAddress.getByName( "127.0.0.1" ), 3000 ); |
08 | //发送 |
09 | ds.send(dp); |
10 | //关闭 |
11 | ds.close(); |
12 | } catch (Exception ex){ |
13 | System.out.println( "发送失败" ); |
14 | } |
15 | } |
16 | } |
接收端
01 | public class UdpReceiver { |
02 | public static void main(String[] args) { |
03 | try { |
04 | DatagramSocket ds = new DatagramSocket( 3000 ); |
05 | byte [] buf = new byte [ 1024 ]; |
06 | DatagramPacket dp = new DatagramPacket(buf, 1024 ); |
07 | ds.receive(dp); //接收 |
08 | String receiveStr = new String(dp.getData(), 0 ,dp.getLength())+ |
09 | "from" +dp.getAddress().getHostAddress()+ ":" +dp.getPort(); |
10 | System.out.println(receiveStr); |
11 | ds.close(); //关闭 |
12 | } catch (Exception ex){ |
13 | ex.printStackTrace(); |
14 | } |
15 | } |
16 | } |
简单的UDP总结如图:
![](https://i-blog.csdnimg.cn/blog_migrate/a35b4268f355bc0785b3b6ac00977fcd.png)