2010-02-05 40 views
28

我有一個Java服務器,使用ServerSocket打開一個套接字(使用Thrift)。該服務器在Obj-c的本地機器上有一個與Java服務器通信的客戶機。一切都發生在本地主機上。現在,Java服務器在網絡上也是可見的,我希望java服務器只能在本地主機上訪問。否則,這是一個潛在的安全漏洞,當防火牆發出警告時,它會將用戶嚇跑。如何創建只有本地主機的Java套接字?

我嘗試使用InetSocketAddress('localhost',9090)創建服務器套接字,但似乎沒有效果。我該如何限制這個東西到本地主機?

+0

如果服務器的唯一的本地主機上的訪問,如何將客戶端訪問呢?我不明白這個設置。 – 2010-02-05 04:41:06

+1

@Kaleb - 引用這個問題:「這臺服務器在本地機器上有一個客戶端......一切都發生在本地主機上」。 – 2010-02-05 05:05:45

+0

檢查這個問題和給出的答案:[如何確定傳入的連接來自本地機器](http://stackoverflow.com/questions/1542424/how-to-determine-an-incoming-connection-is-from本地機器) – 2010-02-05 04:53:36

回答

20

嘗試

new ServerSocket(9090, 0, InetAddress.getByName("localhost")) 

的最後一個參數構造函數指定監聽套接字綁定到哪個地址。

+6

+1 - 但要記住,有些機器不理解「本地主機」。所以使用IP地址127.0.0.1可能更健壯。 – 2010-02-05 05:11:21

+0

那真的是這個構造函數的工作原理嗎?我已經發布了這個建議,但是在重讀了描述之後,我認爲聽起來好像構造函數只選擇一個網絡連接來接受連接,而不是所有的連接(如果系統有多個網絡設備)。 – 2010-02-05 13:38:29

+3

@Stephen未來可能會導致主要的IPv6甚至IPv6的主機問題。 – 2010-02-05 14:22:18

3
new ServerSocket(9090, 0, InetAddress.getByName(null)); 
37

Taken from another question:

new ServerSocket(9090, 0, InetAddress.getByName(null)); 

InetAddress.getByName(null)點到環回地址(127.0.0.1)

而且here's它說,

+4

在android上試過,getByName(null)不起作用(無論如何,都無法連接到以此方式打開的套接字)。 GetByName方法(「127.0.0。1「)工作,即時工作,是恕我直言,更易於閱讀和'便攜' – 2013-06-03 16:43:03

+1

剛剛發現這一點。有趣的。現在有'InetAddress.getLoopbackAddress() – JayC667 2017-07-11 14:40:58

14

讓我有一種替代解決方案幫腔的Javadoc它只在回送設備上接受。所有其他的「本地主機」解決方案將使Java選擇一個接口。

new ServerSocket(9090, 0, InetAddress.getLoopbackAddress()); 

這是因爲提供的Java 7,甚至不扔UnknownHostException

相關問題