网络编程

来源:互联网 发布:淘宝护肤品有真的吗 编辑:程序博客网 时间:2024/06/12 00:32

一、InetAddress类

代表IP地址,没有提供构造器,通过以下俩个方法获取InetAddress实例:
  • getByName(String host):根据主机获取对应的InetAddress对象
  • getByAddress(byte[] addr):根据原始IP地址获取对应的InetAddress对象

二、URLDecoder和URLEncoder

用于普通字符串和application/x-www-form-urlencoded MIME字符串之间的相互转换

三、URL和URLConnection

示例:向Web站点发送GET请求、POST请求,并从Web站点取得响应
public class GetPostTest {


// 向指定URL发送GET方式请求
public static String sendGet(String url, String param) throws Exception {
String result = "";
String urlName = url + "?" + param;
URL realUrl = new URL(urlName);
// 打开和URL之间的连接
URLConnection conn = realUrl.openConnection();
// 设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "keep-Alive");
conn.setRequestProperty("user-agent", "Mozilla/5.0 (Windows NT 6.1) "
+ "AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4");
// 建立实际的连接
conn.connect();
// 获取所有的响应头字段
Map<String, List<String>> map = conn.getHeaderFields();
// 遍历所有的响应头字段
for (String key : map.keySet()) {
System.out.println(key + "-----" + map.get(key));
}
// 定义缓冲输入流来读取URL响应
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
String line;
while ((line = in.readLine()) != null) {
result = "\n" + line;
}
return result;
}

// 向指定URL发送POST请求
public static String sendPost(String url, String param) throws Exception {
String result = "";
URL realUrl = new URL(url);
// 打开和URL之间的连接
URLConnection conn = realUrl.openConnection();
// 设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "keep-Alive");
conn.setRequestProperty("user-agent", "Mozilla/5.0 (Windows NT 6.1) "
+ "AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4");
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
// 获取URLConnection对象对应的输出流
PrintWriter out = new PrintWriter(conn.getOutputStream());
out.print(param);
out.flush();
// 定义缓冲输入流来读取URL响应
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
String line;
while ((line = in.readLine()) != null) {
result = "\n" + line;
}
return result;
}

public static void main(String[] args) throws Exception {
// 发送get请求
String s = GetPostTest.sendGet("http://localhost:8888/abc/a.jsp", null);
System.out.println(s);
// 发送post请求
String s1 = GetPostTest.sendPost("http://localhost:8888/abc/a.jsp", "name=crazyit.org&pass=leegang");
System.out.println(s1);
}
}

Java NIO提供了与标准IO不同的IO工作方式: 
  • Channels and Buffers(通道和缓冲区):标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。
  • Asynchronous IO(异步IO):Java NIO可以让你异步的使用IO,例如:当线程从通道读取数据到缓冲区时,线程还是可以进行其他事情。当数据被写入到缓冲区时,线程可以继续处理它。从缓冲区写入通道也类似。
  • Selectors(选择器):Java NIO引入了选择器的概念,选择器用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个的线程可以监听多个数据通道。

NIO vs IO区别

NIO vs IO之间的理念上面的区别(NIO将阻塞交给了后台线程执行)
  • IO是面向流的,NIO是面向缓冲区的
    • Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方;
    • NIO则能前后移动流中的数据,因为是面向缓冲区的
  • IO流是阻塞的,NIO流是不阻塞的
    • Java IO的各种流是阻塞的。这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了
    • Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取NIO可让您只使用一个(或几个)单线程管理多个通道(网络连接或文件),但付出的代价是解析数据可能会比从一个阻塞流中读取数据更复杂。 
    • 非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。
  • 选择器
    • Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。