我使用嵌入式jetty和spring for java进行java通信。我的问题是我的服务器应用程序也必须在同一个端口上处理普通的TCP消息。
有没有办法检测TCP消息是否到达了servlet无法处理的内容?
感谢您的回答我添加了更多细节:
答案 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>