文档章节

java nio select 实现 httpclient

疯狂的骑士
 疯狂的骑士
发布于 2017/07/20 18:37
字数 365
阅读 89
收藏 0

代码非常短,注释都在代码里了,相信都能理解

package com.rock.nio;

import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;

public class NioHttp2 {

	public static void main(String[] args) throws Exception {
		

		Selector selector = Selector.open();
		InetSocketAddress remoteAddress = new InetSocketAddress("chushu.la", 80);
		// 调用open的静态方法创建连接指定的主机的SocketChannel
		SocketChannel socketChangel = SocketChannel.open(remoteAddress);
		// 设置该sc已非阻塞的方式工作
		socketChangel.configureBlocking(false);
		// 将SocketChannel对象注册到指定的Selector
		socketChangel.register(selector, SelectionKey.OP_READ);
		sendMessage(socketChangel, createHttpMsg()); 
		
		boolean remoteConnClosed = false;
		while (!remoteConnClosed) {
			int n = selector.select(1000*60);//设置超时为1分钟
			if (n <= 0) {
				break;//
			}
			Set<SelectionKey> selectedKeys = selector.selectedKeys();
			Iterator<SelectionKey> iter = selectedKeys.iterator();
			while (iter.hasNext()) {
				SelectionKey key = iter.next();
				if (key.isReadable()) {
					ByteBuffer buffer = ByteBuffer.allocate(1024);//如果读取的数据大于1024, 则下次调用 selector.select 的数值还会大于0
					SocketChannel client = (SocketChannel) key.channel();
					int num = client.read(buffer);
					while(num > 0){//如果num = 0, 表示读取不到远端数据,可能是远端网速慢或者其他网络原因, 下次selector.select返回时可再读; 如果num=-1,表示远端关闭了连接。
						client.read(buffer);
						String reString = new String(buffer.array(), "utf-8");
						System.out.print(reString);
						num = client.read(buffer);
					}
					
					if(num == -1){//远程连接主动关闭
						System.out.println("remote server close connection~~");
						client.close();
                        key.cancel()
						remoteConnClosed = true;
					}
					
				}
                //这里必须移除掉该selectionKey, 否则下次select调用时还会存在
				iter.remove();
			}

		}
	}

	private static String createHttpMsg() {
		StringBuffer sBuffer = new StringBuffer();
		sBuffer.append("GET / HTTP/1.1").append("\r\n");
		sBuffer.append("Host: chushu.la").append("\r\n");
//		sBuffer.append("Connection: Closed");
		sBuffer.append("Connection: keep-alive");
		sBuffer.append("\r\n").append("\r\n");
		return sBuffer.toString();
	}
	
	public static void sendMessage(SocketChannel client, String msg)throws Exception {
		ByteBuffer buffer = ByteBuffer.wrap(msg.getBytes());
        client.write(buffer);
    }
}

 

© 著作权归作者所有

共有 人打赏支持
疯狂的骑士
粉丝 2
博文 28
码字总数 10444
作品 0
深圳
程序员
私信 提问
使用jetty 自带的http client!

一般情况下我们需要使用HttpClient时可供选择的技术有: 1、HttpURLConnection 2、Apache HttpClient 其他的除了写Socket 我都没有用过了。 偶然的机会发现Jetty 里面也自带了一个HttpClien...

一堆BUG
2012/02/27
0
0
Android 使用自带的HttpClient进行https请求出现403的解决过程记录

出现的过程 最近在用程序模拟一个web站的https登录,然后进行一些后续操作的小玩意。先使用java程序写测试代码,测试通过移植到android。 java基于httpclient-4.3.1.jar开发。 android端使用...

atearsan
2014/03/05
0
1
httpclient4.4 出现NoHttpResponseException的异常解决

httpclient4.4简单初始化httpclient的方式: 使用连接池初始化httpclient的方式: 但在测试过程中发现,有时候出现如下的异常,但重试一次就没有问题: 网上查了相关的报错信息,找到官网上的...

一路向北的兔斯基
2015/07/30
0
1
Java HTTP 组件库选型看这篇就够了

原文出处:行思錄 Java HTTP 组件库选型看这篇就够了 最近项目需要使用 Java 重度调用 HTTP API 接口,于是想着封装一个团队公用的 HTTP client lib. 这个库需要支持以下特性: 连接池管理,...

行思錄
09/25
0
0
Android 浅谈HttpClient工具类

在Android开发中我们经常会用到网络连接功能与服务器进行数据的交互,为此Android的SDK提供了Apache的HttpClient来方便我们使用各种Http服务。你可以把HttpClient想象成一个浏览器,通过它的...

Jonson
2013/07/25
0
3

没有更多内容

加载失败,请刷新页面

加载更多

大数据教程(9.5)用MR实现sql中的jion逻辑

上一篇博客讲解了使用jar -jar的方式来运行提交MR程序,以及通过修改YarnRunner的源码来实现MR的windows开发环境提交到集群的方式。本篇博主将分享sql中常见的join操作。 一、需求 订单数据表...

em_aaron
21分钟前
1
0
十万个为什么之什么是resultful规范

起源 越来越多的人开始意识到,网站即软件,而且是一种新型的软件。这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点...

尾生
27分钟前
1
0
《告诉你真实的美国教育》的读后感3900字

《告诉你真实的美国教育》的读后感3900字: 文章的开篇分析了我们耳熟能详的关于美国教育的小故事,就是那个因为幼儿园的老师教了“0”这个字母,然后妈妈告老师剥夺了孩子的想象力,再然后幼...

原创小博客
35分钟前
0
0
Terraform配置文件(Terraform configuration)

Terraform配置文件 翻译自Terraform Configuration Terraform用文本文件来描述设备、设置变量。这些文件被称为Terraform配置文件,以.tf结尾。这一部分将讲述Terraform配置文件的加载与格式。...

buddie
50分钟前
2
0
exportfs命令, vsftp搭建ftp服务

exportfs命令 当修改/etc/exports文件后,更改的内容是不会立即生效的。如果重启nfs服务,会导致客户端重启期间的请求是挂起等待的,可以把客户端的挂载umount进行卸载后,再重启nfs服务,但...

野雪球
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部