2016-11-18 49 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

非常真實的,錯過了 –