使用jetty接收非Http消息

时间:2016-11-18 23:32:41

标签: java spring http embedded-jetty

我使用嵌入式jetty和spring for java进行java通信。我的问题是我的服务器应用程序也必须在同一个端口上处理普通的TCP消息。

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

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

  • 我无法修改客户端。原因是旧版本的客户端使用纯java tcp套接字,结果证明新服务器必须向后兼容旧客户端。
  • 必须使用相同的端口
  • 旧客户端消息是简单套接字上的短序列化文本。 1:打开连接,2:发送文本,3:关闭连接
  • 我的服务器看起来像这样:http://kielczewski.eu/2013/11/using-embedded-jetty-spring-mvc/
  • 我不需要解析消息。只需检测到没有使用http并获取源主机名的消息即可。

2 个答案:

答案 0 :(得分:2)

您可能需要了解如何将自定义ConnectionFactory添加到HTTP端口的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,表明您不希望jetty将该连接作为HTTP处理。

否则,您将该Connection对象返回给Jetty以作为HTTP进行处理。

答案 1 :(得分:0)

你在这里疯狂骑我的朋友。您需要意识到HTTP IS TCP ...它只是在TCP套接字上发送的内容,它将其分类为HTTP。话虽这么说,你可以用过滤器拦截连接,即

1)为所有传入连接创建一个过滤器(谷歌Java应用服务器过滤器并检查Jetty实现)

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

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

另外请注意,为什么不将https(端口443)用于http和端口80以满足您的套接字需求?

我的立场得到了纠正。过滤器不起作用。 在这种情况下,您将不得不编写一个迷你防火墙。您必须扫描https标头的所有输入并相应地重定向。你能否至少在想要接收的普通TCP消息上提供一些上下文?你对发送代码有什么控制权吗?你知道你可以将TCP / HTTP连接升级到websocket(涉及客户端和服务器),它比普通的TCP,相同的端口连接更好,并且内置Jetty所以没有自定义的锅炉板,只是一个websocket servlet < / p>