一、因特网地址
InetAddress类:实现主机名和因特网地址之间的转换。
InetAddress address=InetAddress.getByName(String);返回一个InetAddress实例
InetAddress[] address=InetAddress.getAllByName(host);获取所有主机的地址。
InetAddress address=InetAddress.getLocalHost();获取本地主机的地址。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUWYxYmZhR2MiNjY3QGMjFGZlNTOzUWZjJGO2YzM1MWMfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.gif)
View Code
结果为:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUWYxYmZhR2MiNjY3QGMjFGZlNTOzUWZjJGO2YzM1MWMfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.gif)
一、Socket(套接字)
连接原理:
Socket s=new Socket(ip,port);打开一个套接字,它是网络编程中的一个抽象概念,负责启动该程序内部和外部之间的通信。如果连接失败,将会抛出一个UnknownHostException异常;如果存才其他问题,将会抛出IOException异常。
有两种超时情况:
1):从套接字读取信息时,在有数据可供访问之前,读操作将会被堵塞。如类似in.nextLine();
解决办法:调用setSoTimeout方法设置一个超时值。即调用s.setSoTimeout(1000);
2):Socket(String host,int port)会一直堵塞,直到建立了到达机主的初始连接为止。(实例化Socket时会堵塞)
解决办法:先构建一个无连接的套接字,然后再使用一个超时来进行连接的方法。即s.connect(new InetSocketAddress(host,port),timeout);
它可以向客户端发送消息,一旦启动服务器程序,它便等待某个客户端连接到它的端口。ServerSocket用于建立套接字。
如果通过套接字发送文本,可以将流转换成扫描器和写入器。
最后要关闭连接进来的套接字。
一个简单的服务器向客户端发送数据报的例子1:
结果为:Feng:hello
例子2:简单的聊天设计
服务器端:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUWYxYmZhR2MiNjY3QGMjFGZlNTOzUWZjJGO2YzM1MWMfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.gif)
客户端:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUWYxYmZhR2MiNjY3QGMjFGZlNTOzUWZjJGO2YzM1MWMfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.gif)
当多个客户端连接到服务器时,要用到线程机制。每当程序建立一个新的套接字连接,也就是当调用accept时,将启动一个新的线程来处理服务器和该客户端之间的连接(一个服务器一个线程),而主程序将返回并等待下一个连接。即执行如下命令:
例子:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUWYxYmZhR2MiNjY3QGMjFGZlNTOzUWZjJGO2YzM1MWMfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUWYxYmZhR2MiNjY3QGMjFGZlNTOzUWZjJGO2YzM1MWMfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.gif)
当我们在向服务器发送数据时,但并不知道要传输多少数据。在向文件写数据时,我们需要在写入后关闭文件即可。但是,如果关闭了一个套接字,那么与服务器就立刻断开了,因而无法读取服务器响应了。用半关闭的方法解决上述问题。可以通过关闭一个套接字的输出流来表示发送给服务器的请求数据已经结束,但是必须保持输入流处于打开状态。
socket.shutdownOutput();关闭输出流。
例如:客户端发送hello给服务器后,关闭输出流,服务器收到后,关闭输入流,等待5秒后,向客户端发送ECHO hello。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUWYxYmZhR2MiNjY3QGMjFGZlNTOzUWZjJGO2YzM1MWMfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUWYxYmZhR2MiNjY3QGMjFGZlNTOzUWZjJGO2YzM1MWMfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.gif)
用户希望在任何时刻都可以中断套接字连接,可以考虑可中断套接字连接机制。java.nio包提供了SocketChannel类。
Socket(Channel channel)=SocketChanne.open(new InetSocketAddress(host,port));打开SocketChannel:
通道(channel)并没有与之关联的流。实际上,它所拥有的read和write方法都是通过使用Bufffer对象实现的。如果不想处理缓冲区,可以使用Scanner类从SocketChannel中读取信息。即:
Scanner in=new Scanner(channel);
通过调用静态方法Channels.newOutputStream,可以将通道转换成输出流。
OutputStream outStream=Channels.newOutputStream(channel);
三、获取Web数
1):URI:统一资源标识符,用于标识一个web资源,包含了两个部分。
(1)URL:统一资源定位符。能够精确的定位数据的URI
(2)URN:统一资源名称。除了URL的URI
在java中URI和URL是分开的两个类,URI类专门用于解析,URL用于通信。
2):URI的分类
绝对和相对:
(1)绝对URI是指有确定的协议。比如http,ftp。后面以/进行分隔
(2)相对URI是没有scheme的。
透明和不透明:
不透明URI是不能够被解析的URI。不透明URI是绝对URI。scheme后面的部分不是以/进行分割。
分层和不分层:
分层是绝对透明URI或相对URI。所有的网页端口都是80;
3):URI的作用
(1)解析:解析标识符并将它分解成各种不同的组成部分。
URI的格式:[scheme:]scheme-specific-part[#fragment]
scheme表示用的协议,可以是http\https\ftp\file等。
scheme-specific-part是其余部分
常用的方法:
getScheme()获得scheme;
getSchemeSpecificPart();
getPath()
getAuthority()
(2)转换:处理绝对标识符和相对标识符,实现转换。
URI类同时支持以下两个操作:relative和combined
示例代码:
任务1:取得特定网址的html代码。
任务2:分析地址信息。
任务3:绝对地址和相对地址转换
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUWYxYmZhR2MiNjY3QGMjFGZlNTOzUWZjJGO2YzM1MWMfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUWYxYmZhR2MiNjY3QGMjFGZlNTOzUWZjJGO2YzM1MWMfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.gif)
(2)Scanner in = new Scanner(url.openStream());
2)、当操作一个URLConnection对象时,注意以下内容:
URLConnection connection=url.openConnection();获得URLConnection对象。
connection.connect();连接远程资源
connection.getContentLength();
connection.getContentType();
connection.setDoOutput(true)获得输出流
connection.getOutputStream();
connection.getInputStream();
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUWYxYmZhR2MiNjY3QGMjFGZlNTOzUWZjJGO2YzM1MWMfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUWYxYmZhR2MiNjY3QGMjFGZlNTOzUWZjJGO2YzM1MWMfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.gif)
四、提交表单数据
我们知道了如何从一个Web服务器读取数据。那么,程序如何又再将数据返回给Web服务器和那些被Web服务器调用的程序呢?通过程序脚本技术可以实现Web服务器对程序的调用。如Java Servlet、JavaServer Face等。
在向Web服务器发送信息时,通常用到两个命令:get和post
(1)、get方法是直接把数据跟在url的后面,以name=value进行传输,
每个数据之间用&进行分割,value中的空格用+替换,非字母数字用%替换,并后跟两个16进制数,这种编码方式称为URL编码。URLEncoder和URLDecoder
(2)、post方法是通过URLConnection发送给服务器,编码方式和get一样。URLEncoder.encode(VALUE,"UTF-8");
一般在传输中文时会运用编码和解码。
具体的向服务器发送数据的过程:
1)、创建一个URLConnection对象。URL url=new URL(String);URLConnection connnection=url.openConnection();
2)、调用setDoOutput方法建立一个用于输出的连接。connection.setDoOutput(true);
3)、调用getOutputStream方法获得一个流。通过这个流可以向服务器发送数据。如果想要发送文本信息,可以将流包装在PrintWriter对象中。
即:PrintWriter out=new PrintWriter(connnect.getOutputStream());
4)、向服务器发送数据。out.print(name1+" "+URLEncoder.encode(value1,"UTF-8")+"&");
5)、关闭输出流。out.close();
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUWYxYmZhR2MiNjY3QGMjFGZlNTOzUWZjJGO2YzM1MWMfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.gif)
当神已无能为力,那便是魔渡众生