第十一章 网络编程

1.什么是计算机网络?网络的主要类型有哪些;


计算机网络是将不同地理位置的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。

网络的主要类型:
1.按计算机网络的地理覆盖范围分:
1)局域网(Local Area Network,LAN):
(a)地理范围一般在10km以内,属于一个组织,一个单位或一个部门所有。如:一个企业,一所学校,一座大楼,一间实验室等。
(b)这种网络一般不对外提供公共服务,管理方便,安全保密性好。
(c)组建方便,投资少,见效快,使用灵活,是计算机网络中发展最快,应用最普遍的计算机网络。
(d)与广域网相比,传输速率快,通常100Mbps以上;误码率低。
2)城域网(Metropolitan Area Network,MAN):
介于局域网和广域网之间,地理范围覆盖几十km到几百km不等,可能是一个地区或一个城市。
3)广域网(Wide Area Network,WAN):
(a)地理范围一般从几十km到几万km不等,小到一个地区,一个城市,大到一个国家,几个国家乃至全世界。
(b)提供大范围的公共服务。因特网就是典型的广域网。
(c)与局域网相比,广域网投资大,安全保密性差,传输速率慢,通常为64kbps,2Mbps,10Mbps;误码率高。
2.按计算机网络的拓扑结构分:拓扑结构是数学上的一个名词,从英文Topology音译过来的。在这里,指的是网络传输介质和节点的连接形式,即线路构成的几何形状。
1)总线型:
(a)该结构采用一条公共总线作为传输介质,每台计算机通过相应的硬件接口入网。信号沿总线进行广播式传送。
(b)是典型的共享传输介质的网络。从信源所发的信息会传送到介质长度所及之处,被其他所有站点看到。如果有两个以上的节点同时发送数据,可能会造成冲突,就像公路上的两车相撞一样。
(c)优点:布线容易;增删容易;节约电缆;
缺点:
I.任何两个站点传送信息都要经过总线,总线称为传输瓶颈;当计算机站点多时,容易造成信息阻塞,传递不畅。
II.一台计算机接入总线的接口发生故障,会造成整个网络瘫痪。
III.当网络发生故障时,故障诊断和隔离困难。

2)星型:由一台中央节点和周围的从节点组成。中央节点和从节点可以直接通信,而从节点必须经过中央节点转接才能通信。
优点:
I 可靠性高。每台计算机及其接口的故障不会影响其他计算机,不会影响整个网络,也不会造成网络瘫痪。
II 故障诊断和隔离容易,网络容易管理和维护。
III 可扩性好,配置灵活。增删改一个站点容易实现,和其他计算机没有关系。
IV 传输速率高。每个节点独占一条线路,消除了信息阻塞的情况。而总线和环形网络的瓶颈都在线路上。

缺点:
I 线缆使用量大。
II 布线、安装工作量大。
III 网络可靠性依赖于中央节点。如交换机或集线器选择不当,发生故障会造成全网瘫痪。
3)环型:
(a)计算机通过硬件接口入网,这些接口收尾相连成一条链路。信息传送也是广播式的,沿着一个方向(如逆时针方向)单向逐点传送。
(b)优点:
I 点到点且沿一个方向单向传输,非常适合用光纤作为传输介质。
II 传输距离远,适合做主干网。
III 故障诊断容易定位。
IV 初始安装容易,线缆用量少。环形线路也是一条总线,只是首尾封闭。

 


3.按传输介质分:
1)有线网络:
(a)同轴电缆:成本低,安装方便,但传输率低,抗干扰能力一般,传输距离短;
(b)双绞线:组建局域网时常用,优缺点类似于同轴电缆。
(c)光纤:主要用于网络的主干部分,其特点是成本高,安装技术要求高,传输距离长,传输率高,抗干扰能力强,且不会受到电子监听设备的监听等,是组建高安全性网络的理想选择。

2)无线网络:
(a)红外线;
(b)微波;
(c)无线电;

2.常见的网络分层模型有哪两个?哪个更流行?为什么?


(1)OSI/ISO 参考模型:
OSI:(Open System Interconnection),开放式网络互连;
ISO:(International Standard Organization),国际标准化组织;
此模型是由国际标准化组织提出的一种网络互连模型。
OSI参考模型把网络模型分成7层,每一层为上一层提供服务,并为其上一层提供一个访问接口或界面。
(2)TCP/IP协议栈:4层网络模型。OSI参考模型设计得过于庞大、复杂,不易被付诸应用。相比之下,由技术人员自己开发的TCP/IP协议栈获得了更为广泛的应用。

 

3.TCP的全称是?


Transfer Control Protocol。


4.UDP的全称是?


User Datagram Protocol。


5.请说出TCP和UDP的区别?


TCP:一种面向连接(连接导向)的、可靠的、基于字节流的传输层(Transport layer)通信协议 。

特点:
面向连接;
点到点的通信;
高可靠性;
占用系统资源多、效率低;

UDP:一种无连接的、提供面向事务的简单不可靠信息传送服务的传输层通信协议。

特点:
非面向连接
传输不可靠,可能丢失
发送不管对方是否准备好,接收方收到也不确认
可以广播发送
非常简单的协议,开销小

6.通过类比打电话,详细描述TCP三次握手机制。


第一次握手:客户端发送连接请求给服务器端,等候服务器端确认;
第二次握手:服务器端收到客户端发来的请求,向客户端发送确认连接信息;
第三次握手:客户端接到服务器端发送来的确认连接信息,也要向服务器端再发送一次确认连接信息。至此三次握手完成。客户端和服务器端进入准备传送数据状态。

以打电话为例:
A拨电话给B:
B 接起电话:喂?能听到我吗?
A 回答:可以听到。
然后A和B开始正式通话。

7.IP的全称是? IP的作用是?


IP:Internet Protocol address,互联网协议地址。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址。
IP的作用:用来标志网络中的一个通信实体的地址。通信实体可以是计算机,路由器等。

8.IPV4为什么会发生资源枯竭的问题?


IPV4规定IP地址长度为32位, 即有2^32-1个地址(大约40亿多一点);而随着互联网的迅速发展,这个数量很可能满足不了未来的需求。
解决:IPv6。IP地址的长度为128,即有2^128-1个地址。


9.为什么需要端口?端口是真实存在的还是虚拟的概念?


(1)IP地址用来标志一台计算机,但是一台计算机上可能提供多种网络应用程序,使用端口来区分这些应用程序。
(2)端口是虚拟的概念,并不是说在主机上真的有若干个端口。通过端口,可以在一个主机上运行多个网络应用程序。
(3)端口范围0---65535,16位整数。

10.Java中,端口使用两个字节表示,可以表示多少个端口? UDP和TCP端口是各自独立的吗?


端口范围0---65535,16位整数。
由于TCP/IP传输层的两个协议TCP和UDP是完全独立的两个软件模块,因此各自的端口号也相互独立,如TCP有一个255号端口,UDP也可以有一个255号端口,二者并不冲突。 

11.InetAddress和InetSocketAddress都封装了哪些信息? 他们两的区别是?


InetAddress:封装计算机的IP地址 ,没有端口。
InetSocketAddress:包含IP地址和端口信息,用于Socket通信的。

12.URL类有什么作用?


(1)URL:Uniform Resource Locator,统一资源定位器;俗称“网址”,如:
"http://www.baidu.com:80/index.html#aa?cansu=bjsxt“
(2)由4部分组成:
(1)协议: http;
(2)存放资源的主机域名:www.baidu.com;
(3)端口号:80;
(4)资源文件名: index.html#aa?cansu=bjsxt;

(3)URL是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。

13.【上机】将网络上一张图片或一个mp3或一个视频的信息保存到本地。


14.查资料了解,SNS是什么?


15.如何理解Socket的含义?


所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。

我们开发的网络应用程序位于应用层,TCP和UDP属于传输层协议,在应用层如何使用传输层的服务呢?在应用层和传输层之间,则是使用套接字来进行分离。

套接字就像是传输层为应用层开的一个小口,应用程序通过这个小口向远程发送数据,或者接收远程发来的数据;而这个小口以内,也就是数据进入这个口之后,或者数据从这个口出来之前,是不知道也不需要知道的,也不会关心它如何传输,这属于网络其它层次的工作。

Socket实际是传输层供给应用层的编程接口。传输层则在网络层的基础上提供进程到进程问的逻辑通道,而应用层的进程则利用传输层向另一台主机的某一进程通信。Socket就是应用层与传输层之间的桥梁。

使用Socket编程可以开发客户机和服务器应用程序,可以在本地网络上进行通信,也可通过Internet在全球范围内通信。

生活案例1如果你想写封邮件发给远方的朋友,如何写信、将信打包,属于应用层。信怎么写,怎么打包完全由我们做主;而当我们将信投入邮筒时,邮筒的那个口就是套接字,在进入套接字之后,就是传输层、网络层等(邮局、公路交管或者航线等)其它层次的工作了。我们从来不会去关心信是如何从西安发往北京的,我们只知道写好了投入邮筒就OK了。
生活案例2:可以把Socket比作是一个港口码头,应用程序只要将数据交给Socket,就算完成了数据的发送,具体细节由Socket来完成,细节不必了解。同理,对于接收方,应用程序也要创建一个码头,等待数据的到达,并获取数据。

16.基于TCP的Socket网络编程的主要步骤是什么?


Java分别为TCP和UDP 两种通信协议提供了相应的Socket编程类,这些类存放在java.net包中。与TCP对应的是服务器的ServerSocket和客户端的Socket,与UDP对应的是DatagramSocket。
基于TCP创建的套接字可以叫做流套接字,服务器端相当于一个监听器,用来监听端口。 服务器与客服端之间的通讯都是输入输出流来实现的。基于UDP的套接字就是数据报套接字,•  两个都要先构造好相应的数据包。

基于TCP协议的Socket编程的主要步骤
服务器端(server):
1. 构建一个ServerSocket实例,指定本地的端口。这个socket就是用来监听指定端口的连接请求的。
2.重复如下几个步骤:
a. 调用socket的accept()方法来获得下面客户端的连接请求。通过accept()方法返回的socket实例,建立了一个和客户端的新连接。
b.通过这个返回的socket实例获取InputStream和OutputStream,可以通过这两个stream来分别读和写数据。
c.结束的时候调用socket实例的close()方法关闭socket连接。
 
客户端(client):
1.构建Socket实例,通过指定的远程服务器地址和端口来建立连接。
2.通过Socket实例包含的InputStream和OutputStream来进行数据的读写。
3.操作结束后调用socket实例的close方法,关闭。

 

17.【上机】写出建立TCP服务器ServerSocket的代码。并说明accept方法有什么特点?


//服务器监听请求;
ServerSocket ss=new ServerSocket(9999);
//接受请求:创建了socket;
Socket socket=ss.accept();

详见课上示例。


18.【上机】写出建立TCP客户端Socket的代码。并说明建立Socket后,通过什么方法Socket获得流对象?


//客户端向服务器端发送请求;
Socket socket=new Socket("127.0.0.1",9999);
//建好连接后,开始传输数据;
OutputStream os=socket.getOutputStream();

详见课上示例。


19.【上机】完成老师课堂上的代码(最简单的服务器客户端代码。可双向交流的服务

器客户端代码。本作业可课后完成)


详见课上示例。


20.基于UDP的Socket网络编程的主要步骤是什么?


基于UDP协议的Socket编程的主要步骤
服务器端(server):
1. 构造DatagramSocket实例,指定本地端口。
2. 通过DatagramSocket实例的receive方法接收DatagramPacket.DatagramPacket中间就包含了通信的内容。
3. 通过DatagramSocket的send和receive方法来收和发DatagramPacket.
客户端(client):
1. 构造DatagramSocket实例。
2.通过DatagramSocket实例的send和receive方法发送DatagramPacket报文。
3.结束后,调用DatagramSocket的close方法关闭。

21.【上机】使用UDP的方式,完成对象的传递。


(1)客户端向服务器端传送对象信息;
DatagramSocket ds=new DatagramSocket(9999);
//构建数据包;
Scanner input=new Scanner(System.in);
System.out.println("请输入用户名:");
String username=input.nextLine();
System.out.println("请输入密码:");
String password=input.nextLine();
//事先要创建好User类;
User user=new User(username,password);
//字节流;在内存开辟缓冲区;
ByteArrayOutputStream baos=new ByteArrayOutputStream();
ObjectOutputStream oos=new ObjectOutputStream(baos);
oos.writeObject(user);

byte buf[]=baos.toByteArray();
DatagramPacket dp=new DatagramPacket(buf, buf.length, InetAddress.getByName("127.0.0.1"), 8888);//DatagramPacket只用byte[]数组;
//发送数据;
ds.send(dp);

(2)服务器端从客户端接收对象信息;
//服务器定义DatagramSocket以接收数据;
DatagramSocket ds=new DatagramSocket(8888);

//定义一个数据包来接收数据;
//数据包里是byte数组,所以还得定义一个byte数组;
byte buf[]=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf, buf.length);
//接收客户端发过来的数据;
ds.receive(dp);

//用字节流和对象流读取对象信息;
ByteArrayInputStream bais=new ByteArrayInputStream(buf);
ObjectInputStream ois=new ObjectInputStream(bais);

User user=(User)ois.readObject();
System.out.println(user);

详见课上示例。

原文地址:https://www.cnblogs.com/ren549047861/p/11294207.html