带代理的 Java websocket

Posted

技术标签:

【中文标题】带代理的 Java websocket【英文标题】:Java websocket with proxy 【发布时间】:2015-04-03 10:32:48 【问题描述】:

几天来,我一直在尝试使用 Java 中的代理使 websocket 工作。我尝试了不同的库,例如

https://github.com/TooTallNate/Java-WebSocket

https://github.com/AsyncHttpClient/async-http-client

但遗憾的是,这些库不支持带凭据的代理。如果你们知道任何其他支持代理的库,那么我将不胜感激。

提前致谢

【问题讨论】:

您确定您使用的代理支持 websockets 吗?许多人没有。尽管当您在 TLS (wss://) 上使用 websockets 时,许多人可能会被欺骗支持它。 我已经在我的 firefox mozilla 中测试了该代理以检查 websocket 并且它可以工作。但我想让它在 java 程序中工作,但它看起来很复杂。 【参考方案1】:

试试 nv-websocket-client 库。它支持代理服务器上的身份验证。但是请注意,当前实现仅支持基本身份验证。

// 1. Create a WebSocketFactory instance.
WebSocketFactory factory = new WebSocketFactory();

// 2. Set up information about a proxy server.
//    Credentials can be set here.
ProxySettings settings = factory.getProxySettings();
settings.setServer("http://proxy.example.com");
settings.setCredentials("id", "password");

// 3. Connect to a WebSocket endpoint via the proxy.
WebSocket ws = factory.createSocket("ws://websocket.example.com");

// 4. Add a listener to receive WebSocket events.
ws.addListener(new WebSocketAdapter() 
    @Override
    public void onTextMessage(WebSocket ws, String message) 
        // Received a text message.
        ......
    
);

// 5. Perform a WebSocket opening handshake.
ws.connect();

// 6. Send frames.

// 6-1. Text
ws.sendText("Hello.");

// 6-2. Binary
byte[] binary = ......;
ws.sendBinary(binary);

// 6-3. Ping
ws.sendPing("Are you there?");

// 6-4. Pong (unsolicited pong; RFC 6455, 5.5.3. Pong)
ws.sendPong("I'm OK.");

// 6-5. Fragmented Frames
ws.sendText("How ", false)
  .sendContinuation("are ")
  .sendContinuation("you?", true);

// 6-6. Periodical Ping
ws.setPingInterval(60 * 1000);

// 6-7. Periodical Pong (unsolicited pong; RFC 6455, 5.5.3. Pong)
ws.setPongInterval(60 * 1000);

// 6-8. Close (if you want to send one manually).
ws.sendClose(WebSocketCloseCode.NORMAL, "Bye.");

// 7. Disconnect
ws.disconnect();

博客WebSocket 客户端库(Java SE 1.5+,androidhttp://darutk-oboegaki.blogspot.jp/2015/05/websocket-client-library-java-se-15.html

GitHubhttps://github.com/TakahikoKawasaki/nv-websocket-client

JavaDochttp://takahikokawasaki.github.io/nv-websocket-client/

Maven

<dependency>
    <groupId>com.neovisionaries</groupId>
    <artifactId>nv-websocket-client</artifactId>
    <version>1.3</version>
</dependency>

nv-websocket-client-1.3.jar 的大小为 62854 字节,不需要任何外部依赖。

【讨论】:

【参考方案2】:

你可以试试Tyrus(Java EE中WebSocket API的参考实现);客户端不需要运行任何 Java EE 服务器,如果您使用的是 Java 7,则客户端可以是 minimized to ~500kb。

Client behing proxy 和 Dependencies 应该提供足够的信息来尝试。

【讨论】:

我正在尝试那个,但它不适用于代理设置,而且我需要在代理中使用凭据 代理身份验证不是我们可以提供的领域:-/ 但是!您应该能够使用 PROXY_HEADERS: tyrus.java.net/apidocs/1.10/org/glassfish/tyrus/client/… 进行基本/摘要抢先式身份验证。如果您有更复杂的身份验证方案(基本上任何有挑战的东西),您可能需要修改 Tyrus 代码..(我可以帮助解决这个问题,基本上没有实现的唯一原因是我们对它没有足够的需求并且测试设置很复杂..)

以上是关于带代理的 Java websocket的主要内容,如果未能解决你的问题,请参考以下文章

姐姐带我玩转java设计模式(内附照片)- 代理模式

Java动态代理代码快速上手

谈谈Java的代理模式及动态代理

JAVA设计模式——代理(静态代理)

Java中的代理模式

java 之 代理模式(大话设计模式)