文档章节

java nio select 实现 httpclient

疯狂的骑士
 疯狂的骑士
发布于 2017/07/20 18:37
字数 365
阅读 66
收藏 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. 这个库需要支持以下特性: 连接池管理,...

行思錄
昨天
0
0
Android 浅谈HttpClient工具类

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

Jonson
2013/07/25
0
3

没有更多内容

加载失败,请刷新页面

加载更多

Shell编程(expect同步文件、指定host和同步文件、构建文件分发系统、批量执行命令)

expect脚本同步文件 需求:自动同步文件 实验准备: A机器:192.168.248.130 B机器:192.168.248.129 实现: 1.A机器编写4.expect脚本文件,内容如下所示: #!/usr/bin/expectset passwd "...

蛋黄_Yolks
18分钟前
1
0
ppwjs之bootstrap颜色:背景颜色

<!DOCTYPT html><html><head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><title>ppwjs欢迎您</title><link rel="icon" href="/favicon.ico" ......

ppwjs
19分钟前
0
0
Ubuntu与 Fedora之对比

大家好。今天我将重点介绍两个流行的Linux发行版之间的一些特性和差异; Ubuntu 18.04和Fedora 28。它们都有自己的包管理; Ubuntu使用DEB,而Fedora使用RPM,但它们都具有相同的桌面环境(GNO...

linuxprobe16
23分钟前
1
0
线性代数入门

线性代数的概念对于理解机器学习背后的原理非常重要,尤其是在深度学习领域中。它可以帮助我们更好地理解算法内部到底是怎么运行的,借此,我们就能够更好的做出决策。所以,如果你真的希望了...

牛奋Debug
昨天
3
0
开发5分钟,调试2小时 - 该如何debug?

几年来我在答疑群、论坛、公众号、知乎回答的各种问题,没有一万也有八千。其中有三分之二以上都是在帮人看报错,帮人 debug(调试代码)。 可以说,会不会 debug,有没有 debug 的意识,懂不...

crossin
昨天
4
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部