java 网络编程
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java 网络编程,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含30210字,纯文字阅读大概需要44分钟。
内容图文
![java 网络编程](/upload/InfoBanner/zyjiaocheng/603/0d77b118911440cb9e0846799e7ec2c1.jpg)
java 网络编程
概述
计算机网络是通过传输介质、通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来的,实现资源共享和数据传输的系统。网络编程就是编写程序使互联网的两个(或多个)设备(如计算机)之间进行数据传输
网络体系结构
通过网络发送数据是一项复杂的操作,必须仔细地协调网络的物理特性以及所发送数据的逻辑特征。通过网络将数据从一台主机发送到另外的主机,这个过程是通过计算机网络通信来完成。
网络通信的不同方面被分解为多个层,层与层之间用接口连接。通信的双方具有相同的层次,层次实现的功能由协议数据单元(PDU)来描述。不同系统中的同一层构成对等层,对等层之间通过对等层协议进行通信,理解批次定义好的规则和约定。每一层表示为物理硬件(即线缆和电流)与所传输信息之间的不同抽象层次。在理论上,每一层只与紧挨其上和其下的层对话。将网络分层,这样就可以修改甚至替换某一层的软件,只要层与层之间的接口保持不变,就不会影响到其他层。
计算机网络体系结构是计算机网络层次和协议的集合,网络体系结构对计算机网络实现的功能,以及网络协议、层次、接口和服务进行了描述,但并不涉及具体的实现。接口是同一节点内相邻层之间交换信息的连接处,也叫服务访问点(SAP)。
世界上第一个网络体系结构由IBM公司提出(1974年,SNA),以后其他公司也相继提出自己的网络体系结构。为了促进计算机网络的发展,国际标准化组织ISO在现有网络的基础上,提出了不基于具体机型、操作系统或公司的网络体系结构,称为开放系统互连参考模型
OSI模型把网络通信的工作分为7层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
- 物理层
物理层处于OSI的最底层,是整个开放系统的基础。物理层涉及通信信道上传输的原始比特流(bits),它的功能主要是为数据端设备提供传送数据的通路以及传输数据。
- 数据链路层
数据链路层的主要任务是实现计算机网络中相邻节点之间的可靠传输,把原始的、有差错的物理传输线加上数据链路协议以后,构成逻辑上可靠的数据链路。需要完成的功能有链路管理、成帧、差错控制以及流量控制等。其中成帧是对物理层的原始比特流进行界定,数据链路层也能够对帧的丢失进行处理。
- 网络层
网络层涉及源主机节点到目的主机节点之间可靠的网络传输,它需要完成的功能主要包括路由选择、网络寻址、流量控制、拥塞控制、网络互连等。
- 传输层
传输层起着承上启下的作用,涉及源端节点到目的端节点之间可靠的信息传输。传输层需要解决跨越网络连接的建立和释放,对底层不可靠的网络,建立连接时需要三次握手,释放连接时需要四次挥手。
- 会话层和表示层
会话层的主要功能是负责应用程序之间建立、维持和中断会话,同时也提供对设备和结点之间的会话控制,协调系统和服务之间的交流,并通过提供单工、半双工和全双工3种不同的通信方式,使系统和服务之间有序地进行通信。
表示层关心所传输数据信息的格式定义,其主要功能是把应用层提供的信息变换为能够共同理解的形式,提供字符代码、数据格式、控制信息格式、加密等的统一表示。
- 应用层
应用层为OSI的最高层,是直接为应用进程提供服务的。其作用是在实现多个系统应用进程相互通信的同时,完成一系列业务处理所需的服务。
TCP/IP协议是一个开放的网络协议簇,它的名字主要取自最重要的网络层IP协议和传输层TCP协议。TCP/IP协议定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。TCP/IP参考模型采用4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求,这4个层次分别是:网络接口层、网络层(IP层)、传输层(TCP层)、应用层。
- 网络接口层
TCP/IP协议对网络接口层没有给出具体的描述,网络接口层对应着OSI参考模型的物理层和数据链路层
- 网络层(IP层)
网络层是整个TCP/IP协议栈的核心。它的功能是把分组发往目标网络或主机。同时,为了尽快地发送分组,可能需要沿不同的路径同时进行分组传递。因此,分组到达的顺序和发送的顺序可能不同,这就需要上层必须对分组进行排序。网络层除了需要完成路由的功能外,也可以完成将不同类型的网络(异构网)互连的任务。除此之外,互联网层还需要完成拥塞控制的功能。
- 传输层(TCP层)
TCP层负责在应用进程之间建立端到端的连接和可靠通信,它只存在与端节点中。TCP层涉及两个协议,TCP和UDP。其中,TCP协议提供面向连接的服务,提供按字节流的有序、可靠传输,可以实现连接管理、差错控制、流量控制、拥塞控制等。UDP协议提供无连接的服务,用于不需要或无法实现面向连接的网络应用中。
- 应用层
应用层为Internet中的各种网络应用提供服务。
网络协议
如同人与人之间相互交流是需要遵循一定的规则(如语言)一样,计算机之间能够进行相互通信是因为它们都共同遵守一定的规则,即网络协议。
IP协议(Internet protocol)
P协议的作用在于把各种数据包准备无误的传递给对方,其中两个重要的条件是IP地址和MAC地址。由于IP地址是稀有资源,不可能每个人都拥有一个IP地址,所以我们通常的IP地址是路由器给我们生成的IP地址,路由器里面会记录我们的MAC地址。而MAC地址是全球唯一的。举例,IP地址就如同是我们居住小区的地址,而MAC地址就是我们住的那栋楼那个房间那个人。IP地址采用的IPv4格式,目前正在向IPv6过渡。
TCP协议(Transmission Control Protocol)
TCP(传输控制协议)是面向连接的传输层协议。TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。TCP协议采用字节流传输数据。
三次握手与四次挥手
TCP是面向连接的协议,因此每个TCP连接都有3个阶段:连接建立、数据传送和连接释放。连接建立经历三个步骤,通常称为“三次握手”
\1. 第一次握手(客户端发送请求)
客户机发送连接请求报文段到服务器,并进入SYN_SENT状态,等待服务器确认。发送连接请求报文段内容:SYN=1,seq=x;SYN=1意思是一个TCP的SYN标志位置为1的包,指明客户端打算连接的服务器的端口;seq=x表示客户端初始序号x,保存在包头的序列号(Sequence Number)字段里。
2. 第二次握手(服务端回传确认)
服务器收到客户端连接请求报文,如果同意建立连接,向客户机发回确认报文段(ACK)应答,并为该TCP连接分配TCP缓存和变量。服务器发回确认报文段内容:SYN=1,ACK=1,seq=y,ack=x+1;SYN标志位和ACK标志位均为1,同时将确认序号(Acknowledgement Number)设置为客户的ISN加1,即x+1;seq=y为服务端初始序号y。
3. 第三次握手(客户端回传确认)
客户机收到服务器的确认报文段后,向服务器给出确认报文段(ACK),并且也要给该连接分配缓存和变量。此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。客户端发回确认报文段内容:ACK=1,seq=x+1,ack=y+1;ACK=1为确认报文段;seq=x+1为客户端序号加1;ack=y+1,为服务器发来的ACK的初始序号字段+1。
注意:握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。
TCP四次挥手
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
1. TCP客户端发送一个FIN,用来关闭客户端到服务端的数据传送,客户端进入FIN_WAIT_1状态。发送报文段内容:FIN=1,seq=u;FIN=1表示请求切断连接;seq=u为客户端请求初始序号。
2. 服务端收到这个FIN,它发回一个ACK给客户端,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号;服务端进入CLOSE_WAIT状态。发送报文段内容:ACK=1,seq=v,ack=u+1;ACK=1为确认报文;seq=v为服务器确认初始序号;ack=u+1为客户端初始序号加1。
3. 服务器关闭客户端的连接后,发送一个FIN给客户端,服务端进入LAST_ACK状态。发送报文段内容:FIN=1,ACK=1,seq=w,ack=u+1;FIN=1为请求切断连接,ACK=1为确认报文,seq=w为服务端请求切断初始序号。
4. 客户端收到FIN后,客户端进入TIME_WAIT状态,接着发回一个ACK报文给服务端确认,并将确认序号设置为收到序号加1,服务端进入CLOSED状态,完成四次挥手。发送报文内容:ACK=1,seq=u+1,ack=w+1;ACK=1为确认报文,seq=u+1为客户端初始序号加1,ack=w+1为服务器初始序号加1。
注意:为什么连接的时候是三次握手,关闭的时候却是四次挥手?
因为当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭socket,所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文,我收到了”。只有等到服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送,故需要四步挥手。
UDP协议(User Datagram Protocol)
UDP,用户数据报协议,它是TCP/IP协议簇中无连接的运输层协议。
- UDP是一个非连接的协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。
- 由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务器可同时向多个客户端传输相同的消息。
- UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小。
- 吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制。
- UDP使用尽量最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态表。
- UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部受就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。
TCP与UDP的区别
- TCP基于连接,UDP是无连接的;
- 对系统资源的要求,TCP较多,UDP较少;
- UDP程序结构较简单;
- TCP是流模式,而UDP是数据报模式;
- TCP保证数据正确性,而UDP可能丢包;TCP保证数据顺序,而UDP不保证;
HTTP协议(Hypertext Transfer Protocol)
HTTP,超文本传输协议,它是互联网上应用最为广泛的一种网络协议。HTTP是一种应用层协议,它是基于TCP协议之上的请求/响应式的协议。HTTP协议是Web浏览器和Web服务器之间通信的标准协议。HTTP指定客户端与服务器如何建立连接、客户端如何从服务器请求数据,服务器如何响应请求,以及最后如何关闭连接。HTTP连接使用TCP/IP来传输数据。
对于从客户端到服务器的每一个请求,都有4个步骤:
- 默认情况下,客户端在端口80打开与服务器的一个TCP连接,URL中还可以指定其他端口。
- 客户端向服务器发送消息,请求指定路径上的资源。这个资源包括一个首部,可选地(取决于请求的性质)还可以有一个空行,后面是这个请求的数据。
- 服务器向客户端发送响应。响应以响应码开头,后面是包含数据的首部、一个空行以及所请求的文档或错误消息。
- 服务器关闭连接。
现在使用的HTTP协议是HTTP/1.1版本,1997年之前采用的是HTTP1.0版本。HTTP连接在1.0版本中采用非持续连接工作方式,1.1版本采用的是持续连接工作方式,持续连接是指服务器在发送响应后仍然在一段时间内保持这条由TCP运输层协议建立起来的连接,使客户端和服务器可以继续在这条连接上传输HTTP报文。
是否采用持续连接工作方式,1.0中默认是关闭的,需要在HTTP头加入“Connection:Keep-Alive”,才能启用Keep-Alive。HTTP1.1中默认启用Keep-Alive,如果加入“Connection:close”,才关闭。目前大部分浏览器都是用HTTP1.1协议,也就是说默认都会发起Keep-Alive的连接请求了,所以是否能完成一个完整的Keep-Alive连接就看服务器设置情况。
HTTP和HTTPS的区别
HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单来说就是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。它是一个URL scheme(抽象标识符体系),句法类同http:体系,用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。
超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用开号、密码等。
为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
HTTPS和HTTP的区别主要为以下四点:
- https协议需要到ca申请证书,一般免费证书很少,需要缴费。
- http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
- http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
- http的连接很简单,是无状态的;https协议是有ssl+http协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
java.net 网络编程
为实现网络应用程序提供类。
常用类
套接类
网络上建立机器之间的通信链接的类。
套接字是在网络上建立机器之间的通信链接的方法
- socket 是 TCP 客户端 API,通常用于连接远程主机。
- serversocket 是 TCP 服务器 API,通常接受源于客户端套接字的连接。
- 是 UDP 端点 API,用于和
- multicastsocket 是
DatagramSocket
的子类,在处理多播组时使用。使用 TCP 套接字的发送和接收操作需要借助 InputStream 和 OutputStream 来完成,这两者是通过 socket.getinputstream() 和 socket.getoutputstream() 方法获取的。
Socket
public class **Socket**extends Object
- 概述
此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。
套接字的实际工作由
SocketImpl
类的实例执行。应用程序通过更改创建套接字实现的套接字工厂可以配置它自身,以创建适合本地防火墙的套接字。
- 常用方法
构造方法摘要 | |
---|---|
| Socket() 通过系统默认类型的 SocketImpl 创建未连接套接字 |
| Socket(InetAddress address, int port) 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。 |
| Socket(InetAddress address, int port, InetAddress localAddr, int localPort) 创建一个套接字并将其连接到指定远程地址上的指定远程端口。 |
| Socket(Proxy proxy) 创建一个未连接的套接字并指定代理类型(如果有),该代理不管其他设置如何都应被使用。 |
protected | Socket(SocketImpl impl) 使用用户指定的 SocketImpl 创建一个未连接 Socket。 |
| Socket(String host, int port) 创建一个流套接字并将其连接到指定主机上的指定端口号。 |
| Socket(String host, int port, InetAddress localAddr, int localPort) |
方法摘要 | |
---|---|
void | bind(SocketAddress bindpoint) 将套接字绑定到本地地址。 |
void | clos() 关闭此套接字。 |
void | connect(SocketAddress endpoint) 将此套接字连接到服务器。 |
void | connect(SocketAddress endpoint, int timeout) 将此套接字连接到服务器,并指定一个超时值。 |
SocketChannel | getChannel() 返回与此数据报套接字关联的唯一 socketchannel 对象(如果有)。 |
InetAddress | getInetAddress() 返回套接字连接的地址。 |
InputStream | getInputStream() 返回此套接字的输入流。 |
boolean | getKeepAlive() 测试是否启用 SO_KEEPALIVE。 |
InetAddress | getLocalAddress() 获取套接字绑定的本地地址。 |
int | getLocalPort() 返回此套接字绑定到的本地端口。 |
SocketAddress | getLocalSocketAddress() 返回此套接字绑定的端点的地址,如果尚未绑定则返回 null 。 |
boolean | getOOBInline() 测试是否启用 OOBINLINE。 |
OutputStream | getOutputStream() 返回此套接字的输出流。 |
int | getPort() 返回此套接字连接到的远程端口。 |
int | getReceiveBufferSize() 获取此 Socket 的 SO_RCVBUF 选项的值,该值是平台在 Socket 上输入时使用的缓冲区大小。 |
SocketAddress | getRemoteSocketAddress() 返回此套接字连接的端点的地址,如果未连接则返回 null 。 |
boolean | getReuseAddress() 测试是否启用 SO_REUSEADDR。 |
int | getSendBufferSize() 获取此 Socket 的 SO_SNDBUF 选项的值,该值是平台在 Socket 上输出时使用的缓冲区大小。 |
int | getSoLinger() 返回 SO_LINGER 的设置。 |
int | getSoTimeout() 返回 SO_TIMEOUT 的设置。 |
boolean | getTcpNoDelay() 测试是否启用 TCP_NODELAY。 |
int | getTrafficClass() 为从此 Socket 上发送的包获取 IP 头中的流量类别或服务类型。 |
boolean | isBound() 返回套接字的绑定状态。 |
boolean | isClosed() 返回套接字的关闭状态。 |
boolean | isConnected() 返回套接字的连接状态。 |
boolean | isInputShutdown() 返回是否关闭套接字连接的半读状态 (read-half)。 |
boolean | isOutputShutdown) 返回是否关闭套接字连接的半写状态 (write-half)。 |
void | sendUrgentData(int data) 在套接字上发送一个紧急数据字节。 |
void | setKeepAlive(boolean on) 启用/禁用 SO_KEEPALIVE。 |
void | setOOBInline(boolean on) 启用/禁用 OOBINLINE(TCP 紧急数据的接收者) 默认情况下,此选项是禁用的,即在套接字上接收的 TCP 紧急数据被静默丢弃。 |
void | setPerformancePreferences(int connectionTime, int latency, int bandwidth) 设置此套接字的性能偏好。 |
void | setReceiveBufferSize(int size) 将此 Socket 的 SO_RCVBUF 选项设置为指定的值。 |
void | setReuseAddress(boolean on) 启用/禁用 SO_REUSEADDR 套接字选项。 |
void | setSendBufferSize(int size) 将此 Socket 的 SO_SNDBUF 选项设置为指定的值。 |
static void | setSocketImplFactory(SocketImplFactory fac) 为应用程序设置客户端套接字实现工厂。 |
void | setSoLinger(boolean on, int linger) 启用/禁用具有指定逗留时间(以秒为单位)的 SO_LINGER。 |
void | setSoTimeout(int timeout) 启用/禁用带有指定超时值的 SO_TIMEOUT,以毫秒为单位。 |
void | setTcpNoDelay(boolean on) 启用/禁用 TCP_NODELAY(启用/禁用 Nagle 算法)。 |
void | setTrafficClass(int tc) 为从此 Socket 上发送的包在 IP 头中设置流量类别 (traffic class) 或服务类型八位组 (type-of-service octet)。 |
void | shutdownInput() 此套接字的输入流置于“流的末尾”。 |
void | shutdownOutput() 禁用此套接字的输出流。 |
String | toString() 将此套接字转换为 String 。 |
ServerSocket
public class **ServerSocket** extends Object
- 概述
此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。
服务器套接字的实际工作由 SocketImpl
类的实例执行。应用程序可以更改创建套接字实现的套接字工厂来配置它自身,从而创建适合本地防火墙的套接字。
- 常用方法
构造方法摘要 |
---|
ServerSocket() 创建非绑定服务器套接字。 |
ServerSocket(int port) 创建绑定到特定端口的服务器套接字。 |
ServerSocket(int port, int backlog) 利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。 |
ServerSocket(int port, int backlog, InetAddress bindAddr) 使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器。 |
方法摘要 | |
---|---|
Socket | accept() 侦听并接受到此套接字的连接。 |
void | bind(SocketAddress endpoint) 将 ServerSocket 绑定到特定地址(IP 地址和端口号)。 |
void | bind(SocketAddress endpoint, int backlog) 将 ServerSocket 绑定到特定地址(IP 地址和端口号)。 |
void | close() 关闭此套接字。 |
ServerSocketChannel | getChannel() 返回与此套接字关联的唯一 serversocketchannel 对象(如果有)。 |
InetAddress | getInetAddress() 返回此服务器套接字的本地地址。 |
int | getLocalPort() 返回此套接字在其上侦听的端口。 |
SocketAddress | getLocalSocketAddress() 返回此套接字绑定的端点的地址,如果尚未绑定则返回 null 。 |
int | getReceiveBufferSize() 获取此 ServerSocket 的 SO_RCVBUF 选项的值,该值是将用于从此 ServerSocket 接受的套接字的建议缓冲区大小。 |
boolean | getReuseAddress() 测试是否启用 SO_REUSEADDR。 |
int | getSoTimeout() 获取 SO_TIMEOUT 的设置。 |
protected void | implAccept(Socket s) ServerSocket 的子类使用此方法重写 accept() 以返回它们自己的套接字子类。 |
boolean | isBound() 返回 ServerSocket 的绑定状态。 |
boolean | isClosed() 返回 ServerSocket 的关闭状态。 |
void | setPerformancePreferences(int connectionTime, int latency, int bandwidth) 设置此 ServerSocket 的性能首选项。 |
void | setReceiveBufferSize(int size) 为从此 ServerSocket 接受的套接字的 SO_RCVBUF 选项设置默认建议值。 |
void | setReuseAddress(boolean on) 启用/禁用 SO_REUSEADDR 套接字选项。 |
static void | setSocketFactory(SocketImplFactory fac) 为应用程序设置服务器套接字实现工厂。 |
void | setSoTimeout(int timeout) 通过指定超时值启用/禁用 SO_TIMEOUT,以毫秒为单位。 |
String | toString() 作为 String 返回此套接字的实现地址和实现端口。 |
//创建服务器
ServerSocket server = new ServerSocket(3000);
//获取客户端信息
Socket client = server.accept();
//提示
System.out.println("连接到。。。");
//发送数据
OutputStream os = client.getOutputStream();
os.write("你好连接者".getBytes());
os.close();
//创建客户端
Socket client = new Socket("dxh.org",3000);
//读数据
InputStream is = client.getInputStream();
byte[] bytes = new byte[1024];
int len = 0;
while ((len = is.read(bytes)) != -1){
System.out.println(new String(bytes,0,len));
}
is.close();
统一资源定位符的类
java.net 包中的许多类可以提供更加高级的抽象,允许方便地访问网络上的资源。这些类为:
-
uri 是表示在 RFC 2396 中指定的统一资料标识符的类。顾名思义,它只是一个标识符,不直接提供访问资源的方法。
url 是表示统一资源定位符的类,它既是 URI 的旧式概念又是访问资源的方法。
-
urlconnection 是根据 URL 创建的,是用于访问 URL 所指向资源的通信链接。此抽象类将大多数工作委托给底层协议处理程序,如 http 或 ftp。
-
HttpURLConnection 是 URLConnection 的子类,提供一些特定于 HTTP 协议的附加功能。
建议的用法是使用 uri 指定资源,然后在访问资源时将其转换为 url。从该 URL 可以获取 urlconnection 以进行良好控制,也可以直接获取 InputStream。
URI
public final class **URI**extends Objectimplements Comparable, Serializable
表示一个统一资源标识符 (URI) 引用。
URL
public final class **URL** extends Objectimplements Serializable
- 概述
类 URL
代表一个统一资源定位符,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。
- 常用方法
构造方法摘要 |
---|
URL*(String spec) 根据 String 表示形式创建 URL 对象。 |
URL(String protocol, String host, int port, String file) 根据指定 protocol 、host 、port 号和 file 创建 URL 对象。 |
URL(String protocol, String host, int port, String file, URLStreamHandler handler) 根据指定的 protocol 、host 、port 号、file 和 handler 创建 URL 对象。 |
URL(String protocol, String host, String file) 根据指定的 protocol 名称、host 名称和 file 名称创建 URL。 |
URL(URL context, String spec) 通过在指定的上下文中对给定的 spec 进行解析创建 URL。 |
URL(URL context, String spec, URLStreamHandler handler) 通过在指定的上下文中用指定的处理程序对给定的 spec 进行解析来创建 URL。 |
方法摘要 | |
---|---|
boolean | equals(Object obj) 比较此 URL 是否等于另一个对象。 |
String | getAuthority() 获取此 URL 的授权部分。 |
Object | getContent() 获取此 URL 的内容。 |
Object | getContent(Class[] classes) 获取此 URL 的内容。 |
int | getDefaultPort() 获取与此 URL 关联协议的默认端口号。 |
String | getFile() 获取此 URL 的文件名。 |
String | getHost() 获取此 URL 的主机名(如果适用)。 |
String | getPath() 获取此 URL 的路径部分。 |
int | getPort() 获取此 URL 的端口号。 |
String | getProtoco() 获取此 URL 的协议名称。 |
String | getQuery() 获取此 URL 的查询部分。 |
String | getRef() 获取此 URL 的锚点(也称为“引用”)。 |
String | getUserInfo() 获取此 URL 的 userInfo 部分。 |
int | hashCode() 创建一个适合哈希表索引的整数。 |
URLConnection | openConnection() 返回一个 URLConnection 对象,它表示到 URL 所引用的远程对象的连接。 |
URLConnection | openConnection(Proxy proxy) 与 openConnection() 类似,所不同是连接通过指定的代理建立;不支持代理方式的协议处理程序将忽略该代理参数并建立正常的连接。 |
InputStream | openStream() 打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream 。 |
boolean | sameFile(URL other) 比较两个 URL,不包括片段部分。 |
protected void | set(String protocol, String host, int port, String file, String ref) 设置 URL 的字段。 |
protected void | set(String protocol, String host, int port, String authority, String userInfo, String path, String query, String ref) 设置 URL 的指定的 8 个字段。 |
static void | setURLStreamHandlerFactory(URLStreamHandlerFactory fac) 设置应用程序的 URLStreamHandlerFactory 。 |
String | toExternalForm() 构造此 URL 的字符串表示形式。 |
String | toString() 构造此 URL 的字符串表示形式。 |
URI | toURI() 返回与此 URL 等效的 uri。 |
URLConnection
public abstract class **URLConnection**extends Object
- 概述
抽象类 URLConnection
是所有类的超类,它代表应用程序和 URL 之间的通信链接。此类的实例可用于读取和写入此 URL 引用的资源。通常,创建一个到 URL
- 通过在 URL 上调用
openConnection
方法创建连接对象。- 处理设置参数和一般请求属性。
- 使用
connect
方法建立到远程对象的实际连接。- 远程对象变为可用。远程对象的头字段和内容变为可访问。
- 常用方法
构造方法摘要 | |
---|---|
protected | URLConnection(URL url) 构造一个到指定 URL 的 URL 连接。 |
方法摘要 | |
---|---|
void | addRequestProperty(String key, String value) 添加由键值对指定的一般请求属性。 |
abstract void | connect() 打开到此 URL 引用的资源的通信链接(如果尚未建立这样的连接)。 |
boolean | getAllowUserInteraction() 返回此对象的 allowUserInteraction 字段的值。 |
int | getConnectTimeout() 返回连接超时设置。 |
Object | getContent() 获取此 URL 连接的内容。 |
Object | getContent(Class[] classes) 获取此 URL 连接的内容。 |
String | getContentEncoding() 返回 content-encoding 头字段的值。 |
int | getContentLength() 返回 content-length 头字段的值。 |
String | getContentType() 返回 content-type 头字段的值。 |
long | getDate() 返回 date 头字段的值。 |
static boolean | getDefaultAllowUserInteraction() 返回 allowUserInteraction 字段的默认值。 |
boolean | getDefaultUseCaches() 返回 URLConnection 的 useCaches 标志的默认值。 |
boolean | getDoInput() 返回此 URLConnection 的 doInput 标志的值。 |
boolean | getDoOutput() 返回此 URLConnection 的 doOutput 标志的值。 |
long | getExpiration() 返回 expires 头字段的值。 |
static FileNameMap | getFileNameMap() 从数据文件加载文件名映射(一个 mimetable)。 |
String | getHeaderField(int n) 返回第 n 个头字段的值。 |
String | getHeaderField(String name) 返回指定的头字段的值。 |
long | getHeaderFieldDate(String name, long Default) 返回解析为日期的指定字段的值。 |
int | getHeaderFieldInt(String name, int Default) 返回解析为数字的指定字段的值。 |
String | getHeaderFieldKey(int n) 返回第 n 个头字段的键。 |
Map> | getHeaderFields() 返回头字段的不可修改的 Map。 |
long | getIfModifiedSince() 返回此对象的 ifModifiedSince 字段的值。 |
InputStream | getInputStream() 返回从此打开的连接读取的输入流。 |
long | getLastModified() 返回 last-modified 头字段的值。 |
OutputStream | getOutputStream() 返回写入到此连接的输出流。 |
Permission | getPermission() 返回一个权限对象,其代表建立此对象表示的连接所需的权限。 |
int | getReadTimeout() 返回读入超时设置。 |
Map> | getRequestProperties() 返回一个由此连接的一般请求属性构成的不可修改的 Map。 |
String | getRequestProperty(String key) 返回此连接指定的一般请求属性值。 |
URL | getURL() 返回此 URLConnection 的 URL 字段的值。 |
boolean | getUseCaches() 返回此 URLConnection 的 useCaches 字段的值。 |
static String | guessContentTypeFromName(String fname) 根据 URL 的指定 “file” 部分尝试确定对象的内容类型。 |
static String | guessContentTypeFromStream(InputStream is) 根据输入流的开始字符尝试确定输入流的类型。 |
void | setAllowUserInteraction(boolean allowuserinteraction) 设置此 URLConnection 的 allowUserInteraction 字段的值。 |
void | setConnectTimeout(int timeout) 设置一个指定的超时值(以毫秒为单位),该值将在打开到此 URLConnection 引用的资源的通信链接时使用。 |
static void | setContentHandlerFactory(ContentHandlerFactory fac) 设置应用程序的 ContentHandlerFactory 。 |
static void | setDefaultAllowUserInteraction(boolean defaultallowuserinteraction) 将未来的所有 URLConnection 对象的 allowUserInteraction 字段的默认值设置为指定的值。 |
void | setDefaultUseCaches(boolean defaultusecaches) 将 useCaches 字段的默认值设置为指定的值。 |
void | setDoInput(boolean doinput) 将此 URLConnection 的 doInput 字段的值设置为指定的值。 |
void | setDoOutput(boolean dooutput) 将此 URLConnection 的 doOutput 字段的值设置为指定的值。 |
static void | setFileNameMap(FileNameMap map) 设置 FileNameMap。 |
void | setIfModifiedSince(long ifmodifiedsince) 将此 URLConnection 的 ifModifiedSince 字段的值设置为指定的值。 |
void | setReadTimeout(int timeout) 将读超时设置为指定的超时值,以毫秒为单位。 |
void | setRequestProperty(String key, String value) 设置一般请求属性。 |
void | setUseCaches(boolean usecaches) 将此 URLConnection 的 useCaches 字段的值设置为指定的值。 |
String | toString() 返回此 URL 连接的 String 表示形式。 |
HttpURLConnection
public abstract class **HttpURLConnection**extends URLConnection
- 概述
每个 HttpURLConnection 实例都可用于生成单个请求,但是其他实例可以透明地共享连接到 HTTP 服务器的基础网络。请求后在 HttpURLConnection 的 InputStream 或 OutputStream 上调用 close() 方法可以释放与此实例关联的网络资源,但对共享的持久连接没有任何影响。如果在调用 disconnect() 时持久连接空闲,则可能关闭基础套接字。
- 常用方法
protected | HttpURLConnection(URL u) HttpURLConnection 的构造方法。 |
---|---|
方法摘要 | |
---|---|
abstract void | disconnect() 指示近期服务器不太可能有其他请求。 |
InputStream | getErrorStream() 如果连接失败但服务器仍然发送了有用数据,则返回错误流。 |
static boolean | getFollowRedirects() 返回指示是否应该自动执行 HTTP 重定向 (3xx) 的 boolean 值。 |
String | getHeaderField(int n) 返回 n th 头字段的值。 |
long | getHeaderFieldDate(String name, long Default) 返回解析为日期的指定字段的值。 |
String | getHeaderFieldKey(int n) 返回 n th 头字段的键。 |
boolean | getInstanceFollowRedirects() 返回此 HttpURLConnection 的 instanceFollowRedirects 字段的值。 |
Permission | getPermission() 返回一个权限对象,其代表建立此对象表示的连接所需的权限。 |
String | getRequestMethod() 获取请求方法。 |
int | getResponseCode() 从 HTTP 响应消息获取状态码。 |
String | getResponseMessage() 获取与来自服务器的响应代码一起返回的 HTTP 响应消息(如果有)。 |
void | setChunkedStreamingMode(int chunklen) 此方法用于在预先不知道内容长度时启用没有进行内部缓冲的 HTTP 请求正文的流。 |
void | setFixedLengthStreamingMode(int contentLength) 此方法用于在预先已知内容长度时启用没有进行内部缓冲的 HTTP 请求正文的流。 |
static void | setFollowRedirects(boolean set) 设置此类是否应该自动执行 HTTP 重定向(响应代码为 3xx 的请求)。 |
void | setInstanceFollowRedirects(boolean followRedirects) 设置此 HttpURLConnection 实例是否应该自动执行 HTTP 重定向(响应代码为 3xx 的请求)。 |
void | setRequestMethod(String method) 设置 URL 请求的方法, GET POST HEAD OPTIONS PUT DELETE TRACE 以上方法之一是合法的,具体取决于协议的限制。 |
abstract boolean | usingProxy() 指示连接是否通过代理。 |
HttpURLConnection connection = null;
InputStream is = null;
BufferedReader br = null;
String result = null;// 返回结果字符串
try {
// 创建远程url连接对象
URL url = new URL(httpurl);
// 通过远程url连接对象打开一个连接,强转成httpURLConnection类
connection = (HttpURLConnection) url.openConnection();
// 设置连接方式:get
connection.setRequestMethod("GET");
// 设置连接主机服务器的超时时间:15000毫秒
connection.setConnectTimeout(15000);
// 设置读取远程返回的数据时间:60000毫秒
connection.setReadTimeout(60000);
// 发送请求
connection.connect();
// 通过connection连接,获取输入流
if (connection.getResponseCode() == 200) {
is = connection.getInputStream();
// 封装输入流is,并指定字符集
br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
// 存放数据
StringBuffer sbf = new StringBuffer();
String temp = null;
while ((temp = br.readLine()) != null) {
sbf.append(temp);
sbf.append("\r\n");
}
result = sbf.toString();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭资源
if (null != br) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != is) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
connection.disconnect();// 关闭远程连接
}
return result;
HttpURLConnection connection = null;
InputStream is = null;
OutputStream os = null;
BufferedReader br = null;
String result = null;
try {
URL url = new URL(httpUrl);
// 通过远程url连接对象打开连接
connection = (HttpURLConnection) url.openConnection();
// 设置连接请求方式
connection.setRequestMethod("POST");
// 设置连接主机服务器超时时间:15000毫秒
connection.setConnectTimeout(15000);
// 设置读取主机服务器返回数据超时时间:60000毫秒
connection.setReadTimeout(60000);
// 默认值为:false,当向远程服务器传送数据/写数据时,需要设置为true
connection.setDoOutput(true);
// 默认值为:true,当前向远程服务读取数据时,设置为true,该参数可有可无
connection.setDoInput(true);
// 设置传入参数的格式:请求参数应该是 name1=value1&name2=value2 的形式。
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
// 设置鉴权信息:Authorization: Bearer da3efcbf-0845-4fe3-8aba-ee040be542c0
connection.setRequestProperty("Authorization", "Bearer da3efcbf-0845-4fe3-8aba-ee040be542c0");
// 通过连接对象获取一个输出流
os = connection.getOutputStream();
// 通过输出流对象将参数写出去/传输出去,它是通过字节数组写出的
os.write(param.getBytes());
// 通过连接对象获取一个输入流,向远程读取
if (connection.getResponseCode() == 200) {
is = connection.getInputStream();
// 对输入流对象进行包装:charset根据工作项目组的要求来设置
br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
StringBuffer sbf = new StringBuffer();
String temp = null;
// 循环遍历一行一行读取数据
while ((temp = br.readLine()) != null) {
sbf.append(temp);
sbf.append("\r\n");
}
result = sbf.toString();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭资源
if (null != br) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != os) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != is) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// 断开与远程地址url的连接
connection.disconnect();
}
return result;
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != os) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != is) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// 断开与远程地址url的连接
connection.disconnect();
}
return result;
内容总结
以上是互联网集市为您收集整理的java 网络编程全部内容,希望文章能够帮你解决java 网络编程所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。