黑马程序员_Java基础_前期准备01_3.6

---------------------------------------- JavaEE+云物联、期待与您交流!---------------------------------------------

 

前期准备01-3.6

 

十五、网络编程

①概述

❶网络模型

OSI参考模型

TCP/IP参考模型

应用层(应用程序)

应用层(http、ftp)

表示层

会话层

传输层(TCP、UDP)

传输层(TCP、UDP)

网络层(IP)

网际层(IP)

数据链路层(底层传输协议)

主机至网络层

物理层(各种设备)

OSI:Open System Interconnect

/*['əupn]开放式['sistəm]系统[intəkə'nekt]互联*/

TCP:Transmission Control Protocol

/*[trænz'miʃn]传输[kən'trəul]控制['prəutəkɔl]协议*/

UDP:User Datagram Protocol

/*['ju:zə]用户['deitəgræm]数据包['prəutəkɔl]协议*/

IP:Internet Protocol

/*['intənet]因特网['prəutəkɔl]协议*/

参考模型:Reference Model

/*['refrəns]参考['mɔdl]模型*/

数据的传输,就是数据封包和数据拆包的过程。数据在被封包时,每一层都会添加本层的特有信息;在被拆包时,每一层都会拆掉本层的特有信息。

网络编程主要涉及网际层和传输层,Web开发主要涉及应用层。

❷网络通讯

网络通讯三要素:IP地址、端口号、传输协议。

IP地址用于网络定位,端口号用于软件定位,传输协议用于定义通讯规则。

IP地址:InetAddress

端口号:0~65535

传输协议:Socket实现/*['sɔkit]插座*/

❸UDP实现方式

发送端:

1,建立UDPSocket服务。(DatagramSocket)

2,提供数据,并将其封装成数据包。(DatagramPacket)

3,通过Socket服务的发送功能,发送数据包。(send)

4,关闭Socket资源。(close)

接收端:

1,建立UDPSocket服务。(DatagramSocket)

2,提供接收数据的数据包。(DatagramPacket)

3,通过Socket服务的接收功能,接收数据。(receive)

4,通过数据包的功能,将数据取出。(new String(byte[]))

5,关闭Socket资源(服务器一般不关)。

6,服务端要先开启,才可以接收到数据。

❹聊天程序

发送数据和接收数据同时进行,这时就需要用到多线程技术。创建两个线程,一个线程用于发送数据(使用键盘录入),一个线程用于接收数据。

❺TCP实现方式

客户端(Socket):

1,创建客户端的Socket服务,并指定目的主机和端口。(Socket)

2,获取此服务的输出流(用于发送数据)和输入流(用于接收数据)。

3,关闭客户端。

服务端(ServerSocket):

1,建立服务端的Socket服务,并监听一个端口。(ServerSocket)

2,获取连接过来的客户端对象。(accept)

3,获取该对象的输入流(用于接收数据)和输出流(用于反馈数据)。

4,关闭客户端。

5,关闭服务端。(可选操作)

6,由于TCP是面向连接的,服务端必须先开启。

注意,在文本传输过程中,如果是读一行的数据,要有刷新和换行的操作。可以使用PrintWriter(new Stream,ture)。

❻TCP中的上传结束标记

1,时间戳,将一个时间点作为标记,可以用来表示数据传输的终止。

2,用shutdownOutput方法,终止上传。

❼TCP中服务器的并发访问

当有多个客户端向服务器申请并发访问时,服务器应该为每一个客户端分配一个新的线程,以完成并发服务的目的。

1,创建一个实现Runnable接口的类,其中的run方法用于封装服务器提供的服务。

2,对监听端口实现循环监听,为每一个提出申请的客户端,创建一个新的线程,并将该客户端作为参数传递给相应的线程。

❽一些知识点

1,telnet是DOS的一个远程登录的命令,相当于一个客户端。

格式:telnet IP port

2,HTTP目前只有两个版本:HTTP/1.0、HTTP/1.1

3,HTTP的请求消息头:

GET /文件路径 HTTP/1.1

Accept:image/jpeg,*/*(文件格式)/*[ə'ksept]接受*/

Accept-Language:zh-cn(简体中文版)

Accept-Encoding:gzip,deflate(压缩格式,节省网络流量)/*[in'kəudiŋ]编码*/

User-Agent:(系统信息)/*['ju:zə]用户['eidʒnt]代理者*/

Host:IP:port(被请求的主机和端口)

Connection:Keep-Alive/*[kə'nekʃn]连接[ki:p]保持[ə'laiv]存活的*/

HTTP的消息头一定要和请求的内容分开,中间至少间隔一个空行。

4,HTTP的应答消息头:

HTTP/1.1 200 OK(版本号、响应状态码、传输状态)

Server:Apache-Coyote/1.1(服务器类型)/*[ə'pæʃ]阿帕奇[kai'əuti]狼*/

Etag:(一个标记,在断点续传时很有用)/*Entity Tag['entiti]实体[tæg]标签*/

Last-Modified:/*[la:st]最后['mɔdifaid]修改*/

Content-Type:/*[kən'tent]内容[taip]类型*/

Content-Length:/*[kən'tent]内容[leŋθ]长度*/

Date:(当前时间)

Connection:(连接状态,Keep-Alive、close)/*[kə'nekʃn]连接*/

❾浏览器

图形化界面编程与网络编程的结合。

❿DNS

Domain Name Server/*[dəu'mein]域[neim]名字['sə:və]服务器*/

在上网时,网址的名称需要被解析成IP地址之后,才可以访问其对应的主机。在解析网址时,会先在本地的配置文件中寻找。如果没有,就再到网络上的DNS服务器中寻找。

②IP地址

❶定义

IP地址:Internet Protocol Address/*['intənet]因特网['prəutəkɔl]协议[ə'dres]地址*/(互联网协议地址)。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来区分和屏蔽其物理地址的差异。

IP地址,就是网络中各个设备的标识。

❷IPV4

IPV4是一个32位的二进制数,通常被分割为4个“8位的二进制数”(即一个字节),用“点分十进制”表示成(a.b.c.d)的形式,其中的a、b、c、d都是0~255之间的十进制整数。此类地址已经于2011年2月3日分配完毕。

IPV4的编址方案将IP地址空间划分为A、B、C、D、E五类,其中A、B、C是基本类,分别表示大型网络、中型网络、小型网络;D、E类作为多播和保留使用。

公有地址(Public Address)需要注册才可以使用,可以直接访问互联网;私有地址(Private Address)不需要注册就可以使用,专门用于组织机构内部使用。

网络类别

最大网络数

IP地址范围

最大主机数

私有地址范围

A

126

1.0.0.0-

127.255.255.255

16777214

10.0.0.0-

10.255.255.255

B

16384

128.0.0.0-

191.255.255.255

65534

172.16.0.0-

172.31.255.255

C

2097152

192.0.0.0-

223.255.255.255

254

192.168.0.0-

192.168.255.255

特殊网址:

1,每一个字节都为0的IP地址,对应于当前主机或当前网络。

2,每一个字节都为1的IP地址,是当前子网的广播地址。

3,D类IP地址值范围是:224.0.0.0-239.255.255.255。

4,E类IP地址值范围是:240.0.0.0-255.255.255.255,主要用于Internet实验和开发。

5,IP地址中不能以十进制“127”作为开头,该类地址用于回路测试,包括127.0.0.1-127.255.255.255。如127.0.0.1表示本机的IP地址。

❸子网掩码

子网掩码的存在,是为了解决IPV4地址不足的问题。

子网掩码必须与IP地址一起使用,其作用是将该IP地址划分成网络地址和主机地址两部分。

子网掩码的长度与IP地址相同,左边表示网络位,用二进制的“1”表示,1的位数等于网络位的长度;右边表示主机位,用二进制的“0”表示,0的位数等于主机位的长度。只有通过子网掩码,才能表明一台主机所在的子网与其它子网的关系,从而让网络可以正常工作。

❹IPV6

IPV6是一个128位的二进制整数。IPV4的地址理论容量近43亿个,IPV6的地址相当于IPV4地址空间的4次幂,可以让互联网变得更大,实现更多智能设备以唯一的真实的身份联网互通。

IPV6地址通常写作8组,每组为4个十六进制整数的形式。

❺主机名

为了方便记忆,每一个主机都会有一个名字,与其所有的IP地址相对应。当然,一个IP地址也可以对应多个主机名,一个主机名也可以对应多个IP地址。

默认的本地主机名:localhost;对应本地回环地址:127.0.0.1

❻万维网

www:World Wide Web,环球信息网的缩写。

万维网并不等同于因特网,其只是因特网所能够提供的服务之一,或者说它只是依靠因特网运行的一项服务。

万维网的核心由三个部分组成:

URI:(Uniform Resource Locator)统一资源定位符,是一个统一的为资源定位的系统。

/*['ju:nifɔ:m]统一[ri'sɔ:s]资源[ləu'keitə]定位器*/

HTTP:(Hyper Text TransportProtocol)超文本传输协议,用于规定客户端和服务器的交流方式。

/*['haipə]大量传播[tekst]文本[træn'spɔ:t]传输['prəutəkɔl]协议*/

HTML:(Hyper Text Markup Language)超文本标记语言,用于定义超文本文档的结构和格式。

/*['haipə]大量传播[tekst]文本['ma:kʌp]标记['læŋgwidʒ]语言*/

❼万维网域名的部分后缀

.com:商业机构

.edu:教育机构

.gov:政府部门

.int:国际组织

.net:网络组织,如因特网服务商

.org:非盈利性组织

.cn:中国

.hk:香港地区

.mo:澳门地区

.tw:台湾

.us:美国

.eu:欧盟

❽互联网、因特网、万维网

互联网,表示由计算机相互连接而形成的大型网络。全世界有许多大型的网络。

因特网,互联网中的最大的一员,是一个可以连接网络的网络。

万维网,依附于因特网而存在,提供一种网络服务。

❾地址解析

网络上的域名,都需要遵守相应的规则,并被注册之后,才能够拥有与之相应的IP地址。IP地址是因特网制定的全球统一的主机标识,当域名与IP相对应之后,就可以在任意地方的因特网上被访问。

在上网时,所有的域名都需要被解析之后,以IP的形式访问其所对应的主机。

解析时会先在本地的系统文件中寻找,如果没有则通过网络上的DNS服务器,解析此域名并返回其所对应的IP地址,然后再使用该IP地址访问其所对应的主机。

本地的域名解析文件为:C:\Windows\System32\drivers\etc\hosts

使用本地解析的好处是,可以稍微加快上网的时间,可以屏蔽一些网站。

③端口号

❶端口可分为物理端口和逻辑端口,物理端口是实物端口,用于网络设备间的实际串联;逻辑端口是虚拟的数字端口,用于软件间的串联(即通讯)。

❷端口号即逻辑端口的数字标号,UDP、TCP协议中端口号的范围是:0-65535。

❸在TCP/IP(或UDP/IP)协议中,如果把IP地址比作一栋大厦,端口号就是其中每一个房间的门牌号。每一台主机都拥有一个IP地址,主机中安装的每一个软件,都拥有一个或多个端口号。

❹端口号的分类

常用端口号为0-1023,一般用于系统程序;临时端口号为1024-5000,一般用于本机的其它应用程序;预留端口号为5001-65535,并不常用。

❺端口号的分配

常用端口号,一般被一些系统程序固定使用,不能够修改。

临时端口号,一般都是被临时分配的,只有当某一个程序被启动时,才会被分配一个端口号与其相对应。当然也可以自行设置,只要保证该程序的端口号是唯一的,就不会影响其通讯的功能。

预留端口号,一般不常被使用,当然也可以自行设置给某个应用程序。

❻一些常用的端口

TCP 21 = FTP

TCP 80 = HTTP

TCP 3306 = MySQL

TCP 4000 = 腾讯QQ客户端

TCP 8080 = WWW代理(如Tomcat)

④传输协议

❶传输协议,是为了完成网络通讯,而制定的规则。只要通讯双方安装了相同的传输协议,就可以实现相互通讯目的。

❷最常用的通讯协议为UDP/IP,TCP/IP。

❸UDP:User Datagram Protocol

/*['ju:zə]用户['deitəgræm]数据包['prəutəkɔl]协议*/

1,将数据的源和目的,都封装到数据包中,不需要建立连接。

2,每个数据包的大小,被限制在64k以内。

3,面向无连接,是不可靠协议。网络环境差时,更容易丢失数据。

4,不需要建立连接,传输速度快。(聊天软件)

5,此协议适用于一对多的数据传输(如视频会议),并且对数据准确性要求不高的情况。

❹TCP:Transmission Control Protocol

/*[trænz'miʃn]传输[kən'trəul]控制['prəutəkɔl]协议*/

1,需要建立连接,形成传输数据的通道。(通过三次握手实现)

2,在连接中,可以进行大数据量的传输。

3,通过三次握手完成连接,是可靠的协议。

4,必须建立连接,传输效率会比较低。

5,此协议适用于数据的精准传输(如文件下载),以及网络环境较差的情况下的数据传输。

❺通讯的保密性

在网络中,只要使用的是通用的传输协议,就可以被所有使用该通讯协议的平台,获取到其通讯的内容。

有些组织为了实现通讯的保密性,制定了一些专用的通讯协议,只用于实现该组织内部的通讯。

❻传输协议与Socket

Socket/*['sɔkit]插座、网络编程*/

相互通讯的双方,都需要提供一种可以用于通讯的机制。这种通讯机制就类似于插座,插座的作用就是提供一种可以连接的功能。

网络通讯的实现,就是对于通讯机制的制定和实现。面向这种通讯机制的编程,就是网络编程,即Socket编程。

Socket就是为网络通讯提供的一种机制,通讯的两端都要有Socket。网络通讯,其实就是Socket间的通讯,数据在两个Socket之间通过IO传输。

Socket间的通讯,可以比作两个港口之间的货物运输。Socket就好比港口,数据就好比货物,IO就好比船只。先有了港口,才能够实现货物的运输。先有了Socket,才可以实现通讯目的。

每一个传输协议,都拥有对Socket不同的实现方式。

❼Socket实现

UDP:DatagramSocket

TCP:Socket,ServerSocket

⑤InetAddress类

public class InetAddress

extends Object

implements Serializable

❶此类用于描述互联网协议(IP)地址。本类的对象中封装了主机名和其所对应的IP地址。

❷成员方法(部分)

public static InetAddress[] getAllByName(String host)

throws UnknownHostException/*[ʌn'nəun]未知[həust]主机*/

根据指定的主机名,返回由其所对应的网址所组成的数组。一般的大型网站,都可以返回多个网络地址。

public static InetAddress getByName(String host)

throws UnknownHostException

根据指定的主机名,返回其所对应的网络地址。此处的主机名,也可以是IP地址的字符串形式。

public String getHostAddress()

返回该网址对象的,IP地址的字符串表示形式。

public String getHostName()

返回该网址对象的,主机名的字符串表示形式。

public static InetAddress getLocalHost()

throws UnknownHostException

返回本地主机的网络地址。

⑥DatagramSocket/*['deitəgræm]数据电报['sɔkit]插座*/类

public final class DatagramSocket

extends Object

❶此类表示用来发送和接收数据报包的套接字。套接字即两台机器间通信的端点。

❷此类总是用于UDP的广播发送,通常被绑定在通配符地址上(0.0.0.0)。

❸接收端通常都会指定一个监听端口。

❹构造方法(部分)

public DatagramSocket(int port)/*[pɔ:t]端口*/

throws SocketException

创建一个数据报套接字,将其绑定在本地主机的指定端口上,通常是用来监听此端口,方便于接收数据。此时的套接字,被绑定在通配符地址上,IP地址由内核来选择。

❺成员方法(部分)

public void close()

关闭此数据报套接字。

public void receive(DatagramPacket p)/*[ri'si:v]接收*/

throws IOException

从此套接字上接收数据报包。被接收的数据,将被存储在指定数据报包的缓冲区中。数据报包中除了传输的数据之外,还包括发送方和接收方的IP地址及端口号。此方法在接收到数据报前一直处于阻塞状态,类似于read方法。

public void send(DatagramPacket p)/*[send]发送*/

throws IOException

从此套接字上发送数据报包。发送的数据被封装在指定的数据报包中,该数据报包中包含有被发送的数据、其长度、接收方和发送方的IP地址及端口号。

⑦DatagramPacket/*['deitəgræm]数据电报['pækit]包*/类

public final class DatagramPacket

extends Object

❶此类表示数据报包。

❷数据报包,用来实现无连接的数据传送服务。每条报文仅根据该包中包含的信息,从一台主机被路由到另一台主机。多个数据报包在被传送时,并不保证选择相同的路由,不保证到达的先后顺序,也不保证一定能够到达。

❸构造方法(部分)

public DatagramPacket(byte[] buf,int length)

构造一个用于接收数据的数据报包,并指定用于接收数据的字节数组,和一次可以接收的数据长度。

public DatagramPacket(byte[] buf,int length,InetAddressaddress,int port)

构造一个用于发送数据的数据报包,并指定发送数据的数组长度,和接收端的地址及端口号。

带地址的构造方法,都是用于构造发送数据报包的。

❹成员方法(部分)

public InetAddress getAddress()

返回该数据报包中,非本主机的网址对象(主机名和IP地址)。

public byte[] getData()

返回此数据报包缓冲区中的数据内容。

public int getLength()

数据报包中数据的有效长度(即将要发送或接收到的数据长度)。

public int getPort()

返回该数据报包中,非本主机的端口号。

⑧Socket/*['sɔkit]插座*/类

public class Socket

extends Object

❶此类实现客户端套接字。套接字即两台机器间通信的端点。

❷构造方法(部分)

public Socket(InetAddress address,int port)

throws IOException

创建一个客户端套接字对象,并将其连接到指定IP地址的指定端口(即服务器程序)。

❸成员方法(部分)

public void connect(SocketAddress endpoint)/*[kə'nekt]连接['endpɔint]终端*/

throws IOException

将此套接字连接到指定的服务器。

public void close()

throws IOException

关闭此套接字。同时该套接字的输入流和输出流也将被关闭。套接字被关闭后,便不可以再次连接和绑定。

public InetAddress getInetAddress()

返回此套接字连接到的网络地址。

public InputStream getInputStream()

throws IOException

返回此套接字的输入流。

public InetAddress getLocalAddress()

返回此套接字绑定的本地网址。

public int getLocalPort()

返回此套接字绑定的本地端口。

public OutputStream getOutputStream()

throws IOException

返回此套接字的输出流。

public int getPort()

返回此套接字连接到的远程端口。

public void shutdownInput()

throws IOException

关闭此套接字的输入流。

public void shutdownOutput()

throws IOExcepiton

关闭此套接字的输出流。

⑨ServerSocket类

public class ServerSocket

extends Object

❶此类实现服务器套接字。

❷此类的对象,使用客户端的输入流和输出流,同客户端进行数据传输。

❸构造方法(部分)

public ServerSocket(int port)

throws IOException

创建一个绑定到指定端口的服务器套接字。

public ServerSocket(int port,int backlog)/*['bæklɔg]储备*/

throws IOException

创建一个绑定到指定端口的服务器套接字,并指定最大的并发服务数量。

❹成员方法(部分)

public Socket accept()/*[ə'ksept]接收*/

throws IOExcetpion

侦听并接收此套接字的连接。返回被侦听到的客户端套接字。此方法在侦听到请求服务对象之前一直阻塞。

public void close()

throws IOException

关闭此套接字。

⑩InetSocketAddress类

public class InetSocketAddress

extends SocketAddress

❶此类实现IP套接字地址(IP地址+端口号)。它也可以是一对(主机名+端口号),此时将尝试解析主机名。

❷构造方法(部分)

public InetSocketAddress(InetAddress address,int port)

根据指定的IP地址和端口号,创建套接字地址。

❸成员方法(部分)

public static InetSocketAddress createUnresolved(Stringhost,int port)

/*['sɔkit]插座[ə'dres]地址[kri:'eit]创建[ʌnri'zɔlvd]未解决的*/

根据指定的主机名和端口号,创建未解析的套接字地址。

⑪URL类

public final class URL

extends Object

implements Serializable

❶此类用于描述统一资源定位符,它是指向互联网“资源”的指针。

❷这里的资源可以是简单的文件或目录,也可以是数据库。

❸构造方法(部分)

public URL(String spec)/*Uniform Resource Locator*/

throws MalformedURLException/*[mæl'fɔ:md]畸形的*/

/*['ju:nifɔ:m]统一[ri'sɔ:s]资源[ləu'keitə]定位器[spek]说明书*/

根据指定的字符串,构造一个URL对象。

❹成员方法(部分)

public String getFile()

获取此对象的文件名。相当于getPath+getQuery。

public String getHost()

获取此对象的主机名。

public String getPath()

获取此对象的文件路径。

public int getPort()

获取此对象的端口号。如果没有设置,则返回-1。此时可以给其设置一个默认值80。

public String getProtocol()

返回此对象的协议名称。

public String getQuery()/*['kwiəri]查询*/

获取此对象的查询部分。(?之后的内容)

public URLConnection openConnention()

throws IOException

返回一个URLConnection对象,它表示到URL所引用的远程对象的连接。每次调用此方法都会打开一个新的连接。此处的对象完成了连接的功能,不用再创建Socket对象。

public final InputStream openStream()

throws IOException

打开到此URL的连接,并返回一个用于从该连接读入的InputStream。其实此方法调用的是openConnection().getInputStream。

❺URI、URL、URN

URI:Uniform Resource Identifier

/*['ju:nifɔ:m]统一[ri'sɔ:s]资源[ai'dentfaiə]标示符*/

URL:Uniform Resource Locator(只用于描述地址)

/*['ju:nifɔ:m]统一[ri'sɔ:s]资源[ləu'keitə]定位器*/

URN:Uniform Resource Name(只用于描述名称。如,条形码)

/*['ju:nifɔ:m]统一[ri'sɔ:s]资源[neim]命名*/

URI包含URL和URN。

⑫URLConnection/*[kə'nekʃn]连接*/类

public abstract class URLConnection

extends Object

❶此类表示应用程序和URL之间的通信链接。此类的实例可以用于读取和写入此URL引用的资源。内部封装了Socket。

❷直接子类:HttpURLConnection,JarURLConnection

❸成员方法(部分)

public InputStream getInputStream()

throws IOException

返回从此打开的连接读取的输入流。

public OutputStream getOutputStream()

throws IOException

返回写入到此连接的输出流。

---------------------------------------- JavaEE+云物联、期待与您交流!---------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值