paint-brush
यूनिटी रीयलटाइम मल्टीप्लेयर, भाग 2: टीसीपी, यूडीपी, वेबसॉकेट प्रोटोकॉलद्वारा@dmitrii
3,412 रीडिंग
3,412 रीडिंग

यूनिटी रीयलटाइम मल्टीप्लेयर, भाग 2: टीसीपी, यूडीपी, वेबसॉकेट प्रोटोकॉल

द्वारा Dmitrii Ivashchenko16m2023/08/06
Read on Terminal Reader

बहुत लंबा; पढ़ने के लिए

2023 श्रृंखला में यूनिटी नेटवर्किंग लैंडस्केप वास्तविक समय मल्टीप्लेयर गेम में डेटा ट्रांसमिशन प्रोटोकॉल पर ध्यान केंद्रित करने के साथ जारी है। खिलाड़ियों के बीच इष्टतम डेटा विनिमय के लिए टीसीपी और यूडीपी के साथ ओएसआई मॉडल की ट्रांसपोर्ट लेयर की खोज की गई है। टीसीपी विश्वसनीय डेटा डिलीवरी सुनिश्चित करता है लेकिन इसमें देरी हो सकती है, जबकि यूडीपी संभावित डेटा हानि के साथ तेज़ ट्रांसमिशन प्रदान करता है। वेबसॉकेट, टीसीपी पर आधारित एक एप्लिकेशन-स्तरीय प्रोटोकॉल है, जो लगातार द्विदिश संचार को सक्षम बनाता है और वास्तविक समय मल्टीप्लेयर गेम के लिए उपयुक्त है। टीसीपी और यूडीपी क्लाइंट और सर्वर के साथ-साथ वेबसॉकेट क्लाइंट और सर्वर के लिए कोड उदाहरण कार्यान्वयन दृष्टिकोण को दर्शाते हैं। प्रोटोकॉल का चुनाव खेल की आवश्यकताओं पर निर्भर करता है - विश्वसनीयता के लिए टीसीपी, गति के लिए यूडीपी, और द्विदिश संचार के लिए वेबसॉकेट। अगला लेख यूडीपी का उपयोग करके विश्वसनीय डेटा ट्रांसमिशन के आयोजन पर चर्चा करेगा।
featured image - यूनिटी रीयलटाइम मल्टीप्लेयर, भाग 2: टीसीपी, यूडीपी, वेबसॉकेट प्रोटोकॉल
Dmitrii Ivashchenko HackerNoon profile picture
0-item
1-item


2023 में यूनिटी नेटवर्किंग लैंडस्केप पर मेरे लेखों की श्रृंखला जारी है! आज की पोस्ट वास्तविक समय मल्टीप्लेयर गेम में उपयोग किए जाने वाले डेटा ट्रांसमिशन प्रोटोकॉल को कवर करेगी।


हर किसी को अभिवादन! मैं दिमित्री इवाशेंको, MY.GAMES में लीड सॉफ्टवेयर इंजीनियर हूं। हम नेटवर्क इंटरैक्शन के विभिन्न स्तरों पर कौन से प्रोटोकॉल मौजूद हैं, इसके संक्षिप्त अवलोकन के साथ शुरुआत करेंगे।


सामग्री अवलोकन

  • ओएसआई स्तर
  • प्रसारण नियंत्रण प्रोटोकॉल
    • टीसीपी क्लाइंट
    • टीसीपी सर्वर
  • डेटाग्राम प्रोटेकॉलका उपयोग करें
    • यूडीपी क्लाइंट
    • यूडीपी सर्वर
  • वेबसोकेट
    • वेबसॉकेट क्लाइंट
    • वेबसॉकेट सर्वर
  • निष्कर्ष


ओएसआई स्तर

ओएसआई (ओपन सिस्टम इंटरकनेक्शन) मॉडल एक वैचारिक मॉडल है जो अमूर्त स्तरों के संदर्भ में संचार प्रणाली के कार्यों को चिह्नित और मानकीकृत करता है। यह मॉडल 1978 में अंतर्राष्ट्रीय मानकीकरण संगठन (आईएसओ) द्वारा विकसित किया गया था।

इसमें सात परतें होती हैं:


  1. भौतिक परत : यह परत चैनल पर कच्चे बिट्स के संचरण और स्वागत से संबंधित है। इस परत पर प्रोटोकॉल भौतिक इंटरफ़ेस और माध्यम की विशेषताओं का वर्णन करते हैं, जिसमें बिट प्रतिनिधित्व, ट्रांसमिशन दर, भौतिक केबल, कार्ड और कनेक्टर डिज़ाइन शामिल हैं।


  2. डेटा लिंक परत : यह परत भौतिक माध्यम में डेटा स्थानांतरण प्रदान करती है और भौतिक स्तर पर होने वाली त्रुटियों को संभालती है।


  3. नेटवर्क परत : यह परत नेटवर्क के बीच डेटा ट्रांसमिशन के लिए पथ (रूटिंग) निर्धारित करती है।


  4. ट्रांसपोर्ट परत : यह परत बिंदुओं के बीच संदेश वितरण का प्रबंधन करती है और यदि आवश्यक हो तो विश्वसनीयता प्रदान करती है।


  5. सत्र परत : यह परत उपयोगकर्ताओं और अनुप्रयोगों के बीच सत्र स्थापना, रखरखाव और समाप्ति का प्रबंधन करती है।


  6. प्रस्तुति परत : यह परत प्रेषक और रिसीवर पक्षों पर डेटा प्रतिनिधित्व (एन्कोडिंग) में अंतर से डेटा की स्वतंत्रता सुनिश्चित करती है।


  7. एप्लिकेशन परत : इस परत में ऐसे प्रोटोकॉल शामिल होते हैं जिनका उन एप्लिकेशन से सीधा संबंध होता है जिनके साथ उपयोगकर्ता इंटरैक्ट करता है।



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


प्रसारण नियंत्रण प्रोटोकॉल

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


कनेक्शन स्थापित करने में निम्नलिखित चरण शामिल हैं:


  • क्लाइंट और सर्वर टीसीपी पर डेटा के आदान-प्रदान के लिए सॉकेट बनाते हैं।
  • क्लाइंट एक निर्दिष्ट गंतव्य पोर्ट के साथ सर्वर पर एक SYN (सिंक्रनाइज़ेशन) सेगमेंट भेजता है।
  • सर्वर SYN सेगमेंट को स्वीकार करता है, अपना स्वयं का सॉकेट बनाता है, और क्लाइंट को एक SYN-ACK (सिंक्रनाइज़ेशन-पावती) सेगमेंट भेजता है।
  • क्लाइंट SYN-ACK सेगमेंट को स्वीकार करता है और कनेक्शन स्थापना प्रक्रिया को पूरा करने के लिए सर्वर पर एक ACK (पावती) सेगमेंट भेजता है। अब एक विश्वसनीय दोतरफा कनेक्शन स्थापित हो गया है।





टीसीपी क्लाइंट

नीचे दिया गया उदाहरण टीसीपी क्लाइंट का बुनियादी कार्यान्वयन दिखाता है और इसे विशिष्ट डेटा और गेम लॉजिक के साथ काम करने के लिए बढ़ाया जा सकता है।


कोड एक निर्दिष्ट आईपी पते और पोर्ट के साथ सर्वर से जुड़ता है, और फिर कनेक्शन के माध्यम से डेटा भेजता और प्राप्त करता है। सर्वर से एसिंक्रोनस डेटा रिसेप्शन के लिए नेटवर्क स्ट्रीम का उपयोग किया जाता है।


 using System; using System.Net; using System.Net.Sockets; using UnityEngine; public class TCPClient : MonoBehaviour { private TcpClient tcpClient; private NetworkStream networkStream; private byte[] receiveBuffer; private void Start() { // Example: Connect to server with IP address 127.0.0.1 (localhost) and port 5555 ConnectToServer("127.0.0.1", 5555); } private void ConnectToServer(string ipAddress, int port) { tcpClient = new TcpClient(); tcpClient.Connect(IPAddress.Parse(ipAddress), port); networkStream = tcpClient.GetStream(); // Start asynchronous operation to receive data from the server receiveBuffer = new byte[tcpClient.ReceiveBufferSize]; networkStream.BeginRead(receiveBuffer, 0, receiveBuffer.Length, ReceiveData, null); } private void ReceiveData(IAsyncResult result) { int bytesRead = networkStream.EndRead(result); byte[] receivedBytes = new byte[bytesRead]; Array.Copy(receiveBuffer, receivedBytes, bytesRead); string receivedMessage = System.Text.Encoding.UTF8.GetString(receivedBytes); Debug.Log("Received from server: " + receivedMessage); // Continue the asynchronous operation to receive data networkStream.BeginRead(receiveBuffer, 0, receiveBuffer.Length, ReceiveData, null); } private void SendData(string message) { byte[] sendBytes = System.Text.Encoding.UTF8.GetBytes(message); networkStream.Write(sendBytes, 0, sendBytes.Length); networkStream.Flush(); } }


विधि ConnectToServer(string ipAddress, int port) निर्दिष्ट आईपी पते और पोर्ट पर सर्वर से कनेक्शन स्थापित करती है। सर्वर से डेटा रिसेप्शन ReceiveData(IAsyncResult result) विधि में किया जाता है, जबकि डेटा ट्रांसमिशन SendData(string message) विधि में किया जाता है। प्राप्त डेटा Debug.Log का उपयोग करके कंसोल पर आउटपुट होता है।


टीसीपी सर्वर

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


विधि StartServer(int port) निर्दिष्ट पोर्ट पर सर्वर को प्रारंभ करती है और आने वाले कनेक्शनों को सुनना शुरू करती है। जब क्लाइंट कनेक्शन स्थापित होता है, तो HandleIncomingConnection(IAsyncResult result) विधि निष्पादित होती है, जो क्लाइंट से डेटा प्राप्त करती है और डेटा प्राप्त करने के लिए एक एसिंक्रोनस ऑपरेशन शुरू करती है।


प्राप्त डेटा को ReceiveData(IAsyncResult result) विधि में संसाधित किया जाता है। क्लाइंट से डेटा प्राप्त करने के बाद, सर्वर आवश्यक प्रोसेसिंग कर सकता है या क्लाइंट को डेटा वापस भेज सकता है।


SendData(string message) विधि नेटवर्क स्ट्रीम के माध्यम से क्लाइंट को डेटा भेजती है। डेटा को बाइट ऐरे में परिवर्तित किया जाता है और क्लाइंट को भेजा जाता है।


 using System; using System.Net; using System.Net.Sockets; using UnityEngine; public class TCPServer : MonoBehaviour { private TcpListener tcpListener; private TcpClient connectedClient; private NetworkStream networkStream; private byte[] receiveBuffer; private void Start() { // Example: Start the server on port 5555 StartServer(5555); } private void StartServer(int port) { tcpListener = new TcpListener(IPAddress.Any, port); tcpListener.Start(); Debug.Log("Server started. Waiting for connections..."); // Start accepting client connections asynchronously tcpListener.BeginAcceptTcpClient(HandleIncomingConnection, null); } }


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


फिर, विधि कनेक्टेड क्लाइंट से प्राप्त बफर आकार के आधार पर, डेटा प्राप्त करने के लिए एक बफर बनाती है। निर्मित बफ़र का उपयोग करके स्ट्रीम से डेटा पढ़ने के लिए एक अतुल्यकालिक ऑपरेशन लॉन्च किया गया है। रीड ऑपरेशन पूरा होने के बाद, डेटा को आगे की प्रक्रिया के लिए ReceiveData विधि में भेज दिया जाएगा।


साथ ही, विधि अगले क्लाइंट को स्वीकार करने की संभावना के लिए आने वाले कनेक्शन को स्वीकार करने के लिए एक और अतुल्यकालिक ऑपरेशन लॉन्च करती है।


जब कोई क्लाइंट सर्वर से कनेक्ट होता है, तो कनेक्शन को संभालने के लिए इस विधि को बुलाया जाएगा, और सर्वर अगले क्लाइंट को एसिंक्रोनस रूप से स्वीकार करने के लिए तैयार होगा।


 private void HandleIncomingConnection(IAsyncResult result) { connectedClient = tcpListener.EndAcceptTcpClient(result); networkStream = connectedClient.GetStream(); Debug.Log("Client connected: " + connectedClient.Client.RemoteEndPoint); // Start asynchronous operation to receive data from the client receiveBuffer = new byte[connectedClient.ReceiveBufferSize]; networkStream.BeginRead(receiveBuffer, 0, receiveBuffer.Length, ReceiveData, null); // Accept next client connection asynchronously tcpListener.BeginAcceptTcpClient(HandleIncomingConnection, null); }


ReceiveData पद्धति का उपयोग क्लाइंट से प्राप्त डेटा को संसाधित करने के लिए किया जाता है। डेटा रीडिंग ऑपरेशन पूरा होने के बाद, विधि पढ़े गए बाइट्स की संख्या की जांच करती है। यदि बाइट्स की संख्या शून्य से कम या उसके बराबर है, तो इसका मतलब है कि क्लाइंट डिस्कनेक्ट हो गया है। इस स्थिति में, विधि क्लाइंट के साथ कनेक्शन बंद कर देती है और निष्पादन समाप्त कर देती है।


यदि पढ़े गए बाइट्स की संख्या शून्य से अधिक है, तो विधि प्राप्त डेटा के लिए एक बाइट सरणी बनाती है और पढ़े गए डेटा को इस सरणी में कॉपी करती है। फिर, विधि प्राप्त बाइट्स को UTF-8 एन्कोडिंग का उपयोग करके एक स्ट्रिंग में परिवर्तित करती है और प्राप्त संदेश को कंसोल पर आउटपुट करती है।


 private void ReceiveData(IAsyncResult result) { int bytesRead = networkStream.EndRead(result); if (bytesRead <= 0) { Debug.Log("Client disconnected: " + connectedClient.Client.RemoteEndPoint); connectedClient.Close(); return; } byte[] receivedBytes = new byte[bytesRead]; Array.Copy(receiveBuffer, receivedBytes, bytesRead); string receivedMessage = System.Text.Encoding.UTF8.GetString(receivedBytes); Debug.Log("Received from client: " + receivedMessage); // Process received data // Continue the asynchronous operation to receive data networkStream.BeginRead(receiveBuffer, 0, receiveBuffer.Length, ReceiveData, null); } private void SendData(string message) { byte[] sendBytes = System.Text.Encoding.UTF8.GetBytes(message); networkStream.Write(sendBytes, 0, sendBytes.Length); networkStream.Flush(); Debug.Log("Sent to client: " + message); }


क्लाइंट को डेटा भेजने के लिए SendData विधि का उपयोग किया जाता है। यह UTF-8 एन्कोडिंग का उपयोग करके संदेश स्ट्रिंग को बाइट सरणी में परिवर्तित करता है और इस सरणी को नेटवर्क स्ट्रीम पर लिखता है। डेटा भेजने के बाद, विधि स्ट्रीम को साफ़ करती है और भेजे गए संदेश को कंसोल पर आउटपुट करती है।

हालाँकि विश्वसनीयता एक बड़े लाभ की तरह लग सकती है, यह टीसीपी सुविधा वास्तविक समय के मल्टीप्लेयर गेम में समस्याएँ पैदा कर सकती है। टीसीपी में डेटा ट्रांसमिशन को रीट्रांसमिशन और फ्लो कंट्रोल के तंत्र द्वारा धीमा किया जा सकता है, जिससे देरी या "लैग्स" हो सकता है।


डेटाग्राम प्रोटेकॉलका उपयोग करें

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



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


यूडीपी क्लाइंट

यह कोड यूनिटी में यूडीपी क्लाइंट के बुनियादी कार्यान्वयन को प्रदर्शित करता है। StartUDPClient विधि यूडीपी क्लाइंट को प्रारंभ करती है और इसे आईपी पते और पोर्ट द्वारा निर्दिष्ट रिमोट सर्वर से जोड़ती है। क्लाइंट BeginReceive विधि का उपयोग करके अतुल्यकालिक रूप से डेटा प्राप्त करना शुरू करता है और SendData विधि का उपयोग करके सर्वर को एक संदेश भेजता है।


 using System; using System.Net; using System.Net.Sockets; using UnityEngine; public class UDPExample : MonoBehaviour { private UdpClient udpClient; private IPEndPoint remoteEndPoint; private void Start() { // Example: Start the UDP client and connect to the remote server StartUDPClient("127.0.0.1", 5555); } private void StartUDPClient(string ipAddress, int port) { udpClient = new UdpClient(); remoteEndPoint = new IPEndPoint(IPAddress.Parse(ipAddress), port); // Start receiving data asynchronously udpClient.BeginReceive(ReceiveData, null); // Send a message to the server SendData("Hello, server!"); } private void ReceiveData(IAsyncResult result) { byte[] receivedBytes = udpClient.EndReceive(result, ref remoteEndPoint); string receivedMessage = System.Text.Encoding.UTF8.GetString(receivedBytes); Debug.Log("Received from server: " + receivedMessage); // Continue receiving data asynchronously udpClient.BeginReceive(ReceiveData, null); } private void SendData(string message) { byte[] sendBytes = System.Text.Encoding.UTF8.GetBytes(message); // Send the message to the server udpClient.Send(sendBytes, sendBytes.Length, remoteEndPoint); Debug.Log("Sent to server: " + message); } }

जब सर्वर से डेटा प्राप्त होता है, तो ReceiveData विधि लागू होती है, जो प्राप्त बाइट्स को संसाधित करती है और उन्हें एक स्ट्रिंग में परिवर्तित करती है। फिर प्राप्त संदेश को कंसोल पर लॉग किया जाता है। BeginReceive दोबारा कॉल करके क्लाइंट असिंक्रोनस रूप से डेटा प्राप्त करना जारी रखता है।

SendData विधि संदेश को बाइट्स में परिवर्तित करती है और यूडीपी क्लाइंट की Send विधि का उपयोग करके सर्वर पर भेजती है।


यूडीपी सर्वर

यह कोड यूनिटी में यूडीपी सर्वर के बुनियादी कार्यान्वयन को प्रदर्शित करता है। StartUDPServer विधि निर्दिष्ट पोर्ट पर यूडीपी सर्वर को आरंभ करती है और BeginReceive विधि का उपयोग करके अतुल्यकालिक रूप से डेटा प्राप्त करना शुरू करती है।


जब क्लाइंट से डेटा प्राप्त होता है, तो ReceiveData विधि लागू की जाती है, जो प्राप्त बाइट्स को संसाधित करती है और उन्हें एक स्ट्रिंग में परिवर्तित करती है। फिर प्राप्त संदेश को कंसोल पर लॉग किया जाता है। BeginReceive फिर से कॉल करके सर्वर असिंक्रोनस रूप से डेटा प्राप्त करना जारी रखता है।


 using System; using System.Net; using System.Net.Sockets; using UnityEngine; public class UDPServer : MonoBehaviour { private UdpClient udpServer; private IPEndPoint remoteEndPoint; private void Start() { // Example: Start the UDP server on port 5555 StartUDPServer(5555); } private void StartUDPServer(int port) { udpServer = new UdpClient(port); remoteEndPoint = new IPEndPoint(IPAddress.Any, port); Debug.Log("Server started. Waiting for messages..."); // Start receiving data asynchronously udpServer.BeginReceive(ReceiveData, null); } private void ReceiveData(IAsyncResult result) { byte[] receivedBytes = udpServer.EndReceive(result, ref remoteEndPoint); string receivedMessage = System.Text.Encoding.UTF8.GetString(receivedBytes); Debug.Log("Received from client: " + receivedMessage); // Process the received data // Continue receiving data asynchronously udpServer.BeginReceive(ReceiveData, null); } private void SendData(string message, IPEndPoint endPoint) { byte[] sendBytes = System.Text.Encoding.UTF8.GetBytes(message); // Send the message to the client udpServer.Send(sendBytes, sendBytes.Length, endPoint); Debug.Log("Sent to client: " + message); } }


SendData विधि क्लाइंट के पते और पोर्ट का प्रतिनिधित्व करने वाला एक संदेश और एक IPEndPoint लेती है। यह संदेश को बाइट्स में परिवर्तित करता है और यूडीपी सर्वर की Send विधि का उपयोग करके क्लाइंट को भेजता है।


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


वेबसॉकेट

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


वेबसॉकेट टीसीपी पर आधारित एक एप्लिकेशन-स्तरीय प्रोटोकॉल है। यह संदेशों का समर्थन करता है, स्ट्रीम का नहीं, जो इसे नियमित टीसीपी से अलग करता है। वेबसॉकेट में अतिरिक्त कार्यक्षमता शामिल है जो कुछ प्रदर्शन ओवरहेड जोड़ सकती है।


यहां बताया गया है कि यह कैसे काम करता है, चरण दर चरण:


  • क्लाइंट एक विशेष HTTP अनुरोध भेजता है जिसे "अपग्रेड अनुरोध" कहा जाता है। यह अनुरोध सर्वर को सूचित करता है कि क्लाइंट WebSocket पर स्विच करना चाहता है।


  • यदि सर्वर वेबसॉकेट का समर्थन करता है और स्विच करने के लिए सहमत होता है, तो यह एक विशेष HTTP प्रतिक्रिया के साथ प्रतिक्रिया करता है जो वेबसॉकेट में अपग्रेड की पुष्टि करता है।


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


  • अब क्लाइंट और सर्वर किसी भी समय संदेश भेज और प्राप्त कर सकते हैं। प्रत्येक वेबसॉकेट संदेश "फ़्रेम" में लपेटा गया है जो इंगित करता है कि संदेश कब शुरू और समाप्त होता है। यह ब्राउज़र और सर्वर को संदेशों की सही ढंग से व्याख्या करने की अनुमति देता है, भले ही वे मिश्रित क्रम में आते हों या नेटवर्क समस्याओं के कारण भागों में विभाजित हो गए हों।




कोई भी पक्ष किसी भी समय एक विशेष "क्लोज़ कनेक्शन" फ़्रेम भेजकर कनेक्शन बंद कर सकता है। दूसरा पक्ष बंद होने की पुष्टि के साथ जवाब दे सकता है, और उसके बाद, दोनों पक्षों को तुरंत कोई अन्य डेटा भेजना बंद करना होगा। स्थिति कोड का उपयोग बंद करने का कारण बताने के लिए भी किया जा सकता है।

वेबसॉकेट क्लाइंट

नीचे दिया गया कोड C# भाषा और WebSocketSharp लाइब्रेरी का उपयोग करके यूनिटी में WebSocket क्लाइंट को लागू करने का एक उदाहरण प्रदान करता है।


Start() विधि में, जिसे ऑब्जेक्ट इनिशियलाइज़ेशन पर कहा जाता है, WebSocket का एक नया उदाहरण बनाया जाता है, जिसे आपके वेबसॉकेट सर्वर के पते के साथ आरंभ किया जाता है।


उसके बाद, इवेंट हैंडलर OnOpen और OnMessage सेट किए जाते हैं।


 using UnityEngine; using WebSocketSharp; public class WebSocketClient : MonoBehaviour { private WebSocket ws; void Start() { ws = new WebSocket("ws://your-websocket-server-url/Auth"); ws.OnOpen += OnOpenHandler; ws.OnMessage += OnMessageHandler; ws.ConnectAsync(); } private void OnOpenHandler(object sender, System.EventArgs e) { var data = "Player1"; ws.Send(data) } private void OnMessageHandler(object sender, MessageEventArgs e) { Debug.Log("WebSocket server said: " + e.Data); } }


सर्वर के साथ कनेक्शन स्थापित होने पर OnOpen ट्रिगर हो जाता है। इस उदाहरण में, जब कनेक्शन स्थापित होता है, तो "प्लेयर1" टेक्स्ट वाला एक संदेश सर्वर पर भेजा जाता है।


जब सर्वर से कोई संदेश प्राप्त होता है तो OnMessage चालू हो जाता है। यहां संदेश प्राप्त होने पर उसकी सामग्री कंसोल में प्रदर्शित होती है।


फिर, ConnectAsync() विधि को कॉल किया जाता है, जो एसिंक्रोनस रूप से सर्वर से कनेक्ट होता है।


वेबसॉकेट सर्वर

नीचे दिया गया कोड वेबसॉकेट सर्वर बनाने का एक उदाहरण है।


Start() विधि में, जिसे ऑब्जेक्ट आरंभ होने पर कहा जाता है, WebSocketServer का एक नया उदाहरण बनाया जाता है, जिसे आपके WebSocket सर्वर के पते के साथ आरंभ किया जाता है। फिर AuthBehaviour WebSocket सेवा को सर्वर में जोड़ा जाता है, जो /Auth पथ पर उपलब्ध है। उसके बाद, सर्वर को Start() विधि का उपयोग करके शुरू किया जाता है।


 using UnityEngine; using WebSocketSharp; using WebSocketSharp.Server; public class WebSocketServer : MonoBehaviour { void Start() { var socket = new WebSocketServer("ws://your-websocket-server-url"); socket.AddWebSocketService<AuthBehaviour>("/Auth"); socket.Start(); } } public class AuthBehaviour : WebSocketBehavior { protected override void OnMessage (MessageEventArgs e) { var playerName = e.Data; Debug.Log("WebSocket client connected: " + playerName); Send("Auth Complete: " + playerName); } }


AuthBehaviour WebSocketBehavior से प्राप्त एक वर्ग है जो क्लाइंट से संदेश प्राप्त करते समय सर्वर व्यवहार को परिभाषित करता है। यहां, OnMessage() विधि को ओवरराइड किया गया है, जिसे तब कहा जाता है जब सर्वर को क्लाइंट से संदेश प्राप्त होता है।


इस पद्धति में, पहले संदेश का पाठ निकाला जाता है, फिर एक संदेश कंसोल पर आउटपुट होता है जो संदेश में दिए गए नाम का उपयोग करके यह दर्शाता है कि कौन सा क्लाइंट कनेक्ट हुआ है। फिर, सर्वर क्लाइंट को एक संदेश भेजता है जिसमें प्रमाणीकरण पूरा होने के बारे में जानकारी होती है।


निष्कर्ष

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