使用Jetty实现SPDY协议的“Hello server”。

7

我正在尝试使用Jetty搭建一个最小的HTTP over SPDY服务器,用于测试目的。我正在处理以下代码:

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.spdy.http.HTTPSPDYServerConnector;
import org.eclipse.jetty.util.ssl.SslContextFactory;

import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.AbstractHandler;

public class MySPDYHelloServer {
    public static void main(String[] args) throws Exception {
        Server server = new Server();

        SslContextFactory sslFactory = new SslContextFactory();
        sslFactory.setKeyStorePath("dummy_keystore.jks");
        sslFactory.setKeyStorePassword("password");
        sslFactory.setProtocol("TLSv1");

        Connector connector = new HTTPSPDYServerConnector(sslFactory);
        connector.setPort(8443);
        server.addConnector(connector);

        server.setHandler( new AbstractHandler(){
            public void handle(String target, Request baseRequest,
                    HttpServletRequest request, HttpServletResponse response)
                    throws IOException, ServletException {
                response.setContentType("text/html;charset=utf-8");
                response.setStatus(HttpServletResponse.SC_OK);
                baseRequest.setHandled(true);
                response.getWriter().println("<h1>Hello World</h1>");
            }
        } );

        server.start();
        server.join();
    }
}

我已经生成了密钥库:

keytool -genkey -keystore dummy_keystore.jks

当我将启用SPDY的Google Chrome指向https://localhost:8443时,它会警告我该证书不受信任,然后永远加载。
纯SPDY客户端-服务器示例(来自这里)有效,简单的HTTPS服务器也有效;问题似乎与HTTPSPDYServerConnector类有关。
以下是我使用的JAR列表:
jetty-all-7.6.7.v20120910.jar
npn-boot-7.6.2.v20120308.jar
servlet-api-2.5.jar
spdy-core-7.6.7.v20120910.jar
spdy-jetty-7.6.7.v20120910.jar
spdy-jetty-http-7.6.7.v20120910.jar

就我的Java环境而言:

$ cat /opt/jdk1.7.0_07/release 
JAVA_VERSION="1.7.0"
OS_NAME="Linux"
OS_VERSION="2.6"
OS_ARCH="i586"

解决方案补充

Jesse McConnell提供了答案。但是,那些使用Eclipse的人可能会发现以下内容有用。

JAR文件npn-boot-7.6.2.v20120308.jar必须(也)放置在以下位置:

Run Configurations... -> Classpath -> Bootstrap Entries -> Add External JARs

请注意,由于顺序很重要,该条目必须出现在JRE系统库之前。
1个回答

6
你在启动时是否将npn-boot作为bootclasspath jar使用? 原生的jvm不支持npn(下一代协议协商),因此spdy无法正常工作,所以您必须确保与-Xbootclasspath选项一起使用npn-boot jar。这似乎是您遇到的问题,因为您正在处理证书加载,然后它会停止运行...而且您将npn-boot称为依赖项,而它更像是jvm类的替换品,而不是典型的依赖项。

哦,我只是把所有的JAR文件扔进了Eclipse的类路径中...非常感谢! - cYrus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接