2013-06-20 9 views
5

मैं कुछ समय के लिए सॉकेट के बारे में सीख रहा हूं (मैं काफी छोटा हूं) और मुझे लगता है कि मेरे पास जावा सॉकेट पर अच्छी पकड़ है। मैंने एक साधारण मल्टीप्लेयर जावा 2 डी सोशल गेम बनाने का फैसला किया है। मेरा लक्ष्य है कि सर्वर आउटपुट प्लेयर 'एक्स, वाई निर्देशांक और प्रत्येक 10 मिलीसेकंड चैट करें। जो मैंने पढ़ा है, उससे मेरा बहुत ही औसत तर्क मुझे बताता है कि एक समय में केवल एक उपयोगकर्ता सॉकेट से कनेक्ट हो सकता है। तो इसलिए मुझे जोड़ने वाले प्रत्येक खिलाड़ी के लिए एक अलग थ्रेड और सॉकेट की आवश्यकता होगी।क्या मुझे शामिल होने वाले प्रत्येक खिलाड़ी के लिए अलग सॉकेट और थ्रेड चाहिए? [जावा]

क्या प्रति सर्वर एक सर्वर सॉकेट और थ्रेड होना जरूरी है?

+1

हां यह है। एक सर्वर सॉकेट, लेकिन ग्राहकों को संभालने के लिए एकाधिक सॉकेट और थ्रेड। – Thihara

+2

असंबद्ध धागे निर्माण से सावधान रहें! आप धागे की कुल संख्या को बेहतर सीमित कर चुके थे। आपकी सबसे अच्छी शर्त यहां 'निष्पादक सेवा' का उपयोग करना है। – fge

+1

क्या मुझे सिर्फ एक सॉकेट बनाना चाहिए जो कनेक्शन को संभालता है और फिर उपयोगकर्ता को एक अद्वितीय सॉकेट पर निर्देशित करता है? – user2016705

उत्तर

6

आपके पास क्लाइंट के लिए जाने वाले पोर्ट पर केवल एक ServerSocket होना चाहिए। जब कोई ग्राहक सर्वर से कनेक्ट होता है, तो एक नया Socket ऑब्जेक्ट बनाया जाता है और मूल ServerSocket फिर से सुनने के लिए वापस चला जाता है। इसके बाद आपको एक नए Thread को स्पिन करना चाहिए या क्लाइंट से बात करने के वास्तविक काम को Executor पर सौंपना चाहिए, अन्यथा आपका सर्वर क्लाइंट कनेक्शन सुनना बंद कर देगा।

यहां एक बहुत कोड की मूलभूत स्केच है जिसकी आपको आवश्यकता होगी।

import java.net.*; 
import java.util.concurrent.*; 

public class CoordinateServer { 
    public static void main(String... argv) throws Exception { 
    // 'port' is known to the server and the client 
    int port = Integer.valueOf(argv[0]); 
    ServerSocket ss = new ServerSocket(port); 

    // You should decide what the best type of service is here 
    ExecutorService es = Executors.newCachedThreadPool(); 

    // How will you decide to shut the server down? 
    while (true) { 
     // Blocks until a client connects, returns the new socket 
     // to use to talk to the client 
     Socket s = ss.accept(); 

     // CoordinateOutputter is a class that implements Runnable 
     // and sends co-ordinates to a given socket; it's also 
     // responsible for cleaning up the socket and any other 
     // resources when the client leaves 
     es.submit(new CoordinateOutputter(s)); 
    } 
    } 
} 

मैं सॉकेट यहाँ डाल दिया है क्योंकि वे आसानी के साथ आरंभ करने के लिए कर रहे हैं, लेकिन आप शायद java.nio.channels पैकेज की जाँच करना चाहते हो जाएगा एक बार आप यह अच्छी तरह से काम कर रहा है और अपने प्रदर्शन को बेहतर करना चाहते हैं। एक अच्छा ट्यूटोरियल over at IBM है।

+0

आपके उत्तर के लिए धन्यवाद – user2016705

3

हां।

एक सॉकेट दो बिंदुओं (क्लाइंट और सेवर) के बीच कनेक्शन है। इसका मतलब है कि प्रत्येक खिलाड़ी को सर्वर के अंत में अपने सॉकेट कनेक्शन की आवश्यकता होगी।

यदि आप चाहते हैं कि आपका आवेदन किसी भी सार्थक तरीके से उत्तरदायी हो, तो सर्वर पर प्रत्येक आने वाले कनेक्शन को अपने स्वयं के धागे में संसाधित किया जाना चाहिए।

यह उन ग्राहकों को अनुमति देता है जिनके पास धीमी कनेक्शन हो सकती है जो दूसरों के लिए बोतल गर्दन नहीं बनती हैं। इसका यह भी अर्थ है कि यदि कोई ग्राहक कनेक्शन गुम हो जाता है, तो आप टाइम-आउट के लिए प्रतीक्षा किए गए किसी भी अपडेट को बोझ नहीं देते हैं।

+0

आपके उत्तर के लिए धन्यवाद – user2016705

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