Приложение группового чата на Java

Опубликовано: 15 Июля, 2021

В этом посте обсуждается приложение группового чата, использующее класс 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... " );
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 port; int
private static final int MAX_LEN = 1000 ;
ReadThread(MulticastSocket socket,InetAddress group, port) int
{
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 участника: Ironman, CaptainAmerica и Groot. Перед отправкой сообщения сначала запустите все три терминала, в противном случае сообщения, отправленные перед запуском терминала, будут потеряны (поскольку для хранения сообщений нет встроенного буфера). Нам нужны два потока в этом приложении. Один для приема пользовательского ввода (с использованием класса java.util.Scanner), а другой для чтения сообщений, отправленных от других клиентов. Поэтому я разделил поток, который выполняет чтение, в ReadThreadclass. Для выхода из группы любой пользователь может ввести Exit, чтобы завершить сеанс.

Вышеупомянутая программа выполняется на одной машине. Программирование сокетов предназначено для распределенного программирования. Один и тот же фрагмент кода, если он присутствует на разных машинах, на которых установлена Java, может удовлетворить это требование. Это всего лишь простая логика обслуживания. Проект был бы еще интереснее, если бы интерфейс был разработан. Вы можете использовать Java AWT (Abstract Window Toolkit) или его расширенный аналог Java Swing для разработки внешнего интерфейса. Поскольку это не будет частью программирования Socket, я оставлю его нетронутым, не вдаваясь в подробности.
Дополнительные пункты:

  • Вы можете включить функцию сетевой безопасности, выполнив шифрование перед отправкой сообщения по сети.
  • Примитивные методы, такие как шифр Цезаря, или расширенные методы, такие как RSA, могут использоваться для выполнения шифрования-дешифрования. Вы можете попробовать использовать Java RMI (Remote Method Invocation) для выполнения той же задачи.
  • Здесь вы можете максимально использовать абстракцию, предлагаемую Java. Однако, если ваша основная цель - эффективность, то программирование с использованием сокетов - лучший выбор. Поскольку он не требует поддержки во время выполнения, он немного быстрее по сравнению с RMI.

Эта статья предоставлена Aditya ch . Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью с помощью provide.geeksforgeeks.org или отправить ее по электронной почте на deposit@geeksforgeeks.org. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.