2010-11-27 13 views
11

मैं इस समय कुछ मल्टीप्लेयर गेम विचारों को आजमा रहा हूं और एक वेब ब्राउज़र आधारित मल्टीप्लेयर गेम की सेवा के लिए जावा एप्लिकेशन बनाने की कोशिश कर रहा हूं।जावा वेबस्केट होस्ट?

मेरा विकास पर्यावरण मुख्य मशीन पर ग्रहण है, और इस लैपटॉप पर नोटपैड + Google क्रोम है।

मैं क्लाइंट एंड पर जावास्क्रिप्ट का उपयोग कर वेबस्केट बना रहा हूं, और सर्वर अंत में java.net.Socket का उपयोग कर रहा हूं।

मैं दोनों सिरों पर एक कनेक्शन स्वीकार करने में कामयाब रहा हूं, लेकिन क्लाइंट कनेक्शन बंद करने के बिना उनके बीच किसी भी डेटा को भेजने या प्राप्त करने के लिए प्रतीत नहीं होता है (त्रुटि भी नहीं है; बस कुछ चीज़ों पर अजीब लगता है और सॉकेट.क्लोज़ को कॉल करें)।

क्या किसी के पास कोई विचार है?

यहाँ कुछ कोड है:

ग्राहक:

<script type="text/javascript"> 
var socket; 

function init() { 
    socket = new WebSocket("ws://192.168.0.3:10000"); 
    socket.onopen = function() { alert('OPEN: ' + socket.readyState); } 
    socket.onmessage = function (msg) { alert('DATA: ' + msg.data); } 
    socket.onerror = function (msg) { alert('DATA: ' + msg.data); } 
    socket.onclose = function() { alert('CLOSED: ' + socket.readyState); } 
} 

function onClick() { 
    socket.send("YAY!"); 
} 
</script> 

सर्वर:

public static void main(String args[]) 
{ 
    System.out.printLn("Websocket server test"); 

    ServerSocket connectSocket = null; 

    try 
    { 
     Socket clientSocket; 
     connectSocket = new ServerSocket(10000); 
     System.out.printLn("Waiting for connection..."); 
     clientSocket = connectSocket.accept(); 
     System.out.printLn("Got one!"); 

     PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); 
     BufferedReader in = new BufferedReader(
      new InputStreamReader(clientSocket.getInputStream())); 

     for(int i=0;i<100;i++) //Shit but easy 
     { 
      String data = in.readLine(); 
      System.out.printLn("Got data: " + data); 
      out.printLn("YAY!"); 
     } 
    } 
    catch (IOException e) 
    { 
     System.out.printLn("You fail: " + e.getMessage()); 
    } 

    System.out.printLn("Finished!"); 
} 
+1

क्या कोई कारण है कि आप मौजूदा Websockets सर्वर का उपयोग नहीं करते हैं? –

+0

तैयार किए गए वेबसाइकिल सर्वरों की सूची के लिए यह प्रश्न देखें: http://stackoverflow.com/questions/4278456/websockets-production-ready-server –

उत्तर

10

बल्कि जावा में spec को लागू करने की दर्दनाक रास्ते पर जा रहा से, मेरा सुझाव था कि आप का उपयोग एक मौजूदा समाधान जैसे jWebSocket

यदि आप जावा भूमि छोड़ने से कोई फर्क नहीं पड़ता है, तो मैं यह भी सुझाव दूंगा कि आप अपने सर्वर के लिए Node.js पर एक नज़र डालें।

जावास्क्रिप्ट में सर्वर और क्लाइंट दोनों को करने से आपको बहुत समय और कोड बहुत सारे बचाए जाएंगे, खासकर जब से JSON स्थिर स्थिति में ठीक से फिट नहीं होता है। नोड.जेएस में मल्टीप्लेयर सर्वर भी बनाना मामूली है, क्योंकि ईवेंट आधारित, सिंगल थ्रेडेड मॉडल पूरी चीज को अच्छी तरह से फिट करता है।

वेबसाकेट पर अधिक जानकारी FAQ में मिल सकती है। यदि आप Node.js के साथ प्रारंभ करना चाहते हैं तो TagWiki पर एक नज़र डालें।

बेशर्म प्लग

इस प्रकार है कि Node.js मेरी GitHub page पर एक नज़र डालें का उपयोग कर लिखा गया था दो मल्टीप्लेयर गेम के लिए।

-2

मैं आपको सॉकेट के साथ मदद नहीं कर सकता, लेकिन क्या मैं आपको आरएमआई तकनीक का उपयोग करने का सुझाव दे सकता हूं? मैं जावा में एक मल्टीप्लेयर आरपीजी बनाने की कोशिश कर रहा हूं, और मैं सर्वर और क्लाइंट के बीच रिमोट विधि आमंत्रण का उपयोग कर रहा हूं (यह सर्वर से क्लाइंट को कॉल-बैक भी संभव है)। यह वास्तव में इसका उपयोग आसान है, लेकिन यह यूडीपी के बजाय टीसीपी का उपयोग करता है। लैन अनुभव में इंटरनेट पर कोई अंतराल नहीं है, मैंने अभी तक कोशिश नहीं की है। हालांकि, अगर आपका गेम अनुरोध और प्रतिक्रिया के बीच थोड़ा सा मंद रहता है, तो कोई समस्या नहीं है। यह मेरी परियोजना का लिंक है, क्लाइंट और सर्वर कक्षाएं आपके लिए उपयोगी हो सकती हैं। https://github.com/mrniko/netty-socketio

उच्च प्रदर्शन सॉकेट Netty lib के आधार पर -

2

इस lib का प्रयास करें। यह सॉकेट.आईओ सर्वर के नवीनतम प्रोटोकॉल का समर्थन करता है। वेबसाकेट सहित कई ट्रांसपोर्ट।

वेब तरफ Socket.IO ग्राहक जावास्क्रिप्ट lib का उपयोग करें: Bristleback Server:

<script type="text/javascript"> 
    var socket = io.connect('http://localhost:81', { 
     'transports' : [ 'websocket' ], 
     'reconnection delay' : 2000, 
     'force new connection' : true 
    }); 
    socket.on('message', function(data) { 
     // here is your handler on messages from server 
    }); 

    // send object to server 
    var obj = ... 
    socket.json.send(obj); 
</script> 
2

मैं अपने उच्च स्तर के समाधान का सुझाव देते हैं। इसमें सर्वर और क्लाइंट दोनों शामिल हैं, आप कई मौजूदा निम्न स्तरीय वेबसॉकेट इंजनों (जैसे जेटी, नेटटी या टॉमकैट) से चुन सकते हैं, ब्रिस्टलबैक के साथ विकास बेहद तेज़ और आसान है। हालांकि, यह अभी भी बीटा है और हम अंतिम 1.0.0 संस्करण जारी करने के लिए कड़ी मेहनत कर रहे हैं। यदि आप मेवेन का उपयोग करते हैं, तो हमने वेब एप्लिकेशन का उपयोग करने के लिए तैयार एक आर्केटाइप प्रदान किया है।

मैं ब्रिस्टलबैक सर्वर के सह-निर्माता में से एक हूं।

1

जैसा कि किसी ने अभी तक वास्तव में आपके प्रश्न का उत्तर नहीं दिया है: कारण यह काम नहीं करता है, क्योंकि यह वेबसाइकिल विनिर्देश लागू नहीं कर रहा है। सॉकेट खोलने के बजाय उचित वेबस्केट कनेक्शन सेट अप करने में बहुत अधिक काम होता है, क्योंकि वेबस्क्रिप्ट कनेक्शन सेटअप HTTP अपग्रेड अनुरोध के साथ शुरू होता है। आपका ग्राहक कनेक्शन बंद कर रहा है, क्योंकि इसे अपग्रेड अनुरोध पर प्रारंभ करने के लिए सकारात्मक उत्तर नहीं मिलता है।

+0

इवो वेटज़ेल ने सात साल पहले इस प्रभाव का जवाब दिया था। –

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