2016-11-18 46 views
0

我正在使用嵌入式jetty和spring来通过http与java进行java通信。我的问题是我的服务器应用程序必须处理同一端口上的普通TCP消息。使用jetty接收非Http消息

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

谢谢你的答案我想补充一些细节:

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

您提出的任何解决方案都需要您自己的高度自定义的“ServerConnector”实现来预先分析传入的信息,以了解其HTTP/0.9,HTTP/1.0,HTTP/1.1,HTTP/2或Raw TCP,然后在Jetty(对于http)或您的应用程序(如果不是http)中调用适当的图层。出于好奇,为什么不使用WebSocket呢? –

回答

1

您可能想看看如何将自定义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流量。

如果它是你的流,你自己处理那个连接上的通信,然后当你完成时指出你不希望jetty将该连接作为HTTP进行处理时抛出一个IOException。

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

0

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

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

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

3)重定向基于串行插座/ HTTP请求的请求到合适的Servlet /功能

在另一个说明中,为什么不在你的套接字中使用https(端口443)作为http和80端口需求?


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

+0

如果它达到过滤器的检测点,则它被检测为HTTP请求(已解析,验证头文件,识别上下文,以及调用适当的过滤器链和servlet)。否则,它会失败的HTTP解析步骤,并导致自动立即'400错误请求错误响应(和关闭连接) –

+0

非常真实的,错过了 –