Vert.x 核心模块 HTTP websocket(十一【6】)

客户端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御载时自动关闭。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值