2010-02-05 10 views
28

मेरे पास एक जावा सर्वर है जो सर्वर सॉकेट (इसके साथ थ्रिफ्ट का उपयोग करके) का उपयोग करके सॉकेट खोलता है। इस सर्वर के पास ओबीजे-सी में स्थानीय मशीन पर क्लाइंट है जो जावा सर्वर के साथ संचार करता है। सब कुछ स्थानीयहोस्ट पर होता है। अभी जावा सर्वर भी नेटवर्क पर दिखाई दे रहा है, मैं चाहता हूं कि जावा सर्वर केवल स्थानीयहोस्ट पर पहुंच योग्य हो। अन्यथा यह एक संभावित सुरक्षा भेद्यता है और जब उपयोगकर्ता फ़ायरवॉल उन्हें चेतावनी देता है तो यह उपयोगकर्ताओं को बाहर निकाल देता है।जावा सॉकेट कैसे बनाएं जो केवल स्थानीयहोस्ट है?

मैंने एक InetSocketAddress ('localhost', 9090) का उपयोग कर सर्वर सॉकेट बनाने का प्रयास किया लेकिन ऐसा कोई प्रभाव नहीं पड़ता है। मैं इस चीज़ को लोकहोस्ट पर कैसे सीमित कर सकता हूं?

+0

तो फेंक नहीं है सर्वर के केवल स्थानीय होस्ट पर सुलभ, ग्राहकों है कि यह कैसे पहुंचेंगे? मुझे सेटअप समझ में नहीं आता है। –

+1

@ कालेब - प्रश्न का हवाला देते हुए: "इस सर्वर के पास स्थानीय मशीन पर ग्राहक है ... सबकुछ स्थानीयहोस्ट पर होता है"। –

+0

इस अन्य प्रश्न और दिए गए उत्तरों की जांच करें: [आने वाले कनेक्शन को स्थानीय मशीन से कैसे निर्धारित किया जाए] (http://stackoverflow.com/questions/1542424/how-to-determine-an-incoming-connection-is-from -लोकल-मशीन) –

उत्तर

20

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

निर्माता करने के लिए पिछले पैरामीटर निर्दिष्ट करता है जो करने के लिए सुनने के सॉकेट बाध्य करने के लिए पता की कोशिश करो। लूपबैक पता करने के लिए

+6

+1 - लेकिन ध्यान रखें कि कुछ मशीनें "लोकलहोस्ट" को समझ नहीं पाती हैं। तो आईपी पता 127.0.0.1 का उपयोग शायद अधिक मजबूत है। –

+0

क्या वाकई यह निर्माता काम करता है? मैंने उस सुझाव को पोस्ट किया था, लेकिन विवरण को फिर से पढ़ने के बाद, सोचा कि ऐसा लगता है कि यह कन्स्ट्रक्टर बस उन सभी के बजाय कनेक्शन स्वीकार करने के लिए केवल एक नेटवर्क कनेक्शन चुनता है (यदि सिस्टम में एक से अधिक नेटवर्क डिवाइस हैं)। –

+3

@ स्टीफन जो भविष्य में समस्याओं को मुख्य रूप से आईपीवी 6 या यहां तक ​​कि आईपीवी 6 के साथ भी कर सकता है। –

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

एंड्रॉइड पर कोशिश की, getByName (शून्य) काम नहीं करता है (सॉकेट से कनेक्ट नहीं हो सकता है इस तरह से कोई फर्क नहीं पड़ता)। getByname ("127.0.0।1 ") काम करता है, तुरंत काम करता है और आईएमएचओ अधिक पठनीय और 'पोर्टेबल' –

+1

बस यह पाया। दिलचस्प है। और अब विधि 'InetAddress.getLoopbackAddress()' – JayC667

14

मुझे कोई वैकल्पिक समाधान के साथ झंकार करते हैं जो केवल लूपबैक डिवाइस पर स्वीकार करता है। अन्य सभी "लोकलहोस्ट" समाधान जावा को इंटरफ़ेस चुनने के लिए तैयार करेंगे।

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

यह जावा 7 के बाद से उपलब्ध है, और यहां तक ​​कि UnknownHostException

संबंधित मुद्दे