使用码头接收非 Http 消息

Receive non Http messages using jetty

我正在使用嵌入式码头和 spring 通过 http 进行 java 到 java 的通信。我的问题是我的服务器应用程序也必须在同一端口上处理纯 TCP 消息。

有没有办法检测是否到达了 servlet 无法处理的 TCP 消息?

感谢您的回答我添加了更多细节:

我的朋友,你正在疯狂地兜风。您需要意识到 HTTP 是 TCP ...它只是在将其分类为 HTTP 的 TCP 套接字上发送的内容。也就是说,您可以使用过滤器拦截连接,即

1) 为所有传入连接创建过滤器(google Java 应用程序服务器过滤器并检查 Jetty 实现)

2) 检查请求的 URI,如果失败,则请求不是 HTTP(可能需要在这里仔细检查请求测试逻辑)

3) 根据串行套接字/http请求将请求重定向到合适的Servlet/Function

另一方面,为什么不对 http 使用 https(端口 443),对套接字要求使用端口 80?


我的意思是正确的。过滤器不起作用。 在这种情况下,您将不得不编写一个迷你防火墙。您必须扫描 https headers 的所有输入并相应地重定向。您能否至少提供一些有关您想要接收的普通 TCP 消息的上下文?您可以控制发送代码吗?你知道你可以将 TCP/HTTP 连接升级到 websocket(涉及客户端和服务器),它甚至比普通 TCP 工作得更好,相同的端口连接,并且内置在 Jetty 中,所以没有自定义样板,只有一个 websocket小服务程序

您可能想看看如何添加 HTTP 端口的自定义 ConnectionFactory to the ServerConnector

这个 ConnectionFactory 概念是 Jetty 目前支持 PROXY 协议的方式。

在你的情况下,你可能有类似...

MyTcpConnectionFactory tcpConnectionFactory = new MyTcpConnectionFactory();
ServerConnector http = new ServerConnector(server);
http.addFirstConnectionFactory(tcpConnectionFactory);
server.addConnector(http);

在您的情况下,您将覆盖 newConnection(Connector connector, EndPoint endPoint) 方法并实施对 TCP 流或 HTTP 流的检查。

如果它是您的流程,您可以自己处理该连接上的通信,然后在完成后抛出 IOException,表明您不希望码头将该连接作为 HTTP 进行处理。

否则你 return Jetty 的 Connection 对象将作为 HTTP 进行处理。