摘要:
在使用Java SE 11构建Websocket服务器时,我需要一些帮助。 尤其需要从http请求中获取tcp套接字连接并将其分配给websocket客户端。 ,因为Java SE支持Websocket客户端,但不支持服务器。 通过传输套接字连接,websocket客户端将成为websocket端点 。 (下面有详细说明。)
我当前正在使用java.net.http Websocket客户端(Java SE),并且已经使用com.sun.net.httpserver构建了自定义HTTP服务器。我对协议有很深的了解,但是对Java类来说是新知识。我相信答案是在“幕后”。也许有比我怀疑的更简单的方法。
这里的目标是尽可能多地依赖Java SE组件。导致基本的小型嵌入式HTTP和Websocket功能。要求不能使用第三方解决方案。
详细说明:
HTTP和Websocket进程以相同的方式开始。客户端组件从服务器组件请求套接字连接(tcp)。成功后,客户端以HTTP标头的形式发送详细的请求信息。如果请求包含名称/值对upgrade: websocket
,则服务器可以识别Websocket连接的请求。这样可以轻松在同一端口上集成HTTP和Websocket服务器。
如果没有升级请求,则整个请求将以熟悉的HTTP请求-响应周期进行处理。如果请求中包含upgrade: websocket
,则成功的“握手”会在客户端WebSocket流程中导致open
事件。这两个过程都依赖于基础套接字连接来完成或继续通信。
对于websocket,打开连接后,客户端和服务器之间的区别结束。客户端发出套接字请求,后跟请求详细信息。服务器使用服务器套接字监听请求。连接后,它们都将成为endpoints
,能够通过已建立的连接发送和接收消息。
我的HTTP服务器组件侦听套接字连接请求,然后在标头中检查upgrade: websocket
。我有自己的代码,可以根据Websocket协议完成连接请求“握手”。
为了将我的Websocket客户端变成端点,需要做的是将Socket从HTTP服务器组件传输到Websocket。我正在寻求有关如何执行此操作的帮助。
小更新:我自己继续工作-今天从Zulu OpenJDK获取了一些Websocket源代码... Websocket端使用java.nio SocketChannel。但是我在私人内部类中发现了这一点。我开始对这种新东西的设计产生不好的感觉。