1. InetAddress
public class UseInet {
public static void main(String[] args) throws UnknownHostException {
InetAddress address = InetAddress.getByName("www.baidu.com");
System.out.println(address);
InetAddress address2 = InetAddress.getByName("124.232.170.22");
System.out.println(address2.getHostName());
InetAddress[] allByName = InetAddress.getAllByName("www.baidu.com");
for (InetAddress addr : allByName) {
System.out.println(addr);
}
}
}
2. BIO
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket();
serverSocket.bind(new InetSocketAddress(10001));
Socket socket = serverSocket.accept();
try (ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream())) {
String userName = inputStream.readUTF();
System.out.println("Accept client message:" + userName);
outputStream.writeUTF("Hello," + userName);
outputStream.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (socket != null) {
socket.close();
}
serverSocket.close();
}
}
}
public class Client {
public static void main(String[] args) throws IOException {
InetSocketAddress addr = new InetSocketAddress("127.0.0.1", 10001);
Socket socket = null;
ObjectOutputStream output = null;
ObjectInputStream input = null;
try {
socket = new Socket();
socket.connect(addr);
output = new ObjectOutputStream(socket.getOutputStream());
input = new ObjectInputStream(socket.getInputStream());
output.writeUTF("Mark");
output.flush();
System.out.println(input.readUTF());
} finally {
if (socket != null) {
socket.close();
}
if (output != null) {
output.close();
}
if (input != null) {
input.close();
}
}
}
}
3. NIO
BIO 面向流,NIO 面向缓冲。
三大核心组件:Selector、Channel、Buffer
操作类型:SelectionKey
3.1 Buffer
重要属性:capacity、position、limit
public class AllocateBuffer {
public static void main(String[] args) {
OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
System.out.println("before allocate:" + osmxb.getFreePhysicalMemorySize());
/*堆上分配*/
ByteBuffer buffer = ByteBuffer.allocate(200000);
System.out.println("buffer = " + buffer);
System.out.println("after allocate:" + osmxb.getFreePhysicalMemorySize());
/* 这部分用的直接内存*/
ByteBuffer directBuffer = ByteBuffer.allocateDirect(200000);
System.out.println("directBuffer = " + directBuffer);
System.out.println("after direct allocate:" + osmxb.getFreePhysicalMemorySize());
System.out.println("----------Test wrap--------");
byte[] bytes = new byte[32];
buffer = ByteBuffer.wrap(bytes);
System.out.println(buffer);
}
}
public class BufferMethod {
public static void main(String[] args) {
ByteBuffer buffer = ByteBuffer.allocate(32);
buffer.put((byte) 'a')
.put((byte) 'b')
.put((byte) 'c')
.put((byte) 'd')
.put((byte) 'e')
.put((byte) 'f');
// 转换为读取模式
buffer.flip();
System.out.println((char) buffer.get());
// 绝对读写
ByteBuffer bb = ByteBuffer.allocate(32);
bb.put(2, (byte) 'c');
buffer.rewind();// 将position设回0
buffer.clear();
buffer.position(5);// 移动position到5
buffer.mark();// 记录当前position的位置
buffer.reset();// 复位position到记录的地址
System.out.println("after reset:" + buffer);
}
}
3.2 NIO
public class NioServer {
public static void main(String[] args) {
try {
Selector selector = Selector.open();
ServerSocketChannel serverChannel = ServerSocketChannel.open();
//开启非阻塞模式
serverChannel.configureBlocking(false);
serverChannel.socket().bind(new InetSocketAddress(12345), 1024);
//监听客户端连接请求
serverChannel.register(selector, SelectionKey.OP_ACCEPT);
selector.select();
Set<SelectionKey> keys = selector.selectedKeys();
Iterator<SelectionKey> it = keys.iterator();
SelectionKey key;
while (it.hasNext()) {
key = it.next();
it.remove();
try {
handleInput(key, selector);
} catch (Exception e) {
if (key != null) {
key.cancel();
if (key.channel() != null) {
key.channel().close();
}
}
}
}
} catch (IOException e) {
e.printStackTrace();
System.exit(1);
}
}
private static void handleInput(SelectionKey key, Selector selector) throws IOException {
if (key.isValid()) {
if (key.isAcceptable()) {
ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
SocketChannel sc = ssc.accept();
sc.configureBlocking(false);
sc.register(selector, SelectionKey.OP_READ);
}
if (key.isReadable()) {
SocketChannel sc = (SocketChannel) key.channel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
int readBytes = sc.read(buffer);
if (readBytes > 0) {
buffer.flip();
byte[] bytes = new byte[buffer.remaining()];
buffer.get(bytes);
String message = new String(bytes, "UTF-8");
System.out.println("服务器收到消息:" + message);
String result = response(message);
doWrite(sc, result, selector);
} else if (readBytes < 0) {
key.cancel();
sc.close();
}
}
if (key.isWritable()) {
SocketChannel sc = (SocketChannel) key.channel();
ByteBuffer buffer = (ByteBuffer) key.attachment();
if (buffer.hasRemaining()) {
int count = sc.write(buffer);
System.out.println("write :" + count + "byte, remaining:" + buffer.hasRemaining());
} else {
key.interestOps(SelectionKey.OP_READ);
}
}
}
}
private static void doWrite(SocketChannel channel, String response, Selector selector)
throws IOException {
byte[] bytes = response.getBytes();
ByteBuffer writeBuffer = ByteBuffer.allocate(bytes.length);
writeBuffer.put(bytes);
writeBuffer.flip();
channel.register(selector, SelectionKey.OP_WRITE | SelectionKey.OP_READ, writeBuffer);
}
}