1.非阻塞方式的Socket编程:
传统阻塞方式的Socket编程,在读取或者写入数据时,TCP程序会阻塞直到客户端和服务端成功连接,UDP程序会阻塞直到读取到数据或写入数据。阻塞方式会影响程序性能,JDK5之后的NIO引入了非阻塞方式的Socket编程,非阻塞方式的Socket编程主要是使用Socket通道和Selector通道选择器,将Socket通道注册到通道选择器上,通过通道选择器选择通道已经准备好的事件的进行相应操作。
NIO socket简单例子如下:
import java.net.*;
import java.nio.channels.*;
import java.util.*;
import java.io.*;
public class NIOSocket{
private static final int CLINET_PORT = 10200;
private static final int SEVER_PORT = 10201;
//面向流的连接套接字的可选择通道
private SocketChannel ch;
//通道选择器
private Selector sel;
public static void main(String[] args) throws IOException{
//打开套接字通道
ch = SocketChannel.open();
//打开一个选择器
sel = Selector.open();
try{
//获取与套接字通道关联的套接字,并将该套接字绑定到本机指定端口
ch.socket().bind(new InetSocketAddress(CLINET_PORT));
//调整此通道为非阻塞模式
ch.configureBlocking(false);
//为通道选择器注册通道,并指定操作的选择键集
ch.register(sel, SelectionKey.OP_READ | SelectionKey.OP_WRITE |
SelectionKey.OP_CONNECT);
//选择通道上注册的事件,其相应通道已为I/O操作准备就绪
sel.select();
//返回选择器的已选择键集
Iterator it = sel.selectedKeys().iterator();
while(it.hasNext()){
//获取通道的选择器的键
SelectionKey key = (SelectionKey)it.next();
it.remove();
//如果该通道已经准备好套接字连接
if(ke