>  기사  >  Java  >  MulticastSocket을 사용하여 그룹 채팅 애플리케이션을 구현하는 Java 프로그래밍

MulticastSocket을 사용하여 그룹 채팅 애플리케이션을 구현하는 Java 프로그래밍

PHPz
PHPz앞으로
2023-04-21 09:40:081775검색

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를 사용하여 컴파일한 다음 지정된 두 명령줄 인수를 사용하여 프로그램을 실행합니다. 멀티캐스트 호스트는 클래스 D IP 주소와 표준 UDP 포트 번호로 지정됩니다. 클래스 D IP 주소 범위는 224.0.0.0부터 239.255.255.255(포함)까지입니다. 주소 224.0.0.0은 예약되어 있으므로 사용하면 안 됩니다.
다음은 위 프로그램의 샘플 출력입니다.

MulticastSocket을 사용하여 그룹 채팅 애플리케이션을 구현하는 Java 프로그래밍

MulticastSocket을 사용하여 그룹 채팅 애플리케이션을 구현하는 Java 프로그래밍

MulticastSocket을 사용하여 그룹 채팅 애플리케이션을 구현하는 Java 프로그래밍

우리는 IP 주소가 239.0.0.0이고 포트 번호가 1234인 멀티캐스트 호스트를 사용하고 있습니다(포트 번호 0~1023은 예약되어 있기 때문입니다). 이 그룹에는 아이언맨, 캡틴아메리카, 그루트 3명의 멤버가 있습니다. 메시지를 보내기 전에 먼저 세 개의 터미널을 모두 시작하십시오. 그렇지 않으면 터미널을 시작하기 전에 보낸 메시지가 손실됩니다(메시지를 저장할 병합된 버퍼가 없기 때문입니다.). 이 애플리케이션에는 두 개의 스레드가 필요합니다. 하나는 사용자 입력을 승인하는 데 사용되며(java.util.Scanner 클래스 사용) 다른 하나는 다른 클라이언트에서 전송된 메시지를 읽는 데 사용됩니다. 따라서 읽기 작업을 수행하는 스레드를 ReadThread 클래스로 분리했습니다. 그룹을 탈퇴하려면 모든 사용자가 종료를 입력하여 세션을 종료할 수 있습니다.

위 프로그램은 단일 머신에서 실행됩니다. 소켓 프로그래밍은 분산 프로그래밍에 적합합니다. 이 요구 사항은 Java가 설치된 다른 컴퓨터에 동일한 코드 조각이 나타날 때 충족됩니다. 이는 가장 기본적인 서비스 로직일 뿐입니다. 이 프로젝트는 프론트엔드가 개발된다면 더욱 매력적이 될 것입니다. Java의 AWT(Abstract Window Toolkit) 또는 이에 상응하는 상위 수준의 Java Swing을 사용하여 프런트 엔드를 개발할 수 있습니다. 이것은 소켓 프로그래밍의 일부가 아니기 때문에 세부 사항을 다루지 않고 그대로 두겠습니다.
추가 사항:

네트워크를 통해 메시지를 보내기 전에 암호화를 수행하여 네트워크 보안 기능을 통합할 수 있습니다.
Caesar Cipher와 같은 원시 기술이나 RSA와 같은 고급 방법을 사용하여 암호화 및 암호 해독을 수행할 수 있습니다. Java의 RMI(Remote Method Invocation)를 사용하여 동일한 작업을 수행해 볼 수 있습니다.
여기서 Java가 제공하는 추상화를 최대한 활용할 수 있습니다. 그러나 주요 목표가 효율성이라면 소켓 프로그래밍이 최선의 선택입니다. 런타임 지원이 필요하지 않으므로 RMI에 비해 속도가 빠릅니다.

위 내용은 MulticastSocket을 사용하여 그룹 채팅 애플리케이션을 구현하는 Java 프로그래밍의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제