JRakNet هي مكتبة شبكات لـ Java والتي تطبق بروتوكول RakNet القائم على UDP. كان من المفترض أن يتم استخدام هذه المكتبة لخوادم وعملاء لعبة Minecraft، ولكن لا يزال من الممكن استخدامها لإنشاء خوادم وعملاء ألعاب لألعاب الفيديو الأخرى بسهولة. يمكنك أيضًا قراءة JavaDocs
معلومات البروتوكول | إصدار |
---|---|
البروتوكول الحالي | 10 |
بروتوكول الخادم المدعوم | 10 |
بروتوكول العميل المدعوم | 10 |
إذا كنت تستخدم إصدارًا، فاستخدم هذه التبعية:
< dependency >
< groupId >com.whirvis</ groupId >
< artifactId >jraknet</ artifactId >
< version >2.12.3</ version >
</ dependency >
إذا كنت تريد استخدام إصدار لقطة، فاستخدم هذا المستودع والتبعية:
< repository >
< id >codemc-repo</ id >
< url >https://repo.codemc.org/repository/maven-public/</ url >
</ repository >
< dependency >
< groupId >com.whirvis</ groupId >
< artifactId >jraknet</ artifactId >
< version >2.12.4-SNAPSHOT</ version >
</ dependency >
يعد إنشاء خادم في JRakNet أمرًا سهلاً للغاية، ويمكن رؤية كل ما يتطلبه إنشاء خادم هنا:
// Add loopback exemption for Minecraft
if (! UniversalWindowsProgram . MINECRAFT . setLoopbackExempt ( true )) {
System . err . println ( "Failed to add loopback exemption for Minecraft" );
}
// Create server
RakNetServer server = new RakNetServer ( 19132 , 10 );
server . setIdentifier ( new MinecraftIdentifier ( "JRakNet Example Server" , 354 , "1.11" , 0 , 10 ,
server . getGloballyUniqueId (), "New World" , "Survival" ));
// Add listener
server . addListener ( new RakNetServerListener () {
// Client connected
@ Override
public void onConnect ( RakNetServer server , InetSocketAddress address , ConnectionType connectionType ) {
System . out . println ( "Client from address " + address + " has connected to the server" );
}
// Client logged in
@ Override
public void onLogin ( RakNetServer server , RakNetClientPeer peer ) {
System . out . println ( "Client from address " + peer . getAddress () + " has logged in" );
}
// Client disconnected
@ Override
public void onDisconnect ( RakNetServer server , InetSocketAddress address , RakNetClientPeer peer , String reason ) {
System . out . println ( "Client from address " + address
+ " has disconnected from the server for reason " " + reason + " " " );
}
// Packet received
@ Override
public void handleMessage ( RakNetServer server , RakNetClientPeer peer , RakNetPacket packet , int channel ) {
System . out . println ( "Client from address " + peer . getAddress () + " sent packet with ID "
+ RakNet . toHexStringId ( packet ) + " on channel " + channel );
}
});
// Start server
server . start ();
هذا خادم RakNet بسيط يمكن اختباره من خلال Minecraft بالانتقال إلى علامة التبويب "الأصدقاء" حيث يجب أن يظهر الخادم. بمجرد ظهور الخادم، يجب أن تكون قادرًا على النقر عليه لتشغيل الاتصال وخطافات الحزمة.
في نظام التشغيل Windows 10، لا تتمكن التطبيقات التي تستخدم إطار عمل برنامج Windows العالمي افتراضيًا من الاتصال بالخوادم التي تعمل على نفس الجهاز الذي تعمل به. يمكن تعطيل هذه الميزة المزعجة ببساطة عن طريق إنشاء كائن UniversalWindowsProgram
مع المعلمة الأولى والوحيدة وهي معرف التطبيق الذي تريد أن تكون قادرًا على الاتصال به. ومن الأمثلة على ذلك Microsoft Edge وهو Microsoft.MicrosoftEdge_8wekyb3d8bbwe
. لذلك، من أجل تمكين استثناء الاسترجاع، سيستغرق الأمر ما يلي فقط:
UniversalWindowsProgram microsoftEdge = new UniversalWindowsProgram ( "Microsoft.MicrosoftEdge_8wekyb3d8bbwe" );
if (! microsoftEdge . setLoopbackExempt ( true )) {
System . err . println ( "Failed to enable loopback exemption for Microsoft Edge" );
}
بسيطة، أليس كذلك؟ لا تتردد في تنفيذ هذا إذا كنت تعمل على جهاز لا يعمل بنظام التشغيل Windows 10. تم إنشاء هذا التطبيق خصيصًا للعمل حتى إذا كان جهازك لا يعمل بنظام التشغيل Windows 10 أو لم يتم تثبيت Windows PowerShell عليه. بالطبع، إذا لم تكن تستخدم جهازًا يعمل بنظام Windows 10 ومثبت عليه Windows PowerShell، فلا توجد طريقة للتحقق بشكل صحيح مما إذا كان تطبيقك معفى من الاسترجاع. ومع ذلك، أنا متأكد من أنه يمكن حل هذه المشكلة بمساعدة مستخدم لديه نظام التشغيل Windows 10 مع Windows PowerShell إذا لزم الأمر.
من السهل أيضًا إنشاء عميل في JRakNet. يمكن رؤية الكود المطلوب لإنشاء العميل هنا:
// Create client
RakNetClient client = new RakNetClient ();
// Add listener
client . addListener ( new RakNetClientListener () {
// Connected to server
@ Override
public void onConnect ( RakNetClient client , InetSocketAddress address , ConnectionType connectionType ) {
System . out . println ( "Successfully connected to server with address " + address );
}
// Logged into server
@ Override
public void onLogin ( RakNetClient client , RakNetServerPeer peer ) {
System . out . println ( "Successfully logged into server" );
client . disconnect ();
}
// Disconnected from server
@ Override
public void onDisconnect ( RakNetClient client , InetSocketAddress address , RakNetServerPeer peer , String reason ) {
System . out . println ( "Successfully disconnected from server with address " + address + " for reason " " + reason + " " " );
}
});
// Connect to server
client . connect ( "sg.lbsg.net" , 19132 );
هذا عميل RakNet بسيط يحاول الاتصال بخادم LBSG الرئيسي. عندما يتم توصيله، فإنه يغلق الاتصال.