InetAddress:
获取InetAddress的方式:
getByName(String name) 如果是主机名,必须正确
getByAddress(byte[] addr) 格式要正确
getByAddress(String host,byte[] addr) addr格式必须正确
getAllByName(String host) 如果是主机名,必须正确
getLocalHost()
当时ip地址构成的InetAddress时,getAddress和getHostAddress不会请求DNS,但是getHostName和getCanonicalHostName()需要请求;同理,当为域名构建的InetAddress,在构建时就会请求DNS服务器,同时把address请求下来。所以所有的都不会再请求DNS
getHostName(); 如果没有主机名则返回ip四段格式字符串
getCanonicalHostName() 同上,不过第一次获取时都是请求DNS
getAddress()--byte[] 通过这个可以判断时ipv4还是ipv6
getHostAddress 返回ip地址的字符串
测试可达:
即是否可以建立网络连接。
isReachable(int timeout)
isReachable(NetworkInterface interface,int ttl,int timeo)
子类:Inet4Address和Inet6Address
NetworkInterface
网络接口
获取方法:getByName
getByInetAddress
getInetAddresses 枚举
每个网络接口可能对应多个ip,
URL和URI
URL(Uniform Resource Locators)
URI(Uniform Resource Identifier)
URN(Uniform Resource Name)
URL是最常见的URI,URI可以由资源的网络位置来标识资源,也可以由资源的名字、编号或其他特性来标识。
URL
既能标识资源,又能获取资源。
获取方法:URL(String url)
URL(String protocol,String hostname,String file)
URL(String protocol,String host,int port,String file)
URL(URL base,String relative)
会检查协议是否存在,如果不正确,抛异常
获取数据:
InputStream openStream()
URLConnection openConnection()
URLConnection openConnection(Proxy proxy)
Object getContent()
Object getContent(Class[] classes)
openStream():
完成必要的握手,返回一个流,不包含任何首部或协议相关信息
openConnection():
为指定的URL打开一个socket,返回URLConnection,这个URLConnection对象表示一个网络资源的打开的连接。可以通过这个对象进行读或者写。
getContent():
如果URL指示某种文本,返回的对象是某种InputStream,如果指示的是一个图像,返回一个ImageProducer.这两种不同的类有一个共同点,他们本身并不是数据对象,而是一种途径,程序可以通过他们构造数据对象。
URL重写了equals和hashCode方法。
当且仅当两个URL指向相同的资源,有相同的片段标识符和查询字符串,才会认为这两个URL是相等的。而且equals会尝试用DNS解析主机,来判断两个主机是否相同,所以会阻塞。
toURI()方法
URI
toURL()
equals方法不是阻塞的。uri会转义,比较前不解析。
toString()是没有编码的时候的。
toASCIIString()是编码后的。
URLEncoder和URLDecoder
由于在url中会出现在不同系统中有歧义的字符,所以对于这些字符需要转义,但是URL类不自动编码或解码。
HTTP
包括 首部行,首部,消息体
超文本传输协议,定义了客户端和服务器端通信的标准,是一种数据格式。顶一个web客户端如何与服务器对话,以及数据如何从服务器传回客户端
200 成功,300重定向 400 客户端错误 500 服务器端错误
Socket
连接远程机器,发送数据,接受数据,关闭连接,绑定端口,监听入站数据,在绑定端口上接受来自远程机器的连接。
客户端Socket
程序用构造函数创建一个新的Socket,
Socket尝试连接远程主机
一旦建立连接,本地和远程主机就从这个socket得到输入流和输出流。全双工的。
Socket s=new Socket(“www.baidu.com”,21);
这不只是创建一个Socket,同时会建立网络连接。有可能连接失败抛异常的
socket.getInputstream()
socket.getOutputstream()
服务端Socket
ServerSocket
ServerSocket server=new ServerSocket(13)
Socket connection=server.accept();
UDP Socket
DatagramPacket
DatagramSocket 客户端和服务端都是用这个
datagram
NIO
传统的服务器端:
一个socket连接对应一个输入输出通道,一个输入输出通道对应一个线程,这样cpu负担比较高。
所以我们能看出不必像原先那样开大量的线程,然后让线程傻傻的等待。而NIO不必,通道已经由一个线程建立好了,有事就说话,说了就去做,而且在一个线程中建立了多个通道,可以同时做很多事情,不会像原先那样开辟多个线程,耗费CPU资源,关系是1对多的。