java 怎么实现http下的异步socket

 我来答
就烦条0o
2017-05-17 · 知道合伙人软件行家
就烦条0o
知道合伙人软件行家
采纳数:33315 获赞数:46492
从事多年系统运维,喜欢编写各种小程序和脚本。

向TA提问 私信TA
展开全部
package com.what21.httpserver.nio;
import java.net.InetSocketAddress;
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;
public class MyHttpServer {
    /**
     * 启动服务
     * 
     * @param port
     * @throws Exception
     */
    public static void startServer(int port)throws Exception {
        // 创建选择器
        Selector selector = Selector.open();
        // 打开监听信道
        ServerSocketChannel server = ServerSocketChannel.open();
        // 与本地端口绑定
        server.socket().bind(new InetSocketAddress(port));
        // 设置为非阻塞模式
        server.configureBlocking(false);
        // 非阻塞信道才能够注册选择器,在注册过程中指出该信道可以进行Accept操作
        SelectionKey serverkey = server.register(selector,SelectionKey.OP_ACCEPT);
        // 反复循环,等待IO
        while (true) {
            // 取到选择器的监听事件
            selector.select();
            // 取到通道内监听事件的集合
            Set<SelectionKey> keys = selector.selectedKeys();
            // 遍历监听事件
            for (Iterator<SelectionKey> it = keys.iterator(); it.hasNext();) {
                SelectionKey key = (SelectionKey) it.next();
                //移出此事件
                it.remove();
                if (key == serverkey) {
                    if (key.isAcceptable()) {
                        // 取到对应的SocketChannel
                        SocketChannel client = server.accept();
                        if (client == null){
                            continue;
                        }
                        client.configureBlocking(false);
                        // 在此通道上注册事件
                        client.register(selector,SelectionKey.OP_READ);
                    }
                } else {
                    // 处理{@link SelectionKey#OP_READ}事件
                    SocketChannel client = (SocketChannel) key.channel();
                    if (!key.isReadable()){
                        continue;
                    }
                    key.cancel(); 
                    new MyHandler(client).start();
                }
            }
        }
    }
    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        startServer(8000);
    }
}

package com.what21.httpserver.nio;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;
public class MyHandler extends Thread {
    // 编码
    static CharsetEncoder encoder = Charset.forName("GBK").newEncoder();
    private SocketChannel client;
    public MyHandler(SocketChannel client){
        this.client = client;
    }
    @Override
    public void run() {
        try {
            //==============================请求处理开始==============================
            ByteBuffer buffer = ByteBuffer.allocate(1024);
            client.read(buffer);
            // 将缓冲区准备为数据传出状态
            buffer.flip();
            CharsetDecoder decoder =  Charset.forName("GBK").newDecoder();
            String rquestStr= decoder.decode(buffer).toString();
            System.out.println(rquestStr);
            //==============================响应处理开始==============================
            String html = "<h1>HI~ , My HTTP Server!</h1>";
            // 响应头
            StringBuilder sb = new StringBuilder();
            sb.append("HTTP/1.0 200 OK").append("\r\n");
            sb.append("MIME_version:1.0").append("\r\n");
            sb.append("Content_Type:text/html").append("\r\n");
            sb.append("Content_Length:" + html.length()).append("\r\n");
            sb.append("\r\n");
            // 响应内容
            sb.append(html).append("\r\n");
            sb.append("\r\n");
            buffer=ByteBuffer.wrap(sb.toString().getBytes());
            client.write(buffer);
        } catch (Exception e) {
            e.printStackTrace();
        } finally{
            try {
                client.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式