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은 예약되어 있으므로 사용하면 안 됩니다.
다음은 위 프로그램의 샘플 출력입니다.
우리는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!