1

我正在尝试使用带有 Restlet 的 HTTPS 和 XML 帖子在 Java 中创建客户端-服务器应用程序。

我遵循了各种教程,并设法毫无问题地运行服务器端(如果我用浏览器连接到它,它会正确响应),但是一旦我启动客户端,它们都会冻结:客户端没有完成它的请求并且服务器不再响应浏览器请求。

现在我正在使用版本 2.2 Milestone 1,但我也尝试使用版本 2.1.1,但没有成功。我在 MacOSX 10.7.5 上使用 Eclipse Juno。这两个商店是使用 keytool 命令创建的(我创建了 serverKey.jks,导出了自签名证书并将其添加到 clientTrust.jks)。
我最初包含的罐子是:

  • org.restlet
  • org.jssl.utils
  • org.restlet.ext.ssl

但我也尝试添加特定的连接器(另外,在 libs readme.txt 中列出了依赖项):

  • org.restlet.ext.httpclient.jar
  • org.restlet.ext.jetty.jar
  • org.restlet.ext.net.jar
  • org.restlet.ext.simple.jar

测试HTTPS类

public class TestHTTPS extends Application{

    public static void main(String[] args) throws Exception{
        TestHTTPS t = new TestHTTPS();
        t.testhttps();
    }

    public void testhttps() throws Exception{
        Component comp = new Component();

        Server server = comp.getServers().add(Protocol.HTTPS, 8183);

        Series<Parameter> servParameters = server.getContext().getParameters();
        servParameters.add("keystorePath", "serverKey.jks");
        servParameters.add("keystorePassword", "password");
        servParameters.add("keystoreType", "JKS");
        servParameters.add("keyPassword", "password");
        servParameters.add("tracing", "true");

        comp.getDefaultHost().attach(new TestHTTPS());      
        server.start();

        Context con = new Context();
        Series<Parameter> clParameters = con.getParameters();

        clParameters.add("truststorePath", "clientTrust.jks");
        clParameters.add("truststoreType", "JKS");
        clParameters.add("truststorePassword", "password");

        Client restletClient = new Client(con, Protocol.HTTPS);
        Reference resourceRef = new Reference("https://localhost:8183/user/myself");

        Request request = new Request(Method.POST, resourceRef);
        request.getClientInfo().getAcceptedMediaTypes().add(new Preference<MediaType>(MediaType.TEXT_XML));

        Response response = restletClient.handle(request);
        System.out.println(response.getEntityAsText());

        restletClient.stop();
        server.stop();
    }

    @Override
    public Restlet createInboundRoot() {
        Router router = new Router(getContext());
        router.attach("/user/{id}", UserResource.class);
        return router;
    }
}

用户资源类

public class UserResource extends ServerResource {
    @Post("xml")
    public Representation sendPostResponse(){
        return new StringRepresentation("<Document>content</Document>", MediaType.APPLICATION_XML);
    }

    @Get("xml")
    public Representation sendGetResponse(){
        return new StringRepresentation("<Document>content</Document>", MediaType.APPLICATION_XML);
    }
}

控制台的唯一输出是:

Starting the internal [HTTPS/1.1] server on port 8183
Starting the internal [HTTPS/1.1] client

难道我做错了什么?

4

1 回答 1

2

经过一番调查,我发现以下解决了“启动内部 [HTTPS/1.1] 客户端”进程停滞的问题:

确保以下三个 JAR 在您的构建路径中:

org.restlet.ext.net.jar
org.restlet.ext.ssl.jar
org.restlet.jar
于 2013-09-23T20:30:33.953 回答