`

Java学习——Jetty编程使用HttpClient

 
阅读更多

 

Jetty不仅可以拥有方便的服务器组件,也能很方便地发起Http请求。

JettyHttpClient组件可以用来向web服务器发起HTTP请求,解析响应内容,它有下面一些特性,比起JRE自带的要强大很多

1,默认是异步,也可以指定为同步

2,默认是非阻塞连接,也可以指定阻塞connectors

3,支持SSL协议

4,支持HTTP代理

5,支持HTTP认证机制

6,可以详细配置超时,连接数,线程池等设置

 

 

HttpClient API提供回调接口异步地处理服务器端返回,一个请求响应单元被成为exchange,HttpClient API里面有两个主要的类

org.eclipse.jetty.client.HttpClient 管理线程池,代理设置,Http认证的配置,connector类型设置,ssl以及超时等其它于特定一个交互无关的所有配置。

org.eclipse.jetty.client.HttpExchange 需要编程继承的父类,控制特定一次Http请求的所有相关内容(请求头,请求方法,响应内容等等)

package test.jetty;

import java.io.IOException;

import org.eclipse.jetty.client.Address;
import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.client.HttpExchange;
import org.eclipse.jetty.io.Buffer;
import org.eclipse.jetty.util.thread.QueuedThreadPool;

public class TestClient{

	public static void main(String[] args) throws Exception {
		HttpClient client = new HttpClient();
		client.setConnectorType(HttpClient.CONNECTOR_SELECT_CHANNEL);
		client.setThreadPool(new QueuedThreadPool(50));
		client.setMaxConnectionsPerAddress(10);
		client.setTimeout(5000);
		//启动之前先配置好
		client.start();
		
		HttpExchange exchange = new HttpExchange(){
			@Override
			public void onConnectionFailed(Throwable arg0) {
				// TODO Auto-generated method stub
				System.err.println("failed to connect web server");
			}
			@Override
			public void onException(Throwable arg0) {
				// TODO Auto-generated method stub
				System.err.println("unknown error");
			}
			@Override
			public void onExpire() {
				// TODO Auto-generated method stub
				System.err.println("timeout");
			}
			@Override
			public void onRequestCommitted() throws IOException {
				// TODO Auto-generated method stub
				System.out.println("request commited");
			}
			@Override
			public void onRequestComplete() throws IOException {
				// TODO Auto-generated method stub
				System.out.println("request complete");
			}
			@Override
			public void onResponseComplete() throws IOException {
				// TODO Auto-generated method stub
				System.out.println("response complete");
			}
			@Override
			public void onResponseContent(Buffer arg0) throws IOException {
				// TODO Auto-generated method stub
				System.out.println("response content");
				System.out.println(arg0.toString());
			}
			@Override
			public void onResponseHeader(Buffer arg0, Buffer arg1) throws IOException {
				// TODO Auto-generated method stub
				System.out.println("response header");
				System.out.println(arg0.toString() + " " + arg1.toString());
			}
			@Override
			public void onResponseStatus(Buffer arg0, int arg1, Buffer arg2)
					throws IOException {
				// TODO Auto-generated method stub
				System.out.println("response status");
				System.out.println(arg0.toString() + " " + arg1 + " " + arg2.toString());
			}
			@Override
			public void onRetry() {
				// TODO Auto-generated method stub
				System.out.println("retry request");
			}
			@Override
			public void onResponseHeaderComplete() throws IOException {
				// TODO Auto-generated method stub
				System.out.println("response header complete");
			}			
		};
		exchange.setMethod("GET");
		exchange.setAddress(new Address("www.baidu.com",80));
		exchange.setRequestURI("/");
		//client.send会立即返回,exchange会被分发给线程池去处理,
		client.send(exchange);
		System.out.println("send");
	}
}

运行结果

send
request commited
request complete
response status
HTTP/1.1 200 OK
response header
Date Sun, 23 Dec 2012 10:14:30 GMT
response header
Server BWS/1.0
response header
Content-Length 9777
response header
Content-Type text/html;charset=gbk
response header
Cache-Control private
response header
Expires Sun, 23 Dec 2012 10:14:30 GMT
response header
Set-Cookie BAIDUID=9E28256B347526A1BE2FA301AE032CE7:FG=1; expires=Sun, 23-Dec-42 10:14:30 GMT; path=/; domain=.baidu.com
response header
P3P CP=" OTI DSP COR IVA OUR IND COM "
response header
Connection Keep-Alive
response header complete
response content
…content…
response complete

上面的示例代码演示了异步请求,下面的代码演示如何做同步请求。

 

package test.jetty;

import org.eclipse.jetty.client.Address;
import org.eclipse.jetty.client.ContentExchange;
import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.util.thread.QueuedThreadPool;

public class TestClient{

	public static void main(String[] args) throws Exception {
		HttpClient client = new HttpClient();
		client.setConnectorType(HttpClient.CONNECTOR_SELECT_CHANNEL);
		client.setThreadPool(new QueuedThreadPool(50));
		client.setMaxConnectionsPerAddress(10);
		client.setTimeout(5000);
		//启动之前先配置好
		client.start();
		
		ContentExchange exchange = new ContentExchange();
		exchange.setMethod("GET");
		exchange.setAddress(new Address("www.baidu.com",80));
		exchange.setRequestURI("/");
		//client.send会立即返回,exchange会被分发给线程池去处理,
		client.send(exchange);
		System.out.println("send");
		//阻塞等待
		exchange.waitForDone();
		System.out.println(exchange.getResponseStatus());
		//System.out.println(exchange.getResponseContentBytes());
		System.out.println(exchange.getResponseContent());
	}
}

 还不知道在同步的情况下ContentExchange的哪个方法可以获取到响应头信息。。。

分享到:
评论

相关推荐

    Jetty Servlet+ HttpClient 制作的 Java HttpProxy

    【Java HttpProxy实现详解——基于Jetty Servlet与HttpClient】 在Java开发中,有时我们需要创建一个HTTP代理服务器,以便转发客户端的HTTP请求到指定的目标服务器。本文将深入探讨如何使用Jetty Servlet容器和...

    JAVA里使用Jetty作为轻量级嵌入式的Web容器

    Java中的Jetty是一个轻量级、高性能且可嵌入式的Web服务器和Servlet容器,它以其简单...在学习和使用过程中,可以进一步研究压缩包中的jetty包,了解其内部结构和工作原理,这将有助于提升对Jetty的理解和应用能力。

    jetty-reactive-httpclient:码头ReactiveStreams HttpClient

    版本号1.1.x - > Java的8,码头9.4.x 2.0.x - > Java的11,码头10.0.x 3.0.x > Java 11,Jetty 11.0.x用法普通ReactiveStreams的使用// Create and start Jetty's HttpClient.HttpClient httpClient = new ...

    Java Web服务器Jetty使用手册.doc

    Java Web服务器Jetty使用手册

    jetty内嵌到java代码启动

    Jetty是一款轻量级、高性能的Java Web服务器和Servlet容器,它允许开发者将Web服务器功能直接集成到他们的Java应用程序中。这种内嵌式部署模式在开发和调试阶段尤其有用,因为它提供了灵活的控制和快速的反馈循环。...

    JeeSite 代码生成器的应用

    JeeSite 代码生成器的应用

    使用httpclient访问servlet

    在Java编程中,Apache HttpClient库提供了一个强大的工具,使得我们可以轻松地实现HTTP请求,特别是在需要与Servlet进行交互时。本篇文章将详细探讨如何使用HttpClient来访问Servlet,并阐述相关的核心知识点。 ...

    Java Eclipse ee集合jetty和配置

    这意味着使用 JDK 1.7.0_80 版本的 Java 运行时环境来启动 Jetty 服务器。 下面是 Eclipse EE 中 Jetty 的一些重要配置: 1. 服务器配置:在 Eclipse EE 中,可以在 Server 视图中配置 Jetty 服务器的启动参数,如...

    Java_嵌入式Jetty WebSocket示例.zip

    而`embedded-jetty-websocket-examples_repo-moved.zip`则可能是一个包含实际源代码的归档文件,用于演示如何在Java项目中嵌入Jetty服务器并实现WebSocket功能。 让我们深入探讨一下使用Jetty实现WebSocket的基本...

    网站维护杀手锏——网络编程——设定ASP、PHP、JSP操作环境.pdf

    在IT行业中,网络编程是构建和维护网站的关键技术之一,特别是对于ASP、PHP和JSP这三种服务器端脚本语言的环境配置,是网站开发者必须掌握的基础技能。这些语言为动态网页提供支持,使得网站能够根据用户交互或...

    jetty 学习资料合集

    6. **Jetty Eclipse Plugin使用**:熟悉插件的安装和配置过程,学习如何在Eclipse中快速启动Jetty服务器、部署应用、调试Servlet和JSP,以及进行热部署和性能分析。 7. **性能调优**:了解如何通过调整Jetty的配置...

    安卓Android源码——i-jetty开源项目.zip

    【标题】"安卓Android源码——i-jetty开源项目.zip" 涉及的主要知识点是Android平台下的网络服务器实现,具体来说就是使用Jetty作为服务器内核的开源项目。Jetty是一个轻量级、高性能的Java Web服务器和HTTP协议栈,...

    Jetty java程序指定一个端口,开通一个TCP服务

    本篇将详细讲解如何使用Jetty来指定一个端口,开通一个TCP服务。 首先,理解Jetty的基本结构。Jetty的核心组件包括Server、Connector和Handler。Server是整个Jetty服务器的入口点,Connector负责处理网络连接,而...

    java jetty容器

    Java Jetty容器是一款轻量级、高性能的HTTP服务器和...总的来说,Java Jetty容器以其快速、轻量和灵活的特点,成为了Java Web开发中不可或缺的一部分,特别是在快速迭代和持续集成的开发流程中,它的优势尤为明显。

    java web开发部署神器--jetty插件

    2. 使用bin目录下的start.jar启动Jetty,这个jar文件实际上是一个嵌入式的Java应用,包含了启动Jetty所需的所有环境。 3. 访问http://localhost:8080/(默认端口),即可看到你的Web应用。 除了基本的部署,Jetty还...

    gradle的jetty插件使用例子

    **Gradle Jetty 插件使用详解** 在Java Web开发中,Jetty是一个轻量级、高性能的HTTP服务器和Servlet容器,它支持多种部署方式,包括作为嵌入式服务器使用。Gradle,作为现代的构建工具,提供了丰富的插件生态系统...

    轻量级的 Java Web 容器 Jetty.zip

    Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行(stand-alone)的Java应用提供网络和web连接。开源地址:...

    Android源码——i-jetty开源项目.zip

    - **本地调试**: 开发者可以使用i-jetty在设备上启动一个本地服务器,用于测试和调试应用的网络接口。 - **离线应用**: 应用可以在本地存储数据,并通过i-jetty提供一个本地API供用户在无网络连接时访问。 - **...

    Jetty9 配置使用HTTPS证书

    其次,由于Jetty服务器需要的Key文件类型通常是Java的keystore格式,即.jks文件,但多数服务商提供的证书是pfx或pem格式,所以需要进行格式转换。 将pfx格式证书转换为jks格式证书,可以通过Windows的CMD命令行完成...

    深入体验Java Web开发内幕——核心基础

    Java Web开发是构建互联网应用程序的重要领域,它涵盖了服务器端编程、网页交互以及数据库管理等多个方面。本主题将深入探讨Java Web开发的核心基础知识,帮助你全面理解这一技术的内在机制。 一、Java Web 开发...

Global site tag (gtag.js) - Google Analytics