InetAddress
InetAddress类用于封装数字IP地址及对应的域名。使用IP主机的名称与这个类进行交互,与使用IP地址相比,使用IP主机名称更方法、也更容易理解。InetAddress类在内部隐藏了数字。InetAddress类可以同时处理IPv4和IPv6地址
方法 |
描述 |
static InetAddress getLocalHost() |
返回本地主叫的InetAddress对象 |
static InetAddress getByName(String hostName) |
根据传递过来的主机名返回InetAddress对象,如果无法解析主机名,就会抛出UnknowHostExcpetion |
static InetAddress[] getAllByName(String hostName) |
根据传递过来的主机名返回一组InetAddress对象数组,该数组表示解析特定名称后得到的所有地址。如果不能解析出至少一个地址,该方法会抛出UnknowHostException异常 |
static InetAddress getByAddress(byte[] addr) |
根据ip地址获取InetAddress对象 |
static InetAddress getByAddress(String host, byte[] addr) |
根据ip地址获取InetAddress对象 |
boolean equals(Object other) |
如果该对象与other对象具有相同的Inernet地址,就返回true |
byte[] getAddress() |
以网络字节序返回一个字节数组,表示该地址的IP地址 |
String getHostAddress() |
返回一个字符串,表示与InetAddress对象关联的主机地址 |
String getHostName() |
返回一个字符串,表示与InetAddress对象关联的主机名 |
boolean isMulticastAddress() |
如果该地址是一个多播地址,就返回true;否则返回false |
String toString() |
返回InetAddress的字符串描述 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| import java.net.InetAddress; import java.net.UnknownHostException;
public class LearnInetAddress1 { public static void main(String args[]) throws UnknownHostException { InetAddress address = InetAddress.getLocalHost(); System.out.println(address); address = InetAddress.getByName("www.baidu.com"); System.out.println(address); InetAddress arrAddress[] = InetAddress.getAllByName("www.163.com"); for(int i = 0; i < arrAddress.length; ++i) { System.out.println(arrAddress[i]); } } }
|
Inet4Address
Inet4Address是InetAddress的子类,表示传统风格的IPv4地址。
Inet6Address
Inet6Address是InetAddress的子类,表示新风格的IPv6地址
TCP/IP套接字
TCP/IP套接字用于Internet主机之间实现可靠的、双向的、持续的、点对点的、基于流的连接。在Java中,有两种类型的IPC套接字。一种用于服务器,一种用于客户端。ServerSocket类被设计成“监听者”,等待客户端进行连接,在这之前什么也不做。因此ServerSocket用于服务器。Socket类用于客户端,它被设计成用于连接到服务器套接字并发起协议交互。
Socket
创建Socket对象会隐式地建立客户端和服务器之间的连接,没有显示提供建立连接细节的方法和构造函数。
方法 |
描述 |
Socket(String hostName, int port) |
创建连接到命名主机和端口的套接字 |
Socket(InetAddress ipAddress, int port) |
使用已存在的InetAddress对象和端口创建套接字 |
方法 |
描述 |
InetAddress getInetAddress() |
返回与调用Socket对象关联的InetAddress对象。如果套接字没有连接,就返回null |
int getPort() |
返回调用Socket对象连接到远程端口。如果套接字没有连接,就返回0 |
int getLocalPort() |
返回绑定到调用Socket对象的本地端口。如果套接字没有连接,就返回-1 |
InputStream getInputStream() |
返回与调用套接字关联的InputStream对象,如果套接字丢失连接变得无效,会抛出IOException异常 |
OutputStream getOutputStream() |
返回与调用套接字关联的OutputStream对象,如果套接字丢失连接变得无效,会抛出IOException异常 |
void connect(SocketAddress endpoint) |
连接到指定的网络地址 |
void connect(SocketAddress endpoint, int timeout) |
超时的方式对指定地址进行连接 |
boolean isConnected() |
如果套接字连接到服务器,返回true;否则返回false |
boolean isBound() |
如果套接字被帮到某个地址,该方法返回true;否则返回false |
boolean isClosed() |
如果套接字已经关闭,该方法返回true;否则返回false |
void close() |
关闭套接字,同时关闭与之关联的IO流 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| import java.io.InputStream; import java.io.OutputStream; import java.net.Socket;
public class LearnSocket1 { public static void main(String args[]) throws Exception { int c ; try(Socket s = new Socket("whois.internic.net", 43)){ InputStream in = s.getInputStream(); OutputStream out = s.getOutputStream(); String str = "www.baidu.com\n"; byte buf[] = str.getBytes(); out.write(buf); while((c = in.read()) != -1) { System.out.print((char)c); } } } }
|
ServerSocket
ServerSocket类用于创建服务器,在发布的端口上监听与之连接的本地或远程客户端程序。
方法 |
描述 |
ServerSocket(int port) |
在指定的端口上创建服务器套接字,队列长度为50 |
ServerSocket(int port, int maxQueue) |
在指定的端口上创建服务器套接字,最大队列长度为maxQueue |
ServerSocket(int port, int maxQueue, InetAddress localAddress) |
在指定的端口上创建服务器套接字,最大队列长度为maxQueue。在多宿主主机上,localAddress指定了套接字绑定的IP地址 |
方法 |
描述 |
Socket accept() |
阻塞方式等待客户端连接,返回客户端连接的Socket对象 |
UDP
数据报是在两台机器之间传递的信息包。一旦将数据报释放给期望的目标,就既不能保证到达,也不能保证有人会在目的捕获到。同样,当接收到数据报时,既不能保证数据在传输过程中没有被破坏,也不能保证发送者仍然在等待接收响应。
Java通过两个类在UDP协议之上实现数据报:DatagramPacket对象是数据封装器,而DatagramSocket对象是用于发送和接收DatagramPacket对象的机制。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress;
public class LearnUDP1 { public static int serverPort = 998; public static int clientPort = 999; public static int buffer_size = 1024; public static DatagramSocket ds; public static byte buffer[] = new byte[buffer_size]; public static void TheServer() throws Exception { int pos = 0; while(true) { int c = System.in.read(); switch(c) { case -1: System.out.println("Server Quits"); ds.close(); break; case '\r': break; case '\n': ds.send(new DatagramPacket(buffer, pos, InetAddress.getLocalHost(), clientPort)); pos = 0; break; default: buffer[pos++] = (byte)c; } } } public static void TheClient() throws Exception { while(true) { DatagramPacket p = new DatagramPacket(buffer, buffer.length); ds.receive(p); System.out.println(new String(p.getData(), 0, p.getLength())); } } public static void main(String args[]) throws Exception { if(args.length == 1) { ds = new DatagramSocket(serverPort); TheServer(); } else { ds = new DatagramSocket(clientPort); TheClient(); } } }
|
DatagramSocket
方法 |
描述 |
DatagramSocket() |
创建绑定到本地计算机上任意未使用端口的DatagramSocket对象 |
DatagramSocket(int port) |
创建绑定到port指定端口的DatagramSocket对象 |
DatagramSocket(int port, InetAddress ipAddress) |
创建绑定到指定端口和InetAddress对象的DatagramSocket对象 |
DatagramSocket(SocketAddress address) |
创建绑定到指定SocketAddress对象DatagramSocket对象 |
方法 |
描述 |
void send(DatagramPacket packet) |
向packet指定的端口发送数据报 |
void receive(DatagramPacket packet) |
等待从packet指定的端口结束数据报并返回结果 |
void close() |
关闭套接字 |
InetAddress getInetAddress() |
如果套接字已经连接,就返回地址;否则返回null |
int getLocalPort() |
返回本地端口号 |
int getPort() |
返回套接字连接的端口号。如果套接字没有连接到端口,就返回-1 |
boolean isBound() |
如果套接字被绑定到某个地址,就返回true;否则返回false |
boolean isConnected() |
如果套接字已经连接到某台服务器,就返回true;否则返回false |
void setSoTimeout(int millis) |
将超时周期设置成millis传递的毫秒数 |
DatagramPacket
方法 |
描述 |
DatagramPacket(byte data[], int size) |
指定接收数据的缓冲区和包的大小,用于通过DatagramSocket对象接收数据 |
DatagramPacket(byte data[], int offset, int size) |
允许指定缓冲区的偏移量,从此偏移量保存数据 |
DatagramPacket(byte data[], int size, InetAddress ipAddress, int port) |
指定目标地址可端口,DatagramSocket对象使用该地址和端口确定将数据包发送到何处 |
DatagramPacket(byte data[], int offset, int size, InetAddress ipAddress, int port) |
指定的数据偏移位置传递数据包 |
方法 |
描述 |
InetAddress getAddress() |
(为将要接收的数据报)返回源的地址或(为将要发送的数据报)返回目的地的地址 |
byte[] getData() |
返回在数据报中包含的数据的字节数组。同用于在接收数据报之后,从数据报中接收数据 |
int getLength() |
返回字节数组(由getData()方法返回)中包含的有效数据的长度,可能不等于整个字节数组的长度 |
int getOffset() |
返回数据的起始索引 |
int getPort() |
返回端口号 |
void setAddress(InetAddress ipAddress) |
设置包的目的地址,目的地址是由ipAddress指定的 |
void setData(byte[] data) |
将数据设置为data,将偏移量设置为0,将长度设置为data中字节的数量 |
void setData(byte[] data, int idx, int size) |
将数设置为data,将偏移量设置为idx,将长度设置为size |
void setLength(int size) |
将包的长度设置为size |
void setPort(int port) |
将端口设置为port |
URL
方法 |
描述 |
URL(String urlSpecifier) |
|
URL(String protocolName, String hostName, int port, String path) |
|
URL(String protocolName, String hostName, String path) |
|
URL(URL urlObj, String urlSpecifier) |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| import java.net.MalformedURLException; import java.net.URL;
public class LearnUrl1 { public static void main(String args[]) throws MalformedURLException { URL url = new URL("http://www.baidu.com"); System.out.println("protocol :" + url.getProtocol()); System.out.println("Port:" + url.getPort()); System.out.println("Host:" + url.getHost()); System.out.println("File:" + url.getFile()); System.out.println("Ext:" + url.toExternalForm()); } }
|
URLConnection
URLConnection是用于访问远程资源属性的通用类。一旦构造一个到远程服务器的连接,就可以使用URLConnection对象在实际传送远程对象到本地之前,检测远程对象的属性。这些属性是HTTP协议规范提供的,并且只对使用HTTP协议的URL对象有意义。
方法 |
描述 |
int getContentLength() |
返回与资源关联的内容的字节大小。如果长度不可得,就返回-1 |
long getContentLengthLong() |
返回与资源关联的内容的字节大小。如果长度不可得,就返回-1 |
String getContentType() |
返回在资源中找到的内容的类型,也就是content-type标题的字段的值。如果内容类型不可得,就返回null |
long getDate() |
返回响应的时间和日期,使用从1970年1月1日(GMT时间)到现在经历的毫秒数的表示 |
long getExpiration() |
返回资源种植的时间和日期,使用从1970年1月1日(GMT时间)到现在经历的毫秒数表示。如果有效日期不可得,就返回0 |
String getHeaderField(int idx) |
返回idx索引位置标题字段的值。如果idx的值超出字段的数量,就返回null |
String getHeaderField(String fieldName) |
返回标题字段的值,名称由fieldName指定。如果没有找到指定的名称,就返回null |
Stirng getHeaderFieldKey(int idx) |
返回idx索引位置标题字体的键。如果idx的值超出字段的数量,就返回null |
Map<String,List> getHeaderFields() |
返回包含所有标题字段和值的映射 |
long getLastModified() |
返回最后一次修改资源的时间和日期,使用从1970年1月1日(GMT时间)到现在经历的毫秒数表示。如果最后一次修改的日期不可得,就返回0 |
InputStream getInputStream() |
返回链接到资源的InputStream对象。可以使用这个流获取资源的内容 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import java.util.Date;
public class LearnURLConnection1 { public static void main(String args[]) throws Exception { int c; URL url = new URL("http://www.baidu.com"); URLConnection urlCon = url.openConnection(); long d = urlCon.getDate(); if(d == 0) { System.out.println("No date information"); } else { System.out.println("Date:" + new Date(d)); } long len = urlCon.getContentLengthLong(); if(len != 0) { System.out.println("====content ===="); InputStream input = urlCon.getInputStream(); while((c = input.read()) != -1) { System.out.print((char)c); } input.close(); } else { System.out.println("No content available"); } } }
|
HttpURLConnection
HttpURLConnection用来支撑HTTP连接。
方法 |
描述 |
static boolean getFollowRedirects() |
如果重定向是自动进行的,就返回true;否则返回false。这个特性是默认打开的 |
String getRequestMethod() |
返回一个字符串,表示生成URL请求的方式。默认为GET,也可以是其他方式。例如POST |
int getResponseCode() |
返回HTTP响应代码。如果不能获得响应代码,就返回-1。如果连接失败,那么会抛出IOException异常 |
Strng getResponseMessage() |
返回与响应代码关联的响应消息。如果消息不可得,就返回null。如果连接失败,那么会抛出IOException异常 |
static void setFollowRedirects(boolean how) |
如果how为true,那么重定向是自动进行的。如果how为false,那么重定向不是自动进行的。默认情况下,重定向是自动进行的 |
void setRequestMethod(String how) |
将HTTP请求生成的方式设置成how指定的方式。默认方式是GET,但也可以是其他方式,例如POST.如果how无效,将会抛出ProtocolException异常 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import java.net.HttpURLConnection; import java.net.URL;
public class LearnHttpURLConnection1 { public static void main(String args[]) throws Exception { URL url = new URL("http://www.baidu.com"); HttpURLConnection urlCon = (HttpURLConnection)url.openConnection(); System.out.println("Request method is " + urlCon.getRequestMethod()); System.out.println("Response Message is " + urlCon.getResponseMessage()); } }
|
URI
URI类封装了统一资源标识符(Uniform Resource Identifier)。URI与URL类似。实际上,URL是URI的一个子集。URI代表定位资源的一种标准方式。URL还描述了如何访问资源。
Cookie