14章Java笔记


URL基础知识
URL (Uniform Resource Locator:统一资源定位器)是对可以从互联网上得
到的、资源的位置、和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件,都有一个唯一的URL,它包含的信息,指出文件的位置、以及浏览器应该怎么处理它。

URL地址格式排列为:
scheme: //host: port/path。
该地址各个组成部分的含义如下:
Internet资源类型(scheme) :指出WWW客户程序用来操作
的工具。如**“http://”** 表示WWW服务器"ftp://" 表示FTP服务
器,“gopher://” 表示Gopher服务器,而**“news://”** 表示News
group新闻组。

.
服务器地址(host)指出WWW页面所在的服务器域名或IP地址

端口(port) :可选项,如果使用默认端口(如http协议的默认端口为80)则可以省略,对非默认端口的访问来说,需给出相应的服务器的端口号

路径(path) :指明服务器上某个资源的位置(其格式与DOS系统中的格式一样,通常由**“目录/子目录/文件名**这样的结构组成)。与端口一样,路径并非总是需要的,未写路径时,一般访问都是默认的文件,写上了路径,则访问具体的文件。

URL类

URL类的路径为: java.net.URL,是一个公有最终类,由该类派生的URL对象,可用于从URL指定的网页下载数据,
URL类的构造方法如下:

  1. public URL(String spec):
    创建一个由字符文本指定的定位器。如:
    URL url = new URL
    ( “http://www.baidu.com” );

  2. public URL(String protocol, String host, String file): 通过将URL
    字符串、分解成它对应的组成部分,来创建一个URL对象,
    如:
    URL url = new URL( "http” ,"www.baidu.com“,“index.html” );

  3. public URL(String protocol,String host, int port, String file):
    创建一个指定协议、主机、端口和文件名的文件定位器。
    如:
    URL url = new URL( "http”,“www.baidu.com”,80,“index.html” );

  4. public URL(String protocol,String host, int port, String file,
    URLStreamHandler handler
    ):创建一个指定协议、主机、端口、文件名
    和的URL流处理器的定位器。handler为null时,表示URL应使用协议的默认流处理程序。如:
    URL url = new URL( “http” ,"www.baidu.com, 80,“index.html” , null);

5)public URL(URL context, String spec):
URL url = new URL( “http://www.baidu.com” );
URL index = new URL(url, “index.html” )

  1. public URL(URL context, String spec, URLStreamHandler
    handler
    ):通过在指定的上下文中、用指定的处理程序,对给定的
    spec进行解析来创建URL。如果处理程序为null,则使用两参数构
    造方法进行解析。如:
    URL url = new URL( “http://www.baidu.com” );
    URL index = new URL(url, “index.htm” , null);

    注意
    类URL的构造方法,都声明抛出非运行时异常,因此生成URL对
    象时,我们必须要对这一异常进行处理, 通常是用try-catch语句进
    行捕获。try-catch异常处理格式如下:

//构造URL对象时用到的try-catch异常处理格式
try {
URL url = new URL…);
} catch (MalformedURLException ex) {
ex.printStackTrace();
}

使用URL类对象可以连接、并访问
一个指定的服务器上的资源,在连接到
网络资源后,可以读取和显示URL实例
对象的各类属性,可以使用openStream
()方法读取资源内容,也可以使用URL
Connection类读写URL资源

1.获取URL对象属性
public String getAuthority():
获取URL对象的权限信息
public Object getContent():
获取URL对象的内容,要处理IOException。
public int getDefaultPort():
获取与此相关的URL协议的默认端口号。
public String getFile():
获取URL的文件名。
public String getHost():
获取URL的主机名。
public String getPath():
获取URL的路径
public int getPort():
获取URL的端口号,如果没有设置端口号,返回-1。
public String getProtocol():
获取URL的协议名
public String getQuery():
获取URL的查询信息
public String getRef():
获取URL的锚点(也称为“参考"点)
public String getUserlnfo():
获取使用者信息

URLConnection读写网络资源

URLConnection的定义为public abstract class URLConnection,
表示Java程序和URL在网络上的通信连接,该类不能被直接实例化,可
以通过调用URL对象上的方法: openConnection()生成对应的实例对
象。URLConnection对象可以向所代表的URL,发送请求和读取URL的
资源。程序设计时常用的是
getInputStream()和getOutputStream(),

定义格式为: InputStream getInputStream();OutputStream get
OutputStream();

通常,使用URLConnection访问URL资源的步骤如下:
1)调用URL类的openConnection方法得到一个URLConnection实例:
URLConnection urlConn = url.openConnection();
2)调用以下方法,设置相关的属性:
setAllowUserInteraction(),设置连接中allowUserInteraction的值,
或是True,则在允许用户交互(例如弹出一个验证对话框)的上下文中,对此URL进行检查;
setDolnput(),设置doInput的值;
setDoOutput(),设置doOutput的值;
setlfModifiedSince(),设置连接中的ifModifiedSince的值,一些协议支持跳过对象的抓取,设置了ifModifiedSince的值后,则不会跳过;
setUserCaches(),设置用户缓存userCaches的值;
setRequestProperty(),设置请求的属性集。

调用connect()方法连接URL资源:
urlConn.connect(); 该方法创建一个、连接指定服务器套装字
的连接,如果尚未建立这样的连接,则打开到此URL弓|用的资源的通信链接。如果在已打开连接的情况下==(此时connected字段的值为true),调用connect方法==,则忽略该调用。
另外这个方法,还可以查询服务器,以获取
相应的头信息(header information) 。

打开连接后,使用getHeaderFieldKey()getHeaderField()
方法,来枚举出头信息的所有域。也可以使用如下的方法,来查询响
应头域中的内容:
getConnectionEncoding()获取响应信息头的编码信息
getContentLength()获取响应内容的长度
getContentType()获取响应内容的资源类型
getDate()获取当前日期
getExpiration()获取URL请求头中的过期时间
getLastModified()取得资源最后的修改时间

上面的这几个方法,能取得响应头域中的具体的信息,还可以使用
getHeaderFields()方法返回Map <String, List >类型的响
应信息字段集合,可以通过遍历该方法返回的数据,查看上面各个方法
所查看的内容。

使用getInputStream()方法访问URL资源数据
使用getInputStream()方法,将返回一个输入流,这个输入流、和URL类的openStream()方法,返回的输入流是相同的。在连接和处理HTTP服务器、以及处理Http资源时,也可以使用URLConnection的子类
HttpURLConnection来进行处理。

InetAddress类

InetAddress类的引|用路径为: java.net.InetAddress,表示互联网协议(IP)地址。

IP地址是使用的32位(IPv4协议使用的地址)或128位(IPv6协议使用的地址)无符号数字,它是一种低级协议,UDP协议和TCP协议,都是在它的基础上构建的。
InetAddress的实例包含IP地址,还可能包含相应的主机名(取决于它是否用主机名构造,或者是否已执行反向主机名解析)。

JavaAPI中该类常用的方法如下:

  1. equals(Object obj):将当前对象与指定对象进行比较。
    返回值为true表示相同,false表示不同。
  2. getAddress():以网络地址顺序来返回IP地址。返回值存在于Byte[]类型的字节数组中,其中最高序字节,位于标值为0的元素中。
  3. getAllByName(String host):返回指定主机名的、所有InetAddress对象。参数host是指定的主机,返回值存放于InetAddress[]数组中。
  4. getByAddress(byte[] addr):返回IP地址所对应的InetAddress对象,参数按网络字节顺序定义,最高位命令字节位于getAddress()下标为0的数组元素中。
  5. getByName(String host):返回指定主机名的网络地址。如果主机名为null,则返回本机机器的默认地址。为了加速对地址的访问,使用一个本地的cache。如果地址未知,则会引发unknowHostException异常。参数host表示指定的主机,返回值为InetAddress对象。
  6. getHostAddress():以"%d%d%d%d"的形式返
    回IP地址串,返回值的类型为String。
  7. getHostName():返回当前IP的主机名。返回值为String类型。
  8. getLocalHost():返回本地主机的InetAddress对象。如果无法决定主机名,则会弓|发unknowHostException异常。
  9. getLoopbackAddress():取得本机的内部循环地址,也就是local
    host/127.0.0.1。
  10. toString():将InetAddress对象以字符串的形式表示出来,返回值为String对象类型。

InetAddress类没有构造函数,因此创建InetAddress类不用构造函数(即不
使用new关键字来创建实例)它的实例对象需要通过方法getByName()、getLocalHost()及getAllByName()来建立。

URL类能实现与服务端连接这个功能,URLConnection类(或其子类HttpURLConnection)能实现向服务端发送请求、并读取服务端返回的、响应数据的功能,使用InputStreamOutputStream输入与输出流可以解决,对返回的数据的读取与解析功能

osl系统

两台计算机操作系统中的网络连接过程,包括从应用请求(在协议栈的顶部)到网络介质(底部),OSI参考 模型把功能分成七个独立的层次。该模型的体系结构图如下所示:

在这里插入图片描述
1 )端系统A的应用层发出一个请求;
2)该请求在端系统A-侧,依次向下层传递请求,并在各个层添加对应层的标志(可以认为是将上一层的信息进行编码),最后到达物理层;
3 )物理层直接面向连接介质,通过高低电平表示的二进制,将请求信息,通过网络连接设备(它包含网络层、数据链路层、物理层),传递到端系统B一侧的物理层中;
4),端系统B的物理层将请求数据依次向上面的层传递,解析并去掉各个层的标志(可以认为是解码),最后到达端系统B的应用层;
5),端系统B的应用层根据请求消息,做出响应,然后再按写前4步相同的过程,把响应数据皮馈给端系统A的应用层;

TCP/IP模型

TCP/IP参考模型,是计算机网络的祖父ARPANET,和其后继的因特网,所使用的参考模型。ARPANET是由美国国防部DoD(U.S.Department of Defense)赞助的研究网络。

TCP/IP模型各层由下到上分别为:网络接口层、Internet层、传输层、应用层:

在这里插入图片描述

IP与端口

IP在互联网中,能唯一标识一 台计算机,是每台计算机的唯一标识(身份证) ;网络编程是和远程计算机的通信,所以必须先能定位到远程计算机; IP帮 助解决此问题;一台计算机中可能有很多进程,具体和哪一个进程进行通信,这就得靠端口来识别。
IP和端口能唯一定位到需要通信的进程。这里的IP表示地址,区别于IP议。在OSI体系或TCP/IP体系中,IP协议位于网际层,用来封装IP地址到报文中。

端口号代表了特定的服务,因此必须保证,所请求的端口号,没有被其它的应用程序、或服务所占用。

端口号的范围为0-65535,其中0-1023为默认端口号,已经分配给了特定的应用协议,
如80代表HTTP服务,23代表telnet服务, 21代表FTP服务,25代表smtp服务,53代表dns服务等(计算机中如果没有安装或开启这些服务,则可以使用这些端口,否则不能使用)。

面向连接与面向无连接的通信

面向连接与面向无连接的区别,主要有如下两条:
(1):面向连接分为三个阶段,第一阶段是建立连接,在此阶段,发出一个建立连接的请求。只有在连接成功建立之后,才能开始数据传输,这是第二阶段。接着,当数据传输完毕,必须释放连接,这是第三个阶段。而面向无连接没有这么多阶段,它直接进行数据传输。
(2):面向连接的通信具有数据的保序性,而面向无连接的通信,不能保证接收数据的顺序、与发送数据的顺序一 致。

TCP协议

传输控制协议(Transmission Control Protocol, TCP),主要负责数据的分组和重组,在ISO/OSI七层网络参考模型标准中,是传输层中的重要协议(传输层还有一个协议是UDP),在实际运行的业界标准,TCP/IP网络参考模型中,它与IP协议组合使用,称为TCP/IP 。
TCP协议是面向连接的协议,适合于对可靠性要求比较高的运行环境,因为TCP是严格的、安全的。它以固定连接为基础,提供计算机之间可靠的数据传输,计算机之间可以凭借连接交换数据,并且传送的数据能够正确抵达目标,传送到目标后的数据,仍然保持数据送出时的顺序。

Socket原理及Socket编程

Socket编程是网络编程的核心内容。

网络上的两个程序,通过一个双向连通的连接,实现数据的访问与交换,双向连通的链路的每一端,称为一个套接字Socket。套接字通常用来实现客户方(请求服务的一方)、与服务方(提供服务的一方)的连接。

在Java环境中,套接字编程主要是指:基于TCP/IP的网络编程,一个套接字
由一个IP地址、和一个端口号唯一 确定。

通信过程为: Server端首先在某个端口,创建一个监听Client
请求的监听服务、并处于监听状态,当Client端向Server端的这个
端口,提出连接请求时,Server端和Client端就建立了一个连接、
和一条传输数据的通道,通信结束时,这个连接通道将被销毁。

在这里插入图片描述
服务端使用ServerSocket对象和Socket对象进行处理,客户端使用Socket对象进行处理。

客户端程序必须遵守下面的步骤:
1)建立客户端Socket连接;
2)得到Socket的输入与输出读写流;
3)使用读写流与服务端进行通信;
4)关闭流;
5)关闭Socket.

服务端必须遵守步骤如下:
1)建立一个ServerSocket并进行监听;
2)使用accept()方法取得新的连接;
3)得到Socket的输入与输出读写流;
4)根据客户端的请求,在已有的协议上,进行通信会话;
5)关闭Socket,关闭TCP连接;
6)回到第二步进行监听,或到第七步结束;
7)关闭ServerSocket。

ServerSocket类

ServerSocket作在服务端,用来监听指定的端口、并接收客户端的连接请求ServerSocket的常用构造方法如下:
public ServerSocket(int port) throws IOException: 创建一个具有确定端口的ServerSocket对象。
创建ServerSocket对象的一般格式如下:
try {
ServerSocket serverSocket = new ServerSocket(8888);
} catch (IOException ex) {
ex.printStackTrace();
}

创建了ServerSocket对象后,就可以利用它提供的方法,进行各种操作了,
ServerSocket常用的方法如下:

  1. Socket accept() throws IOExcep
    tion
    ,接收客户端的连接请求,并将与客户端的连接,封装成一一个Socket对象,服务器端便可以使用这个Socket对象、与客户端进行通信;
  2. void close() throws IOException,关闭Socket;
  3. int getLocalPort()返回Socket对象的端口号。

Socket类

客户端与服务端建立连接,首先要创建一个Socket对象。其常用的构造方法如下:
public Socket(InetAddres address, int port) throws
IOExcption
:创建一个指定的IP地址、指定端口的Socket对象,
address为要连接的、服务器端的IP地址,port为指定的端口。

public Socket(String host, int port)throws UnknownHostException,
lOException
:创建一个指定主机,指定端口的Socket对象,host为指定的服务端的、主机名或IP地址字符串,port为指定的端口。

创建Socket对象的一般格式如下:
try {
Socket socket = new Socket
(“127.0.0.1" , 8888);
} catch (IOException ex) {
ex.printStackTrace();
}

创建或获取Socket对象后,可以利用它的方法进行相应的操作,
其常用的方法如下:

  1. int getInetAddress()返回这个Socket连接到的服务端的IP地址;
  2. int getPort(),==返回这个Socket连接到的服务端的端口; ==
  3. Boolean isConnected(),返回连接状态;
  4. InputStream getInputStream() throws IOException,
    返回此Socket对象的输入流;
  5. OutputStream getOutputStream() throws IOException,
    返回此Socket对象的输出流;
  6. void close() throws IOException, 关闭Socket。

UDP协议与UDP编程的一般步骤

UDP

用户数据报协议(User Datagram Protocol, UDP)和TCP不同,UDP是一种非持续连接的通信协议,它不保证数据能够正确抵达目标,UDP协
议是一种面向无连接的协议
。虽然UDP可能会因网络连接等各种原因,无
法保证数据的安全传送,而且多个数据包抵达目标的顺序,可能和发送时的顺序不同,但是它比TCP更轻量一些,TCP认证会耗费额外的资源,可能导致传输速度的下降。

UDP编程的一般步骤

  1. UDP服务端与客户端的通信步骤
    UDP需要使用DatagramSocket来实现。
    在这里插入图片描述

客户端(发送端)需要经过如下的步骤:
1)创建套接字(socket) ;
2)向服务器发送数据(sendto) ;
3)关闭套接字;
服务端(接收端)按如下步骤进行处理:
1)创建套接字(socket) ;
2)将套接字绑定到一个本地地址和端口上(bind) ;
3)等待接收数据(recvfrom) ;
4)关闭套接字

  1. DatagramPacket类
    该类是UDP所传递的数据包,即打包后的数据。数据包用来实现无连接包投递服务。每个数据包仅根据包中包含的信息,从一台计算机传达到另一台计算机,传递的多个包可能选择不同的路由,也可能按不同的顺序
    到达。

常用的构造方法如下:
DatagramPacket(byte[] buf, int length):
创建数据包实例,这个数据包实例,将接收长度为length的数据包;
DatagramPacket(byte[] buf, int length,InetAddress address, int port):
创建数据包实例,用来将长度为length的数据包,发送到address参数指定的地址、和port参 数指定的端口号的主机,length参数必须小于等于buf数组的长度

  1. DatagramSocket的常用构造方法
    DatagramSocket():
    创建一个默认的套接字,并绑定到本地地址、和一个随机的端口号;
    DatagramSocket(int port):
    创建一个默认的套接字, 绑定到特定端口号;
    DatagramSocket(int port, InetAddress iad):
    创建一个套接字,绑定到特定的端口号及指定地址;
    DatagramSocket(SocketAddress sad):
    创建一个套接字,绑定到特定的套接字地址。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值