使用码头接收非 Http 消息
Receive non Http messages using jetty
我正在使用嵌入式码头和 spring 通过 http 进行 java 到 java 的通信。我的问题是我的服务器应用程序也必须在同一端口上处理纯 TCP 消息。
有没有办法检测是否到达了 servlet 无法处理的 TCP 消息?
感谢您的回答我添加了更多细节:
- 我无法修改客户端。原因是老版本客户端使用的是纯java tcp socket,结果发现新服务器必须向后兼容老客户端。
- 必须使用同一个端口
- 旧客户端消息是简单套接字上的短序列化文本。 1:打开连接,2:发送文本,3:关闭连接
- 我的服务器看起来像这样:http://kielczewski.eu/2013/11/using-embedded-jetty-spring-mvc/
- 我不需要解析邮件。检测到未使用 http 的消息到达并获取源主机名就足够了。
我的朋友,你正在疯狂地兜风。您需要意识到 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 进行处理。
我正在使用嵌入式码头和 spring 通过 http 进行 java 到 java 的通信。我的问题是我的服务器应用程序也必须在同一端口上处理纯 TCP 消息。
有没有办法检测是否到达了 servlet 无法处理的 TCP 消息?
感谢您的回答我添加了更多细节:
- 我无法修改客户端。原因是老版本客户端使用的是纯java tcp socket,结果发现新服务器必须向后兼容老客户端。
- 必须使用同一个端口
- 旧客户端消息是简单套接字上的短序列化文本。 1:打开连接,2:发送文本,3:关闭连接
- 我的服务器看起来像这样:http://kielczewski.eu/2013/11/using-embedded-jetty-spring-mvc/
- 我不需要解析邮件。检测到未使用 http 的消息到达并获取源主机名就足够了。
我的朋友,你正在疯狂地兜风。您需要意识到 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 进行处理。