不用netty實現OIO和NIO連接通信

首先是 OIO server端的

package com.fk.testIO;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.Charset;

/**
 * Created by fengkai on 11/04/17.
 */
public class OIO {

    public void serve(int port) throws IOException{
        //綁定端口
        final ServerSocket socket = new ServerSocket(port);

        for(;;){
            final Socket clientSocket = socket.accept();
            System.out.println("A connetction from " +clientSocket);
            new Thread(new Runnable() {
                @Override
                public void run() {
                    OutputStream out;
                    InputStream in;
                    try{
                        in = clientSocket.getInputStream();
                        byte[] bytes = new byte[1024];
                        int bytelen = 0;
                        int bytein = 0;
                        StringBuffer sb = new StringBuffer();
                        while ((bytelen = in.read(bytes)) != -1){
                            String str = new String(bytes, bytein, bytelen);
                            sb.append(str);
                        }
                        System.out.println(sb.toString());
                        out = clientSocket.getOutputStream();
                        out.write("HelloWorld".getBytes(Charset.forName("UTF-8")));
                        out.flush();
                        clientSocket.close();
                    }catch (IOException e){
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    }

    public static void main(String[] args) {
        final int port = 8888;
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    new OIO().serve(port);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

}

接下來是NIO 的server

package com.fk.testIO;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
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.Iterator;
import java.util.Set;

/**
 * Created by fengkai on 11/04/17.
 */
public class NIO {

    public void service(int port) throws IOException{
        // 打開selector 處理channel
        ServerSocketChannel serverChannel = ServerSocketChannel.open();
        serverChannel.configureBlocking(false);
        ServerSocket socket = serverChannel.socket();
        InetSocketAddress adress = new InetSocketAddress(port);
        socket.bind(adress);
        Selector selector = Selector.open();
        //註冊selector
        serverChannel.register(selector, SelectionKey.OP_ACCEPT);
        final ByteBuffer msg = ByteBuffer.wrap("hello".getBytes());
        for(;;){
            //等待新的處理事件
            try {
                selector.select();
            } catch (IOException e) {
                e.printStackTrace();
                break;
            }
            //所有的selectionKey實例
            Set<SelectionKey> readKeys = selector.selectedKeys();
            Iterator<SelectionKey> iterator = readKeys.iterator();
            while (iterator.hasNext()){
                SelectionKey key = iterator.next();
                iterator.remove();;
                //查看它是否是等待接受的新連接

                try {
                    if(key.isAcceptable()){
                        ServerSocketChannel server = (ServerSocketChannel) key.channel();
                        SocketChannel client = server.accept();
                        client.configureBlocking(false);
                        client.register(selector, SelectionKey.OP_WRITE|SelectionKey.OP_READ, msg.duplicate());
                        System.out.println("a new Connetion" + client);
                    }
                    //準備好寫
                    if(key.isWritable()){
                        SocketChannel client = (SocketChannel) key.channel();
                        ByteBuffer buffer = (ByteBuffer) key.attachment();
                        while (buffer.hasRemaining()){
                            if(client.write(buffer) == 0){
                                break;
                            }
                        }
                        client.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                    key.cancel();
                    try {
                        key.channel().close();
                    }catch (IOException cex){
                        cex.printStackTrace();
                    }
                }


            }

        }


    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章