我成立了Thrift來構建兩個實體和相應的服務。我爲C#生成了代碼,爲服務器創建了一個小型控制檯應用程序,爲測試客戶端創建了另一個控制檯應用程序。我跑在我的本地機器上,它像一個魅力。但是,在運行Windows Server 2012的Azure VM上部署服務器時,如果在端口9090上爲TCP創建端點,則我的客戶端無法連接。有一個超時。Apache Thrift遠程服務超時
SO上的相似問題:This one is about a php library specific problem和this one is about two linux machines。後者接近我的問題,但我可以想象我的問題是Windows或Azure虛擬機特定的問題。
我使用NuGet的Thrift 0.9.0.0。我試過SimpleServer和ThreadPoolServer。這是我的服務器上做什麼:
Thrift.Server.TServer server = new Thrift.Server.TThreadPoolServer(new TodoThriftService.Processor(new TodoThriftServiceHandler()), new TServerSocket(9090));
這是我做的客戶端上的內容:
TodoThriftService.Client client = new TodoThriftService.Client(new TBinaryProtocol(new TSocket("my.host.com", 9090)));
我也嘗試了服務器的IP地址,而不是它的主機名,但它也沒有工作。
的netstat -an輸出爲:從遠程登錄
TCP 0.0.0.0:9090 0.0.0.0:0 LISTENING
輸出從客戶端(遠程登錄my.host.com 9090):
Verbindungsaufbau zu my.host.com...Es konnte keine Verbindung mit dem Host hergestellt werden, auf Port 9090: Verbindungsfehler
哪個是德語 「連接錯誤」。
當我訪問服務器上的http://canyouseeme.org/,檢查端口9090的輸出是:
Error: I could not see your service on 123.34.567.890 on port (9090). Reason: Connection timed out
當我在服務器上的嗅探數據包使用Wireshark的輸出是:
1 0.000000000 12.3.456.78 12.34.567.89 TCP 66 53566 > websm [SYN] Seq=0 Win=8192 Len=0 MSS=1452 WS=256 SACK_PERM=1
而且兩次重傳。
注意:Wireshark中顯示的目標IP與canyouseeme.org確定的IP不同。
另請注意:來自我的測試客戶端以及來自canyouseeme.org的連接嘗試都顯示在Wireshark中。
我的服務器控制檯應用程序是否做錯了什麼?它在我的本地機器上正常工作。
當有人報告問題時使用得最多的句子:「*是的,但它在我的本地機器上工作正常!*」。我希望,我每次聽到它都會得到一美元。 =>§1您的開發環境極不可能匹配所需的產品環境。你將擁有更少的權利,更少的權限,可能會有更少的事情被允許執行,因爲環境可能被鎖定和/或更好的防火牆。唯一的建議是找出連接被阻塞的原因。我認爲canyouseeme可能是對的。 – JensG
那麼,當然環境不同,但這不是重點(我沒有聲稱其他任何東西)。當我(和其他人)指出某些東西在本地機器上有效時,那麼這對於願意幫助的人來說不僅僅是有用而且必要的信息,因此他們知道哪些是有效的,哪些不會,並且縮小問題的可能來源。不是嗎?或者它只是困擾你的黑體部分? - >改變它。 – phlow