JavaNIO-时间服务器

一)时间服务器

原理:创建一个服务端,获取服务端的时间,每隔一秒钟把时间传输给客户端,客户端接收到服务端的时间,然后直接展示在客户端。

 

二)服务端

实现步骤:

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秒,请求一次
        }
    }
}

 

识别二维码关注个人微信公众号

本章完结,待续,欢迎转载!
 
本文说明:该文章属于原创,如需转载,请标明文章转载来源!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值