تطبيق دردشة جماعية في Java
في هذا
المنشور ، تمت مناقشة تطبيق دردشة جماعية يستخدم فئة MulticastSocket (Java Platform SE 7). MulticastSocket هو (UDP) DatagramSocket ، مع إمكانات إضافية للانضمام إلى "مجموعات" من مضيفي
البث المتعدد الآخرين على الإنترنت.
التنفيذ
import java.net.*;
import java.io.*;
import java.util.*;
public class GroupChat
{
private static final String
TERMINATE = "Exit";
static String
name;
static volatile boolean finished
= false;
public static void main(String[]
args)
{
if (args.length
!= 2)
System.out.println("Two
arguments required: <multicast-host> <port-number>");
else
{
try
{
InetAddress
group = InetAddress.getByName(args[0]);
int port
= Integer.parseInt(args[1]);
Scanner
sc = new Scanner(System.in);
System.out.print("Enter
your name: ");
name
= sc.nextLine();
MulticastSocket
socket = new MulticastSocket(port);
//
Since we are deploying
socket.setTimeToLive(0);
//this
on localhost only (For a subnet set it as 1)
socket.joinGroup(group);
Thread
t = new Thread(new
ReadThread(socket,group,port));
//
Spawn a thread for reading messages
t.start();
//
sent to the current group
System.out.println("Start
typing messages...\n");
while(true)
{
String
message;
message
= sc.nextLine();
if(message.equalsIgnoreCase(GroupChat.TERMINATE))
{
finished
= true;
socket.leaveGroup(group);
socket.close();
break;
}
message
= name + ": " + message;
byte[]
buffer = message.getBytes();
DatagramPacket
datagram = new
DatagramPacket(buffer,buffer.length,group,port);
socket.send(datagram);
}
}
catch(SocketException
se)
{
System.out.println("Error
creating socket");
se.printStackTrace();
}
catch(IOException
ie)
{
System.out.println("Error
reading/writing from/to socket");
ie.printStackTrace();
}
}
}
}
class ReadThread implements Runnable
{
private MulticastSocket
socket;
private InetAddress
group;
private int port;
private static final int MAX_LEN
= 1000;
ReadThread(MulticastSocket
socket,InetAddress group,int port)
{
this.socket
= socket;
this.group
= group;
this.port
= port;
}
@Override
public void run()
{
while(!GroupChat.finished)
{
byte[]
buffer = new byte[ReadThread.MAX_LEN];
DatagramPacket
datagram = new
DatagramPacket(buffer,buffer.length,group,port);
String
message;
try
{
socket.receive(datagram);
message
= new
String(buffer,0,datagram.getLength(),"UTF-8");
if(!message.startsWith(GroupChat.name))
System.out.println(message);
}
catch(IOException
e)
{
System.out.println("Socket
closed!");
}
}
}
}
احفظ
الملف باسم GroupChat.java وقم بترجمته باستخدام javac ثم قم
بتشغيل البرنامج باستخدام وسيطتي سطر أوامر كما هو محدد. يتم تحديد مضيف البث
المتعدد بواسطة عنوان IP من الفئة D ورقم منفذ UDP قياسي. تقع
عناوين IP للفئة D في النطاق
من 224.0.0.0 إلى 239.255.255.255 ، ضمناً. العنوان 224.0.0.0 محجوز ويجب عدم
استخدامه.
فيما يلي نموذج لإخراج البرنامج أعلاه:
لقد
استخدمنا عنوان IP لمضيف الإرسال المتعدد كـ
239.0.0.0 ورقم المنفذ كـ 1234 (نظرًا لأن أرقام المنافذ من 0 إلى 1023 محجوزة).
هناك 3 أعضاء في المجموعة: الرجل الحديدي ، CaptainAmerica ، و Groot. ابدأ تشغيل
جميع المحطات الثلاثة أولاً قبل إرسال الرسالة ، وإلا فستفقد الرسائل التي يتم
إرسالها قبل بدء تشغيل الجهاز الطرفي (نظرًا لعدم وجود وسيلة تخزين مؤقت مدمجة
لتخزين الرسائل). أحدهما لقبول إدخال المستخدم (باستخدام فئة java.util.Scanner) والآخر لقراءة الرسائل المرسلة من عملاء آخرين. ومن ثم قمت بفصل
الخيط الذي يقوم بعمل القراءة في ReadThreadclass. لمغادرة
المجموعة ، يمكن لأي مستخدم كتابة خروج لإنهاء الجلسة.
يتم تنفيذ
البرنامج أعلاه على جهاز واحد. برمجة المقبس مخصصة للبرمجة الموزعة. يمكن أن يفي
نفس الجزء من مقتطف الشفرة عند وجوده على أجهزة مختلفة مثبت عليها Java بهذا
المطلب. هذا مجرد منطق خدمة العظام المجردة. سيكون المشروع أكثر روعة إذا تم تطوير
الواجهة الأمامية. يمكنك استخدام Java's AWT (مجموعة
أدوات النافذة المجردة) أو نظيرتها المتقدمة ، Java Swing لتطوير الواجهة الأمامية. نظرًا لأن هذا لن يكون جزءًا من برمجة Socket ، فأنا
أتركه كما هو دون الخوض في التفاصيل.
يمكنك دمج
ميزة أمان الشبكة عن طريق إجراء التشفير قبل إرسال الرسالة عبر الشبكة.
يمكن
استخدام التقنيات البدائية مثل تشفير قيصر أو الطرق المتقدمة مثل RSA لأداء فك
التشفير. يمكنك محاولة استخدام Java's RMI (استدعاء
الطريقة عن بُعد) لأداء نفس المهمة.
هنا ،
يمكنك الاستفادة من التجريد الذي توفره Java إلى أقصى
حد. ومع ذلك ، إذا كان هدفك الأساسي هو الكفاءة ، فإن برمجة Socket هي الخيار
الأفضل. نظرًا لأنه لا يتطلب أي دعم لوقت التشغيل ، فهو أسرع قليلاً مقارنةً بـ RMI.