java nio socket ---- 简单模式

本文介绍了一个使用NIO Socket实现的服务器端代码示例,包括服务器初始化、监听连接、读取客户端消息及响应操作。重点阐述了如何在NIO环境下高效地进行双向通信,以及如何优雅地处理客户端的退出请求。
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Date;
import java.util.Iterator;
import java.util.Set;

/**
 * Created by mapan on 2014/8/18.
 */
public class NioServer {

    Selector selector = null;

    public NioServer(int port) throws IOException {
        selector = Selector.open();
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        serverSocketChannel.socket().bind(new InetSocketAddress(port));
        serverSocketChannel.configureBlocking(false);
        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
    }

    public void handle() throws IOException {

        while (!Thread.interrupted()) {
            selector.select();
            Set<SelectionKey> selectionKeys = selector.selectedKeys();
            Iterator<SelectionKey> iterator = selectionKeys.iterator();
            while (iterator.hasNext()) {
                SelectionKey next = iterator.next();
                iterator.remove();
                if (next.isAcceptable()) {
                    ServerSocketChannel channel = (ServerSocketChannel) next.channel();
                    SocketChannel accept = channel.accept();
                    accept.configureBlocking(false);
                    accept.register(selector, SelectionKey.OP_READ);
                }else if (next.isReadable()) {
                    SocketChannel channel = (SocketChannel) next.channel();
                    ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
                    int read = channel.read(byteBuffer);

                    String readString = new String(byteBuffer.array(), 0, read).trim();
                    System.out.println(readString);
                    if (readString.equals("quit")) {
                        channel.close();
                    } else {
                       // 这里也可以不用 下面一句话注册写事件,直接通过 channel.write() 去给客户端返回数据
                        channel.register(selector, SelectionKey.OP_WRITE);
                    }
                }else  if (next.isWritable()) {
                    String date = (new Date()).toString() + "\r\n";
                    SocketChannel channel = (SocketChannel) next.channel();
                    channel.write(ByteBuffer.wrap(date.getBytes()));
                    next.interestOps(SelectionKey.OP_READ);
                }
            }
        }
    }
    public static void main(String[] args) throws IOException {

        NioServer nioServer = new NioServer(9999);
        nioServer.handle();
    }
}


说明:

    再nio socket中,打开的是双向通道,如果 建立连接以后,是直接可以写的:写的代码如下:

channel.write()

  但是这个在nio socket里面是不推荐的,建议还是通过注册相应的写事件,向客户端返回数据。


这个只是简单的一个 nio socket的事例代码。







转载于:https://my.oschina.net/u/725800/blog/305929

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值