点击关注公众号,Java干货及时送达
关于java网络编程我们都非常熟悉TCP/IP协议,关于URL我么也都知道他就是家喻户晓的网址,那么我们对URL的了解可能也就到此为止了,除了知道他是网址还知道什么呢?
URL其实是一种资源
URL代表的是一种资源,它使用的是统一资源定位格式,形如:http://baidu.com,其实我们还可以用URL来构造对象的,使用字符串吗?不是的,java中有大量的构造函数允许使用一个个的分串来指定URL,有了URL对象就可以通过几个不用的方法来获取URL对应的内容,没错,我说的就是网页:
import java.net.*;
import java.io.*;
public class GetINt
{
public static void main(String [] args) throws Exception
{
URL url=new URL(args[0]);
InputStream html=url.openStream();
int c;
do
{
c=html.read();
if(c!=-1)
{
System.out.print({char}c);
}while(c!=-1);
}
}
}
或许,这是你之前没有听说过的:URLConnection
一般静态的操作就都是很容易的,使用一个URL对象读取一个URL简直不要太容易,刚才说的静态是我自己起的,其实并没有这个说法,而是我联想到数据结构,像读取这样的操作都是静态的 ,于是我在这里也算是做相同的比喻;
如果你想对HTTP事务做更多的控制呢?,比如说我们肯定需要往服务器提交一些数据,需要URL对象的,openConnection函数,这个函数可以返回一个URLConnection对象,如果URL使用了HTTP协议,那么URLConnection对象会返回一个URLConnection的子类:HttpURLConnection;
import java.net.*;
import java.io.*;
public class Handin
{
public static void main(String [] args) throws Exception
{
URL url=new URL(""http//com.cadca.com"");//网址我瞎编的
HttpURLConnection con=(HttpURLConnection)url.openConnection();
int c;
con.setDoInput(true);
con.setDoOutput(true);
con.setrequestMethod("POST");
con.setRequestProperty("Content-type","application/X-WWW-form-urlencoded");
con.connect();
PrintWriter pri=new PrintWriter{
new OutputStreamWriter{con.getOutputStream(),"12312",true}
pri.print("sasd"+URLEncoder.encode(args[0]+'dasda'));
pri.flush();
System.out.println(con.getResponseMessage());
InputStream in=con.getInputStream();
do{
char x;
c=in.read();
x=(char)c;
if(c!=-1)
{
System.out.print(x);
}while(c!=-1);
}
}
}
关于HttpURLConnection,获取HttpURLConnection对象只能是用http://URL(注意我这里只是写了一个格式而已)来创建,并调用HttpURLConnection对象的openConnection函数,然后把返回的URLConnection值赋给HttpURLConnection;
谁是幕后推手?
URL和URLConnection都是指派URLStreamHandler和URLConnection来干活,经过封装之后,URL对象会检查他的URL协议端口,然后调用URLStreamHandlerFactory的一个对象,这个对象主要用于创建URLStreamHandler子类,使得与指定的协议相符合;
子类URLStreamHandler创建一个相应的URLConnection对象,也解析URL,这样你可以定义用户化URL格式,对象URLConnection通常都是和服务器打交道的;
import java.net.*;
import java.io.*;
public class TimeURLConnection extends URLConnection
{
private Socket con;
public final static int de=13;
public TimeURLConnection void connect() throws IOException
{
if(!=connected)
{
int port=url.getPort();
if(port<0) port=de;
con=new Socket(url.getHost(),port);
connected=true;
}
}
public synchronized InputStream getInputStream() throws IOException
{
connect();
return con.getInputStream();
}
}
总结
URL是众多我们熟悉而又陌生的技术之一,接触到一种技术,就应该深入进去,来深挖他背后还有什么别的有趣的技术,也就是这项技术是由哪些另外的技术支撑起来的,这可以让我们更好的了解和使用。