最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java使用MulticastSocket實(shí)現(xiàn)群聊應(yīng)用程序

 更新時(shí)間:2022年05月19日 15:15:30   作者:allway2  
這篇文章主要為大家詳細(xì)介紹了Java使用MulticastSocket實(shí)現(xiàn)群聊應(yīng)用程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了Java使用MulticastSocket實(shí)現(xiàn)群聊應(yīng)用程序的具體代碼,供大家參考,具體內(nèi)容如下

在這篇文章中,討論了一個(gè)使用 MulticastSocket (Java Platform SE 7) 類的群聊應(yīng)用程序。MulticastSocket 是一個(gè) (UDP) DatagramSocket,具有加入 Internet 上其他多播主機(jī)“組”的附加功能。

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 編譯它,然后使用指定的兩個(gè)命令行參數(shù)運(yùn)行程序。多播主機(jī)由 D 類 IP 地址和標(biāo)準(zhǔn) UDP 端口號(hào)指定。D 類 IP 地址的范圍為 224.0.0.0 到 239.255.255.255(含)。地址 224.0.0.0 是保留地址,不應(yīng)使用。
以下是上述程序的示例輸出:

我們使用多播主機(jī) IP 地址為 239.0.0.0,端口號(hào)為 1234(因?yàn)槎丝谔?hào) 0 到 1023 被保留)。該組有 3 名成員:Ironman、CaptainAmerica 和 Groot。在發(fā)送消息之前首先啟動(dòng)所有三個(gè)終端,否則在啟動(dòng)終端之前發(fā)送的消息將丟失(因?yàn)闆]有合并緩沖區(qū)來存儲(chǔ)消息。)我們?cè)谶@個(gè)應(yīng)用程序中需要兩個(gè)線程。一個(gè)用于接受用戶輸入(使用 java.util.Scanner 類),另一個(gè)用于讀取從其他客戶端發(fā)送的消息。因此,我將執(zhí)行讀取工作的線程分離到 ReadThreadclass 中。要離開組,任何用戶都可以鍵入退出以終止會(huì)話。

上述程序在單機(jī)上執(zhí)行。套接字編程適用于分布式編程。相同的代碼片段出現(xiàn)在安裝了 Java 的不同機(jī)器上時(shí)可以滿足該要求。這只是最基本的服務(wù)邏輯。如果前端開發(fā)出來,這個(gè)項(xiàng)目會(huì)更加吸引人。您可以使用 Java 的 AWT(抽象窗口工具包)或其高級(jí)對(duì)應(yīng)物 Java Swing 來開發(fā)前端。由于這不是 Socket 編程的一部分,因此我將在不深入了解細(xì)節(jié)的情況下保持不變。
附加點(diǎn):

您可以通過在通過網(wǎng)絡(luò)發(fā)送消息之前執(zhí)行加密來合并網(wǎng)絡(luò)安全功能。
凱撒密碼等原始技術(shù)或 RSA 等高級(jí)方法可用于執(zhí)行加解密。您可以嘗試使用 Java 的 RMI(遠(yuǎn)程方法調(diào)用)來執(zhí)行相同的任務(wù)。
在這里,您可以最大限度地利用 Java 提供的抽象。但是,如果您的主要目標(biāo)是效率,那么 Socket 編程是最佳選擇。由于它不需要任何運(yùn)行時(shí)支持,因此與 RMI 相比要快一些。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring AOP 的組成和實(shí)現(xiàn)

    Spring AOP 的組成和實(shí)現(xiàn)

    這篇文章主要介紹了Spring AOP 的組成和實(shí)現(xiàn),AOP 是一種思想,Spring AOP 是這種思想的具體實(shí)現(xiàn),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • Java本地緩存Caffeine的簡(jiǎn)單使用

    Java本地緩存Caffeine的簡(jiǎn)單使用

    這篇文章主要介紹了Java本地緩存Caffeine的簡(jiǎn)單使用,Caffeine 是基于 JAVA 8 的高性能本地緩存庫,并且在 spring5后,spring 官方放棄了 Guava,而使用了性能更優(yōu)秀的 Caffeine 作為默認(rèn)緩存組件,需要的朋友可以參考下
    2023-12-12
  • Java實(shí)現(xiàn)視頻時(shí)間維度剪切的工具類

    Java實(shí)現(xiàn)視頻時(shí)間維度剪切的工具類

    這篇文章主要為大家詳細(xì)介紹了將視頻按照時(shí)間維度進(jìn)行剪切的Java工具類,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • 淺談log4j 不打印異常堆棧

    淺談log4j 不打印異常堆棧

    這篇文章主要介紹了淺談log4j 不打印異常堆棧,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • 常用數(shù)據(jù)庫的驅(qū)動(dòng)程序及JDBC URL分享

    常用數(shù)據(jù)庫的驅(qū)動(dòng)程序及JDBC URL分享

    這篇文章主要介紹了常用數(shù)據(jù)庫的驅(qū)動(dòng)程序及 JDBC URL,需要的朋友可以看下
    2014-01-01
  • Kotlin 基礎(chǔ)教程之反射

    Kotlin 基礎(chǔ)教程之反射

    這篇文章主要介紹了Kotlin 基礎(chǔ)教程之反射的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Maven配置文件修改及導(dǎo)入第三方j(luò)ar包的實(shí)現(xiàn)

    Maven配置文件修改及導(dǎo)入第三方j(luò)ar包的實(shí)現(xiàn)

    本文主要介紹了Maven配置文件修改及導(dǎo)入第三方j(luò)ar包的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • MybatisPlus實(shí)現(xiàn)insertBatchSomeColumn進(jìn)行批量增加

    MybatisPlus實(shí)現(xiàn)insertBatchSomeColumn進(jìn)行批量增加

    本文主要介紹了MybatisPlus實(shí)現(xiàn)insertBatchSomeColumn進(jìn)行批量增加,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 詳解Java設(shè)計(jì)模式中的裝飾模式

    詳解Java設(shè)計(jì)模式中的裝飾模式

    裝飾模式是指在不改變現(xiàn)有對(duì)象結(jié)構(gòu)的情況下,動(dòng)態(tài)地給該對(duì)象增加一些職責(zé)(即增加其額外功能)的模式,它屬于對(duì)象結(jié)構(gòu)型模式。本文將為大家詳細(xì)介紹一下裝飾模式,感興趣的可以了解一下
    2021-12-12
  • Spring Boot 中啟用定時(shí)任務(wù)的操作方法

    Spring Boot 中啟用定時(shí)任務(wù)的操作方法

    文章主要介紹了如何在Spring Boot中啟用定時(shí)任務(wù),包括使用@EnableScheduling注解、配置項(xiàng)控制定時(shí)任務(wù)是否開啟以及如何關(guān)閉cron定時(shí)任務(wù),感興趣的朋友跟隨小編一起看看吧
    2024-11-11

最新評(píng)論

吉木萨尔县| 溧水县| 孝感市| 体育| 扎赉特旗| 仪征市| 满洲里市| 巴楚县| 苗栗市| 滁州市| 朝阳市| 新河县| 永兴县| 绥滨县| 阿拉善左旗| 资兴市| 托克托县| 旬邑县| 洪洞县| 礼泉县| 通榆县| 新安县| 罗江县| 阆中市| 揭东县| 荔波县| 定西市| 许昌市| 纳雍县| 镇安县| 兴义市| 西城区| 鄂伦春自治旗| 英超| 综艺| 基隆市| 古浪县| 五家渠市| 平陆县| 通渭县| 荣成市|