客户端WebSocket
Vert.x之HttpClient支持WebSockets.可以调用任一websocket操作并提供一个处理器连接一个WebSocket到客户端。在连接成功后,处理器将会得到WebSocket实例参数并且被调用。
client.websocket("/some-uri",websocket -> {
System.out.println("Connected!");
});
向WebSockets中写入数据
如果你想向WebSocket写入二进制消息,writeBinaryMessage可以做到:
Buffer buffer =Buffer.buffer().appendInt(123).appendFloat(1.23f);
websocket.writeBinaryMessage(buffer);
如果WebSocket消息的大小超过setMaxWebSocketFrameSize设置的最大Websocket帧大小,Vert.x在发送之前,会把消息分成多个WebSocket帧。
将帧写到WebSocket
一个WebSocket可以组成多个帧。这种情况下,第一帧(二进制或文本)后面紧跟0个或多个后续帧。
最后一帧会标记为最终帧。
为了发送包含多个侦的消息,可以使用WebSocketFrame.binaryFrame , WebSocketFrame.textFrame 或者WebSocketFrame.continuationFrame 方法创建并用writeFrame方法将帧发到WebSocket.
下面是一个二进制帧的例子:
WebSocketFrame frame1 =WebSocketFrame.binaryFrame(buffer1, false);
websocket.writeFrame(frame1);
WebSocketFrame frame2 =WebSocketFrame.continuationFrame(buffer2, false);
websocket.writeFrame(frame2);
// Write the final frame
WebSocketFrame frame3 =WebSocketFrame.continuationFrame(buffer2, true);
websocket.writeFrame(frame3);
一些情况下,只需要发送俱有单个帧的WebSocket消息。所以Vert.x提供了两个快捷方法,writeFinalBinaryFrame 和 writeFinalTextFrame.
下面是个例子:
websocket.writeFinalTextFrame("Geronimo!");
// Send a websocket messages consisting of asingle final binary frame:
Buffer buff =Buffer.buffer().appendInt(12).appendString("foo");
websocket.writeFinalBinaryFrame(buff);
从WebSockets中读取帧
用frameHandler从WebSocket中读取帧。在帧到达时,帧处理器中将处理WebSocketFrame实例,例如:
websocket.frameHandler(frame -> {
System.out.println("Received a frame of size!");
});
关闭WebSocket
在用完WebSocket连接后,用close方法关闭WebSocket连接。
流式WebSocket
WebSocket实例也是ReadStream和WriteStream,所以可以泵接。在使用WebSocket作为读取流或写入流时应和WebSocket连接一起使用,使用时必须是二进制帧且不能分成多帧。
为HTTPS连接使用代理
HTTP客户端支持通过HTTPS(HTTP/1.xCONNECT方法,如Squid)代理,或SOCK4,SOCKS5代理访问htts服务器。使用HTTP/1.x代理可以连接HTTP/1.x和HTTP2服务器。可以通过使用HttpClientOptions中的ProxyOptions对象设置代理类型,主机,端口和可选的用户名和密码进行代理设置。
这是一个例子:
HttpClientOptions options = newHttpClientOptions()
.setProxyOptions(new ProxyOptions().setType(ProxyType.HTTP)
.setHost("localhost").setPort(3128)
.setUsername("username").setPassword("secret"));
HttpClient client =vertx.createHttpClient(options);
也可以使用SOCKS5代理
HttpClientOptions options = newHttpClientOptions()
.setProxyOptions(new ProxyOptions().setType(ProxyType.SOCKS5)
.setHost("localhost").setPort(1080)
.setUsername("username").setPassword("secret"));
HttpClient client =vertx.createHttpClient(options);
The DNS resolution is always done on the proxyserver, to achieve the
DNS解析总是在代理服务器上,为了完成SOCK4客户端的功能,需要本地解决DNS地址。
请注意:一般地在使用HTTP时,请求是连接到代理服务器,大多数当然不能工作,因为正确设置的代理会拒绝连接到非安全的端口。这个特性将在下一个版中将被差异地实现,非http请求能代通用的代理请求。
作为一个变通的方法,http代理请求可以象这样执行:
client.get(80, "the-proxy","http://www.google.com", resp -> {});
Verticle中的自动清理
如果在Verticle中创建http服务器和客户端,这此服务器和客户端将在verticle御载时自动关闭。