Java socket入门

2016-08-11  本文已影响102人  小城大麦

Netty In Action中Java Network的介绍代码

一个简单Block-Socket Server

public class SimpleSocketServer {

    static String processRequest(String request){
        return request;
    }
    public static void main(String[] args) throws IOException {
        ServerSocket socket = new ServerSocket(9900);
        Socket cs = socket.accept();
        BufferedReader br = new BufferedReader(new InputStreamReader(cs.getInputStream()));
        PrintWriter pw = new PrintWriter(cs.getOutputStream(),true);
        String request, response;
        while((request = br.readLine())!=null){
            if("Done".equals(request)){
                break;
            }
            response = processRequest(request);
            pw.println(response);
        }
    }
}

使用telnet测试

➜  ~ telnet localhost 9900
Trying ::1...
Connected to localhost.
Escape character is '^]'.
hello
hello
Done

PlainSocketServer with multi-thread

public void serve(int port) throws IOException {
        final ServerSocket socket = new ServerSocket(port);
        try {
            for(;;){
                final Socket clientSocket = socket.accept();
                System.out.println("Accepted connection from " + clientSocket);
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        OutputStream out;
                        try{
                            out = clientSocket.getOutputStream();
                            out.write("Hi!\r\n".getBytes(Charset.forName("UTF-8")));
                            out.flush();
                            clientSocket.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        } finally {
                            try {
                                clientSocket.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }).start();
            }
        } finally {

        }
    }

来个NIO的socket服务

public void serve(int port) throws IOException {
        ServerSocketChannel serverChannel = ServerSocketChannel.open();
        serverChannel.configureBlocking(false);
        ServerSocket ssocket = serverChannel.socket();
        InetSocketAddress address = new InetSocketAddress(port);
        ssocket.bind(address);
        Selector selector = Selector.open();
        serverChannel.register(selector, SelectionKey.OP_ACCEPT);
        final ByteBuffer msg = ByteBuffer.wrap("Hi!\r\n".getBytes());
        for(;;){
            try {
                selector.select();
            } catch (IOException ex) {
                ex.printStackTrace();
                // handle exception
                break;
            }
            Set<SelectionKey> readyKeys = selector.selectedKeys();
            Iterator<SelectionKey> iterator = readyKeys.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(        "Accepted connection from " + 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 (Exception e){
                    key.cancel();
                    try {
                        key.channel().close();
                    }catch (Exception cex){}
                }
            }

        }
    }
上一篇 下一篇

猜你喜欢

热点阅读