鸿 网 互 联 www.68idc.cn

当前位置 : 服务器租用 > 编程语言开发 > erlang > >

java网络编程(上)

来源:互联网 作者:佚名 时间:2016-07-17 21:13
Internet 地址 IPv4 32 位,4字节 IPv6 128位,16字节,共8区块,每个区块2字节 一个域名可以映射到多个ip地址,负载均衡,但每个时刻一个域名只能映射到一个;一个ip可以有多个域名。 一、InetAddress 包括一个主机名和一个ip地址 1.创建 静态方法:InetAdd

Internet 地址

  • IPv4 32 位,4字节

  • IPv6 128位,16字节,共8区块,每个区块2字节

  • 一个域名可以映射到多个ip地址,负载均衡,但每个时刻一个域名只能映射到一个;一个ip可以有多个域名。

一、InetAddress

  • 包括一个主机名和一个ip地址

1.创建

  • 静态方法:InetAddress.getByName(namestr)--实际上会建立与本地DNS服务器的一个连接,来查找名字和地址(如果有缓存,就不会建立网络连接).提供域名时直接解析,当提供ip时,只有当请求主机名(getHostName)时才会完成主机名的DNS查找

  • 静态方法:InetAddress.getAllByName(name)-- 会获取所有的地址

  • 静态方法:InetAddress.getByAddress(String,byte[])

2.获取方法

  • getHostName():只有在不知道主机名时才会DNS解析

  • getCanonicalHostName():知道主机名也会DNS解析

  • getAddress():返回一个byte数组,判断其长度可以得知是IPv4 还是IPv6

  • getHostAddress():返回四分段格式的ip地址

  • isReachable():判断是否可达(能否建立一个网络连接),尝试使用 traceoute,也就是 ICMP echo 请求查看地址是否可达

如何判断两个 InetAddress 是否相等

  • 只要其 ip 地址相同就相等


URL 与 URI

一、URL

  • 定义:Uniform Resoure Locator 统一资源定位器,可以标识一个资源在 Internet 上的位置

    1.URL类

    • URL类是一个类,保证的线程安全,其采用了策略模式来处理协议。

    • 构建:必须确保创建的URL是合法的

      ?

    •  <textarea tabindex="0" style="box-sizing: border-box; color: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit;font-size:undefined; line-height: inherit; font-family: inherit; margin: 0px; overflow: auto; position: absolute; padding: 0px; width: 1000px; height: 1em; outline: none;" spellcheck="false" autocorrect="off" autocapitalize="off"></textarea>
      public URL(String url) throws MalformedURLException // 只接受绝对URL
      public URL(String protoco,String hostName,String file) throws...//注意:第三个参数要以 "/" 开头,比如:new URL("http","www.baidu.com","/example/file"),默认端口设置为 -1 ,即使用协议的默认端口号
      public URL(String protoco,String hostName,int port,String file) throws...
      public URL(URL base,String relative) throws...//构建相对 URL
      ?
      //针对第四个
      URL u1 = new URL("http://www.baidu.com/example1/index1.jsp");
      //结果为http://www.baidu.com/example1/example2/index2.jsp
      URL u2 = new URL(u1,"example2/index2.jsp");
      //结果http://www.baidu.com/example2/index2.jsp
      URL u3 = new URL(u1,"/example2/index2.jsp");

      ?

  • 获取数据

     <textarea tabindex="0" style="box-sizing: border-box; color: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit;font-size:undefined; line-height: inherit; font-family: inherit; margin: 0px; overflow: auto; position: absolute; padding: 0px; width: 1000px; height: 1em; outline: none;" spellcheck="false" autocorrect="off" autocapitalize="off"></textarea>
      public InputStrean openStream() throws IOException//返回一个inputStream,若需要更多的控制,则使用下面的一个方法
      public URLConnection openConnection() throws IOException//为指定的URL打开一个socket,并返回一个 URLConnection对象(网络资源的打开的连接)
      public URLConnection openConnection(Proxy proxy) throws IOException//指定代理服务器传递连接
      public Object getContent() throws IOException//由它建立某种类型的对象,但是很难预测获得哪种对象
      public Object getContent(Class[] classes) throws IOException

      ?

  • URL组成:以 “ http://www.baidu.com/java/index.jsp?parameter=param#toc” 进行说明

    • 模式(协议):http,由方法 getProtocol()方法可获得

    • 授权机构:www.baidu.com,也可以由用户、主机、端口号组成,getHost、getPort、getFile

    • 路径:/java/index.jsp,getPath()

    • 片段标识符:toc,getRef()获得

    • 查询字符串:parameter=param,getQuery()获得

    • getFile:会返回 getPath()? getQuery()

  • 相等性:当且仅当两个URL指向相同的主机、端口号和路径上的相同资源,而且有相同的片段标识符合查询字符串,才认为这两个 URL 是相等的。其 equals方法会尝试 DNS 解析,URL的equals 方法是一个阻塞 I/O 操作(URI的equals方法不会阻塞)

    • 编码与解码

      • 编码URLEncoder:所有非字母数字的字符会转换为 % 序列(除空格、下划线、连字符、点号和星号),最好选用 utf-8 进行编码。注意:不能传入整个URL进行编码,必须各个分段进行编码,不然会把?=&/ 等符号一起编码

      • 解码URLDecoder:可以传入整个URI,因为其对非转义字符字符不做处理

二、URI

  • 定义:Uniform Resoure  Identifier 统一资源标识符,

  • 组成:模式:模式特定部分:片段;其中模式名要求使用 ASCII字符,而其他可以包含 Unicode 字符,有模式的URI是绝对URI,没有模式的URI是相对URI

  • 构建

     <textarea tabindex="0" style="box-sizing: border-box; color: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit;font-size:undefined; line-height: inherit; font-family: inherit; margin: 0px; overflow: auto; position: absolute; padding: 0px; width: 1000px; height: 1em; outline: none;" spellcheck="false" autocorrect="off" autocapitalize="off"></textarea>
    URI(String str) throws URISyntaxException
    URI(String scheme, String ssp, String fragment) throws... //省略模式就是相对URI
    URI(String scheme, String userInfo, String host, int port, String path, String query, String fragment) throws...
    URI(String scheme, String host, String path, String fragment) throws...
    URI(String scheme, String authority, String path, String query, String fragment) throws ...
  • 获取方法:

     <textarea tabindex="0" style="box-sizing: border-box; color: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit;font-size:undefined; line-height: inherit; font-family: inherit; margin: 0px; overflow: auto; position: absolute; padding: 0px; width: 1000px; height: 1em; outline: none;" spellcheck="false" autocorrect="off" autocapitalize="off"></textarea>
    //以下方法是获取解码过后的部分,意思就是实际表示的字符
    getAuthority();//获取授权机构
    getFragment();//获取片段标识
    getHost();//获取主机
    getPath();//获取文件路径
    getPort();//端口号
    getQuery();//查询字符
    getUserInfo();//用户信息
    ?
    //以下方法返回的是编码部分(字节)
    getRawAuthority();
    getRawFragement();
    getRawPath();
    getRawQuery();
    getRawUserInfo();
    ?
    //表示
    toString()//返回的是未编码形式
    toASCIIString()//返回的是编码形式
  • 比较

    • 比较模式时不需要考虑大小写,其中编码形式和未编码格式相比较是不等的

    • 如果模式一样,不透明的URI 大于 透明的URL,什么是透明?不是分层结构的(如:电话号码)

    • ?

三、URL 与 URI 的区别

  • 个人觉得URL和URI提供的方法 和 描述都差不多,但是不同点在于当构建URI的时候不指定模式就是相对URI,从这里可以看出:URI 和 URL 都定义了what the resource is,但是URL还定义了 how to get the resource,所以说 URL 是URI的一个子集

  • 当需要下载一个内容时,就该使用 URL 类,如果只是用来标识而不是获取,就该使用URI

    ?


URLConnection

  • 定义:URLConnection 是一个抽象类,指定了资源的活动链接,其与URL 的不同在于它提供了对http 首部的访问,还可以配置发送给服务器的请求参数,可以对服务器进行读取、写入数据。它是java的协议处理器,将处理协议的细节与处理特定数据类型分开,提供相应的用户接口,完成完整web浏览器所完成的其他操作。

  • 构建:由于其构造函数是 protected 权限,所以要么通过其子类来构建(必须实现 connect()方法,它建立与服务器的连接),要么通过 URL 的 openConnection()方法获得

  • 方法:

     <textarea tabindex="0" style="box-sizing: border-box; color: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit;font-size:undefined; line-height: inherit; font-family: inherit; margin: 0px; overflow: auto; position: absolute; padding: 0px; width: 1000px; height: 1em; outline: none;" spellcheck="false" autocorrect="off" autocapitalize="off"></textarea>
    public String getContentType();//返回内容类型
    public int getContentLength();//返回内容有多少字节,因为服务器并不总是在数据发送完后就立即关闭连接,所以需要根据长度进行读取相应的字节数。因为 int 的值最大为 21 亿 字节,所以提供了 getContentLengthLong()方法,返回的是一个long的数据类型
    public String getContentEncoding();//返回的是内容的编码形式,一般为 x-zip。字符编码方式由 Content-type 首部或文档内部的信息确定,支出如何将字符编码为字节。内容编码方式则支出字节如何编码为其他字节
    public long getDate();//返回一个 long,表示的是从 19700101 过去了多少毫秒发送,如果 http首部不包括就返回0
    public long getExpiration();//指出什么时候过期,表示从19700101 过去了多少毫秒过期,如果不包含这个字段就返回0
    public long getLastModified();//最后修改日期,也是从19700101开始计算,如果不包含就返回0
    ?
    //获取任意首部字段
    public String getHeaderField(String name);//注意一定要检查获取的值是否为 null
    public String getHeaderFieldKey(int n);//返回第n个首部字段的键,当 n 为 0 时就是返回的是null
    public String getHeaderFieldValue(int n);//返回第n个首部的字段的值,当 n为0时就是返回的是请求的第一行,也就是类似于 GET /index.jsp http 1.0

    ?

1.配置连接:

  • 以下属性都有对应的getter 与 setter 方法

  • url :创建过后不能被改变,可以通过 getURL 方法来获取这个字段的值

  • doInput:是否可以允许读取服务器

  • doOutput:是否可以写入到服务器,默认为false,只能在打开连接前设置

  • connected:是否已经连接,任何导致 URLConnection 连接的方法都会将这个变量设置为 true,包括 connect(),getInputStream(),getOutputStream()

  • useCaches:是否可以使用缓存

2.配置客户端请求 HTTP 首部

 <textarea tabindex="0" style="box-sizing: border-box; color: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit;font-size:undefined; line-height: inherit; font-family: inherit; margin: 0px; overflow: auto; position: absolute; padding: 0px; width: 1000px; height: 1em; outline: none;" spellcheck="false" autocorrect="off" autocapitalize="off"></textarea>
//名不能包含空白符,值不能包含任何换行符
public void setRequestProperty(String name,String value);//增加首部字段,允许一个名字多个值,值之间用逗号隔开,名不能包含空白符,值不能包含任何换行符
public String getRequestProperty();//返回所有首部中指定的字段值
public void addRequestProperty(String name,String value);//增加一个属性值

3.与服务器交互

 <textarea tabindex="0" style="box-sizing: border-box; color: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit;font-size:undefined; line-height: inherit; font-family: inherit; margin: 0px; overflow: auto; position: absolute; padding: 0px; width: 1000px; height: 1em; outline: none;" spellcheck="false" autocorrect="off" autocapitalize="off"></textarea>
public OutputStream getOutputStream();//返回一个 OutputStream,可以用来写入数据传给服务器,由于默认的doOutput设置为 false,所以要先设置为true,然后请求方法会有GET 变为 POST。由此,可以写入查询字符串,而不是附加到 URL
public InputStream getInputStream();//返回服务端的响应

4.HttpURLConnection

  • 创建:是URLConnection的抽象子类,所以可以先获取 URLConnection 然后再进行强转

  • 方法:

     <textarea tabindex="0" style="box-sizing: border-box; color: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit;font-size:undefined; line-height: inherit; font-family: inherit; margin: 0px; overflow: auto; position: absolute; padding: 0px; width: 1000px; height: 1em; outline: none;" spellcheck="false" autocorrect="off" autocapitalize="off"></textarea>
    public void setRequestMethod(String method) throws ProtocolException;//可以改变请求方法,方法的参数可以为:GET/POST/HEAD/PUT/DELETE/OPTIONS/TRACE
    public  abstract void discount();//因为TCP是持久连接,也就是可以通过一个连接可以发送多个请求,它会重用socket。需要用这个方法显示的关闭连接,当关闭了连接则流也会被关闭
    public int getResponseCode();//返回响应码
    public String getResponseMessage() throws IOException;//返回响应消息
    public InputStream getErrorStream();//这个方法可以放在 catch块中,当出现了异常,可以转到其他页面,而不是直接显示错误的信息

    ?


网友评论
<