一)时间服务器
原理:创建一个服务端,获取服务端的时间,每隔一秒钟把时间传输给客户端,客户端接收到服务端的时间,然后直接展示在客户端。
二)服务端
实现步骤:
1、创建一个ServerSocketChannel通道。
2、设置IP和端口,用InetSocketAddress初始化。
3、把InetSocketAddress绑定到创建的通道上。
4、监听ServerSocketChannel通道,并初始化SocketChannel通道。
5、把当前服务端的时间,先读取到ByteBuffer缓冲区中,再写入SocketChannel通道。
源码实现:
package com.oysept.maven.nio.time;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 时间服务端
* @author ouyangjun
*/
public class TimeServer {
// 端口
private static int port = 8125;
// 缓冲区
private static ByteBuffer buf = ByteBuffer.allocate(1024);
/**
* 初始化通道和绑定
*/
public static ServerSocketChannel init() {
// 创建一个通道对象
ServerSocketChannel ssc = null;
try {
ssc = ServerSocketChannel.open();
// 判断通道是否开启
if (ssc.isOpen()) {
// 将通道设置为非阻塞,由于时间需要不断发送,默认为阻塞
//ssc.configureBlocking(false);
// 获取本机IP
String host = InetAddress.getLocalHost().getHostAddress();
// 设置需要绑定的IP和端口,也可以只绑定端口(默认绑定本机IP)
InetSocketAddress isa = new InetSocketAddress(host, port);
// 把IP和端口绑定到通道上
ssc.socket().bind(isa);
return ssc;
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 监听通道,并输出内容
*/
public static void server(ServerSocketChannel ssc) {
if (ssc == null) {
return;
}
// 监听连接
SocketChannel sc = null;
try {
sc = ssc.accept();
// 格式化当前时间
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = simpleDateFormat.format(new Date());
System.out.println("当前服务端时间为: " + time);
// 清理缓冲区
buf.clear();
// 把数据添加到缓冲区
buf.put(time.getBytes());
// 翻转这个缓冲区,返回对缓冲区的引用
buf.flip();
// 写入数据
if (sc != null) {
sc.write(buf);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (sc != null) {
sc.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
// 初始化通道
ServerSocketChannel ssc = init();
// 一直开启服务器,死循环
for(;;) {
server(ssc);
}
}
}
二)客户端
实现步骤:
1、创建一个SocketChannel通道。
2、建立InetSocketAddress的IP和端口的连接。
3、从SocketChannel通道中读取服务端的数据,并打印到控制台。
实现源码:
package com.oysept.maven.nio.time;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
/**
* 时间客户端
* @author ouyangjun
*/
public class TimeClient {
// 端口
private static int port = 8125;
// 缓冲区
private static ByteBuffer buf = ByteBuffer.allocate(1024);
/**
* 客户端
* @param host
*/
public static void client(String host) {
SocketChannel sc = null;
InetSocketAddress isa = null;
try {
// 创建一个通道对象
sc = SocketChannel.open();
// 设置需要绑定的IP和端口
isa = new InetSocketAddress(InetAddress.getByName(host), port);
// 将通道连接到绑定的地址上
sc.connect(isa);
// 清理缓冲区
buf.clear();
// 从通道把数据读取到缓冲区
sc.read(buf);
// 翻转这个缓冲区,返回对缓冲区的引用
buf.flip();
System.out.println("客户端接收的服务端时间为: " + new String(buf.array(), "UTF-8"));
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (sc != null) {
sc.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws UnknownHostException, InterruptedException {
// 获取本机IP
String host = InetAddress.getLocalHost().getHostAddress();
for(;;) {
// 启动客户端
client(host);
Thread.sleep(1000); // 休眠1秒,请求一次
}
}
}
识别二维码关注个人微信公众号
本章完结,待续,欢迎转载!
本文说明:该文章属于原创,如需转载,请标明文章转载来源!