概述:
对于网络的实现,java支持Socket建立服务器和客户端的通讯;并提供了Jmail API 可以方便的实现邮件传输协议;还提供了URI,URL,URLConnection对Socket的包装去良好的支持了HTTP传输协议;并且还支持TCP/IP的很多机制,半关闭连接,保活连接器等。
Socket
对于Java这样的强大平台,它肯定也是支持Socket的,程序员不用了解具体底层协议传输(默认是TCP传输,也可以设置成UDP),
可以很方便的按照的流的方式进行通讯,主要实现类方法:
Socket类:
InputStream getInputStream():获取一个输入流。
OutputStream getOutputStream():获取一个输出流。
ServerSocket类:
ServerSocket(int port):创建一个服务器套接字。
Socket accept():服务端接受一个客户端访问。
void close():关闭连接。
对于网络流的连接,如果客户端去访问服务器出错未返回,客户端不可能一直忙等,客户端需要对服务器端的连接设置一个超时。
对于Socket服务器并发的实现,我们只需简单对每一个客户端的访问都new Thread去处理所有的请求即可。
java的Socket类还有一个软肋,就是如果一端(A)成功连接到另一端(B),A向B传输大量数据,传输过程时间很长,并且还未超时,
这时一端想中断 连接是无法中断的。Java提供了SocketChannel实现套接字通道,一个可中断的网络传输管道。使用方式如下:
SocketChannel channel = SocketChannel.open(new InetSocketAddress(host, port));
由于Channel没有专门的输入输出流,可以用以下两种方式实现输入,输出流:
Scanner in = new Scanner(channel);
OutputStream outStream = Channels.newOutputStream(channel);我们还可以使用Socket去实现ftp,smtp,http,telnet
等协议的传输不过必须得按照具体协议过程去传输(详细请参考相关的RFC文档)。
URI与URL
URI:uniform resource identifier(统一资源标识符)
URI是一个纯粹的句法结构,用与指定标识Web资源的各个不同部分。URL是URI的一个特例,它包含了定义Web资源的足够信息。
URI不包含任何用户访问资源的方法-它的唯一作用就是解析。
URL:uniform resource locator(统一资源定位符)
URL是可以打开一个到达资源的流。目前java支持http:, https:, ftp: the local file system (file:), and JAR files (jar:)。
简单的可以理解为:URI可以理解成一个网络ID,而URL可以理解成一个网络资源。
URI解析:
URI规范:[scheme:]schemeSpecificPart[#fragment]
可选部分:[…] ,它与:和#可以包含在[]标识符内。
包含[scheme:]的称为绝对URI,否则成为相对URI。
绝对URI schemeSpecificPart部分如果不是以/开头,我们从就称为不透明的URI。如:
对于绝对透明的URI和相对的URI都是分层的。如:
http://java.sun.com/index.html
http://www.cnblogs.com/java/net/Socket.html#Socket()
一个分层的URI schemeSpecificPart部分有如下结构:
[//authority][path][?query]
基于服务器的authority部分可以采用以下形式:
[user-info@]host[:port]
prot 为整数。具体结构请参考RFC 2396,
Java可以通过URI类的方法方便获取这些结构:
GetScheme,getSchemeSpecificPart,getAuthority,getUserInfo,getHost,getPort,getPath
GetQuery,getFragment
同时URI类,还支持两个路径的绝对化和相对化,如下
relative = base.relativize(combined);
combined = base.resolve(relative);
建立URL
如果相对Web上某个资源获取更多的控制,应该使用URLConnection类,它可以比URL类获取对资源更多的控制。
在建立URL连接与传输的时候必须严格按照以下步骤去执行。
1.获取URLConnection对象(URL类)
URLConnection connection = url.OpenConnection();
2.设置请求属性
setDoOutput(默输出流是关闭的)、setRequestProperty、setConnectTimeout、setReadTimeout
setIfModifiedSince(applets)、setUseCaches(applets)、setAllowUserInteraction(applets)
对于setRequestProperty设置http请求头属性的具体格式,详细参考RFC2616
3.远程连接资源
connection.connect();
4.远程连接URL后可以,访问header information。
可以用getHeaderFieldKey ,getHeaderField,以迭代的方式去访问, JDK 1.4以后可以通过getHeaderFields获取Map<String,List<String>> headerFields Map。同时还提供了一些便于访问的常用方法。
GetContentType、getContentLength、getContentEncoding
GetDate、getExpiration、getLastModified
5.获取URL流。
GetInputStream(与url.OpenStream相同)。
提交表单数据
在html中我们可以通过GET/POST命令向Web Server服务器提交数据。
GET命令URL如下:
http://host/script?parameters
对于GET命令只需要对于针对服务器上的对象的脚本程序发送指定的参数即可(参数个数受限制),每对参数都是name=value的形式,
参数之间用&符号分割,如果参数需要按照如下方式进行编码:
对于数字和字母,编码不变;空格用+替换;其它以外的字符用%后面跟一个两位的十六进制替换。如:“S. Main”替换为“S%2e+Main”
为了方便程序员Java提供了URLEncoder,URLDecoder对URL编码进行编码和解码。
POST命令URL如下:
http://host/script
POST命令不需要加任何的参数,只需要URL类通过脚本地址获取URLConnection,然后获取输出流即可(GetOutPutStream),
然后发送scirpt需要的参数,发送的参数方式和GET的参数一样。发送完所需的参数,我们可以通过getInputStream返回服务器返回的内容。
如果服务器出现错误或异常,可以通过添加try catch{}捕获,具体错误内容可以通过URLConnection对象获取:
InputStream err = ((HttpURLConnection) connection).getErrorStream();