java网络编程(上)

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块中,当出现了异常,可以转到其他页面,而不是直接显示错误的信息

    ?

时间: 2024-10-11 03:28:52

java网络编程(上)的相关文章

用java网络编程中的TCP方式上传文本文件及出现的小问题

自己今天刚学java网络编程中的TCP传输,要用TCP传输文件时,自己也是遇到了一些问题,抽空把它整理了一下,供自己以后参考使用. 首先在这个程序中,我用一个客户端,一个服务端,从客户端上传一个文本文件给服务端,服务端接收数据并显示“上传成功”给客户端. 客户端: 1 import java.io.BufferedReader; 2 import java.io.FileReader; 3 import java.io.IOException; 4 import java.io.InputStr

Java网络编程(tcp在服务器上应用多线程)

package org.tcp; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.Socket; public class EchoThread implements Runnable { private Socket client = null; public EchoThread(Socket client){ this.c

java网络编程serversocket

转载:http://www.blogjava.net/landon/archive/2013/07/24/401911.html Java网络编程精解笔记3:ServerSocket详解ServerSocket用法详解 1.C/S模式中,Server需要创建特定端口的ServerSocket.->其负责接收client连接请求. 2.线程池->包括一个工作队列和若干工作线程->工作线程不断的从工作队列中取出任务并执行.-->java.util.concurrent->线程池

java网络编程socket解析

转载:http://www.blogjava.net/landon/archive/2013/07/02/401137.html Java网络编程精解笔记2:Socket详解 Socket用法详解 在C/S通信模式中,client需要主动创建于server连接的Socket(套接字).服务器端收到了客户端的连接请求,也会创建与客户连接的Socket.Socket可看做是通信两端的收发器.server与client都通过Socket来收发数据. 1.构造Socket 1.Socket() 2.So

20145331实验五 Java网络编程及安全

实验五 Java网络编程及安全 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统 4.结队伙伴:20145333赵嘉鑫 博客地址:http://home.cnblogs.com/u/5301z/ 5.分工:自己负责服务端,伙伴负责客户端 实验要求 1.基于Java Socket实现安全传输 2.基于TCP实现客户端和服务器,结对编程一人负责客户端,一人负责服务器 3.使用Git进行版本控制 4.选择对称算法进行数据加解密. 5.选择非对称算法对对称加密密

20145301实验五 Java网络编程及安全

北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1453 指导教师:娄嘉鹏 实验日期:2016.05.06 18:30-21:30 实验名称:实验五 Java网络编程 实验内容 1.用书上的TCP代码,实现服务器与客户端. 2.客户端与服务器连接 3.客户端中输入明文,利用DES算法加密,DES的秘钥用RSA公钥密码中服务器的公钥加密,计算明文的Hash函数值,一起传送给客户端 4.客户端用RSA公钥密码中服务器的私钥解密DES的,秘钥,用秘钥对密文进行解密,得出明文.计算

实验五 Java网络编程及安全

北京电子科技学院 实      验      报      告 课程:移动平台应用开发实践  班级:201592   姓名:曾俊宏  学号:20159210 成绩:___________  指导老师:娄嘉鹏    实验日期 :2015.10.25 实验名称:                          Java 网络编程及安全 实验内容:      1.掌握 Socket程序的编写    2.掌握密码技术的使用    3.设计安全传输系统 我的实验搭档是蔡斌思    http://www.

java网络编程socket\server\TCP笔记(转)

java网络编程socket\server\TCP笔记(转) 2012-12-14 08:30:04|  分类: Socket |  标签:java  |举报|字号 订阅 1 TCP的开销 a  连接协商三次握手,c->syn->s,s->syn ack->c, c->ack->s b  关闭协商四次握手,c->fin->s, s->ack-c,s->fin->c,c->ack->s c  保持数据有序,响应确认等计算开销 d

java网络编程与安全

北京电子科技学院(BESTI) 实     验    报     告 课程:JAVA程序设计  班级:1253   姓名:魏昊卿  小组伙伴:杨舒雯 学号:20135203   伙伴:20135324 成绩:             指导教师:娄嘉鹏          实验日期:2015.6.09 实验密级:  无     预习程度:            实验时间15:30~18:00 仪器组次:         必修/选修:选修                 实验序号:04 实验名称:ja

实验五Java网络编程及安全——20135337朱荟潼

实验五 Java网络编程及安全 结对伙伴:20135317韩玉琪(负责服务器方)http://www.cnblogs.com/hyq20135317/p/4567241.html 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全 实验步骤 1.信息安全传送: 发送方A——————>接收方B A加密时,用B的公钥 B解密时,用B的私钥 发送方A对信息(明文)采用DES密钥加密,使用RSA加密前面的DES密钥信息,最终将混合信息进行传递.同时用hash函数将明文进行