2023 में यूनिटी नेटवर्किंग लैंडस्केप पर मेरे जारी है! आज की पोस्ट वास्तविक समय मल्टीप्लेयर गेम में उपयोग किए जाने वाले डेटा ट्रांसमिशन प्रोटोकॉल को कवर करेगी। लेखों की श्रृंखला हर किसी को अभिवादन! मैं दिमित्री इवाशेंको, MY.GAMES में लीड सॉफ्टवेयर इंजीनियर हूं। हम नेटवर्क इंटरैक्शन के विभिन्न स्तरों पर कौन से प्रोटोकॉल मौजूद हैं, इसके संक्षिप्त अवलोकन के साथ शुरुआत करेंगे। सामग्री अवलोकन ओएसआई स्तर प्रसारण नियंत्रण प्रोटोकॉल टीसीपी क्लाइंट टीसीपी सर्वर डेटाग्राम प्रोटेकॉलका उपयोग करें यूडीपी क्लाइंट यूडीपी सर्वर वेबसोकेट वेबसॉकेट क्लाइंट वेबसॉकेट सर्वर निष्कर्ष ओएसआई स्तर ओएसआई (ओपन सिस्टम इंटरकनेक्शन) मॉडल एक वैचारिक मॉडल है जो अमूर्त स्तरों के संदर्भ में संचार प्रणाली के कार्यों को चिह्नित और मानकीकृत करता है। यह मॉडल 1978 में अंतर्राष्ट्रीय मानकीकरण संगठन (आईएसओ) द्वारा विकसित किया गया था। इसमें सात परतें होती हैं: : यह परत चैनल पर कच्चे बिट्स के संचरण और स्वागत से संबंधित है। इस परत पर प्रोटोकॉल भौतिक इंटरफ़ेस और माध्यम की विशेषताओं का वर्णन करते हैं, जिसमें बिट प्रतिनिधित्व, ट्रांसमिशन दर, भौतिक केबल, कार्ड और कनेक्टर डिज़ाइन शामिल हैं। भौतिक परत : यह परत भौतिक माध्यम में डेटा स्थानांतरण प्रदान करती है और भौतिक स्तर पर होने वाली त्रुटियों को संभालती है। डेटा लिंक परत : यह परत नेटवर्क के बीच डेटा ट्रांसमिशन के लिए पथ (रूटिंग) निर्धारित करती है। नेटवर्क परत : यह परत बिंदुओं के बीच संदेश वितरण का प्रबंधन करती है और यदि आवश्यक हो तो विश्वसनीयता प्रदान करती है। ट्रांसपोर्ट परत : यह परत उपयोगकर्ताओं और अनुप्रयोगों के बीच सत्र स्थापना, रखरखाव और समाप्ति का प्रबंधन करती है। सत्र परत : यह परत प्रेषक और रिसीवर पक्षों पर डेटा प्रतिनिधित्व (एन्कोडिंग) में अंतर से डेटा की स्वतंत्रता सुनिश्चित करती है। प्रस्तुति परत : इस परत में ऐसे प्रोटोकॉल शामिल होते हैं जिनका उन एप्लिकेशन से सीधा संबंध होता है जिनके साथ उपयोगकर्ता इंटरैक्ट करता है। एप्लिकेशन परत यह ध्यान देने योग्य है कि प्रत्येक परत पिछली परत पर निर्मित होती है। ट्रांसपोर्ट लेयर (सत्र, प्रस्तुति और एप्लिकेशन) के ऊपर की परतें अत्यधिक विशिष्ट हैं और वास्तविक समय मल्टीप्लेयर को व्यवस्थित करने में हमारी मदद नहीं कर सकती हैं। इसलिए, हमें ट्रांसपोर्ट लेयर पर रुकना होगा और खिलाड़ियों के बीच इष्टतम डेटा विनिमय के लिए इसके टीसीपी और यूडीपी प्रोटोकॉल का उपयोग करना होगा। प्रसारण नियंत्रण प्रोटोकॉल एक कनेक्शन-उन्मुख प्रोटोकॉल है, जिसका अर्थ है कि संचार दो उपकरणों के बीच होता है जो डेटा के आदान-प्रदान के लिए कनेक्शन स्थापित करते हैं। यह प्रोटोकॉल विश्वसनीयता सुनिश्चित करता है क्योंकि यह गारंटी देता है कि सभी प्रसारित डेटा सही क्रम में अपने गंतव्य तक पहुंच जाएगा। यदि ट्रांसमिशन के दौरान कोई डेटा खो जाता है, तो टीसीपी स्वचालित रूप से अनुरोध का पुनः प्रयास करेगा जब तक कि सभी डेटा सफलतापूर्वक प्रसारित न हो जाए। टीसीपी कनेक्शन स्थापित करने में निम्नलिखित चरण शामिल हैं: क्लाइंट और सर्वर टीसीपी पर डेटा के आदान-प्रदान के लिए सॉकेट बनाते हैं। क्लाइंट एक निर्दिष्ट गंतव्य पोर्ट के साथ सर्वर पर एक 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); } क्लाइंट को डेटा भेजने के लिए विधि का उपयोग किया जाता है। यह UTF-8 एन्कोडिंग का उपयोग करके संदेश स्ट्रिंग को बाइट सरणी में परिवर्तित करता है और इस सरणी को नेटवर्क स्ट्रीम पर लिखता है। डेटा भेजने के बाद, विधि स्ट्रीम को साफ़ करती है और भेजे गए संदेश को कंसोल पर आउटपुट करती है। SendData हालाँकि विश्वसनीयता एक बड़े लाभ की तरह लग सकती है, यह टीसीपी सुविधा वास्तविक समय के मल्टीप्लेयर गेम में समस्याएँ पैदा कर सकती है। टीसीपी में डेटा ट्रांसमिशन को रीट्रांसमिशन और फ्लो कंट्रोल के तंत्र द्वारा धीमा किया जा सकता है, जिससे देरी या "लैग्स" हो सकता है। डेटाग्राम प्रोटेकॉलका उपयोग करें यूडीपी एक सरल प्रोटोकॉल है जो डिलीवरी या पैकेट ऑर्डर की गारंटी नहीं देता है। यह इसे टीसीपी की तुलना में बहुत तेज़ बनाता है, क्योंकि यह कनेक्शन स्थापित करने या खोए हुए पैकेट को दोबारा भेजने में समय बर्बाद नहीं करता है। अपनी गति और सरलता के कारण, यूडीपी का उपयोग अक्सर नेटवर्क गेम और अन्य अनुप्रयोगों में किया जाता है जिनके लिए वास्तविक समय डेटा ट्रांसमिशन की आवश्यकता होती है। हालाँकि, यूडीपी का उपयोग करने के लिए डेवलपर्स को डेटा ट्रांसमिशन को अधिक सावधानी से प्रबंधित करने की आवश्यकता होती है। चूंकि यूडीपी डिलीवरी की गारंटी नहीं देता है, इसलिए आपको खोए हुए पैकेटों या ऑर्डर से बाहर आए पैकेटों को संभालने के लिए अपने स्वयं के तंत्र को लागू करने की आवश्यकता हो सकती है। यूडीपी क्लाइंट यह कोड यूनिटी में यूडीपी क्लाइंट के बुनियादी कार्यान्वयन को प्रदर्शित करता है। विधि यूडीपी क्लाइंट को प्रारंभ करती है और इसे आईपी पते और पोर्ट द्वारा निर्दिष्ट रिमोट सर्वर से जोड़ती है। क्लाइंट विधि का उपयोग करके अतुल्यकालिक रूप से डेटा प्राप्त करना शुरू करता है और विधि का उपयोग करके सर्वर को एक संदेश भेजता है। 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# भाषा और लाइब्रेरी का उपयोग करके यूनिटी में WebSocket क्लाइंट को लागू करने का एक उदाहरण प्रदान करता है। WebSocketSharp विधि में, जिसे ऑब्जेक्ट इनिशियलाइज़ेशन पर कहा जाता है, का एक नया उदाहरण बनाया जाता है, जिसे आपके वेबसॉकेट सर्वर के पते के साथ आरंभ किया जाता है। 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); } } सर्वर के साथ कनेक्शन स्थापित होने पर ट्रिगर हो जाता है। इस उदाहरण में, जब कनेक्शन स्थापित होता है, तो "प्लेयर1" टेक्स्ट वाला एक संदेश सर्वर पर भेजा जाता है। OnOpen जब सर्वर से कोई संदेश प्राप्त होता है तो चालू हो जाता है। यहां संदेश प्राप्त होने पर उसकी सामग्री कंसोल में प्रदर्शित होती है। OnMessage फिर, विधि को कॉल किया जाता है, जो एसिंक्रोनस रूप से सर्वर से कनेक्ट होता है। ConnectAsync() वेबसॉकेट सर्वर नीचे दिया गया कोड वेबसॉकेट सर्वर बनाने का एक उदाहरण है। विधि में, जिसे ऑब्जेक्ट आरंभ होने पर कहा जाता है, का एक नया उदाहरण बनाया जाता है, जिसे आपके WebSocket सर्वर के पते के साथ आरंभ किया जाता है। फिर WebSocket सेवा को सर्वर में जोड़ा जाता है, जो पथ पर उपलब्ध है। उसके बाद, सर्वर को विधि का उपयोग करके शुरू किया जाता है। Start() WebSocketServer AuthBehaviour /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() इस पद्धति में, पहले संदेश का पाठ निकाला जाता है, फिर एक संदेश कंसोल पर आउटपुट होता है जो संदेश में दिए गए नाम का उपयोग करके यह दर्शाता है कि कौन सा क्लाइंट कनेक्ट हुआ है। फिर, सर्वर क्लाइंट को एक संदेश भेजता है जिसमें प्रमाणीकरण पूरा होने के बारे में जानकारी होती है। निष्कर्ष हमने चर्चा की है कि टीसीपी, यूडीपी और वेबसॉकेट का उपयोग करके यूनिटी गेम के लिए कनेक्शन कैसे बनाया जाए, साथ ही प्रत्येक के फायदे और नुकसान भी। यूडीपी की हल्की प्रकृति और टीसीपी की विश्वसनीयता के बावजूद, खेलों में वास्तविक समय मल्टीप्लेयर के आयोजन के लिए कोई भी अच्छा विकल्प नहीं है। यूडीपी कुछ डेटा खो देगा, और टीसीपी आवश्यक ट्रांसमिशन गति प्रदान नहीं करेगा। अगले लेख में, हम चर्चा करेंगे कि यूडीपी का उपयोग करके विश्वसनीय डेटा ट्रांसमिशन को कैसे व्यवस्थित किया जाए।