コードは以下の通りです
1つの パッケージ测试。 2 3 インポートにjava.io.IOException。 4 インポートjava.net.DatagramPacket。 5 輸入java.net.InetAddress。 6 インポートjava.net.MulticastSocket。 7 インポートjava.text.SimpleDateFormatの。 8 インポートjava.util.Date; 9 インポートjava.util.Optional。 10 11 インポートjavafx.application.Application。 12 インポートjavafx.event.ActionEvent。 13 インポートjavafx.scene.Scene。 14 インポートjavafx.scene.control.Alert; 15 インポートjavafx.scene.control.Button。 16 インポートjavafx.scene.control.ButtonType。 17 インポートjavafx.scene.control.ScrollPane。 18 インポートjavafx.scene.control.TextArea。 19 インポートjavafx.scene.control.TitledPane。 20 インポートjavafx.scene.layout.AnchorPane。 21 インポートjavafx.scene.layout.VBox。 22 インポートjavafx.stage.Stage。 23の 24 パブリック クラス FX_UDPは延びアプリケーション{ 25 静的InetAddressのIA; 26 静的MulticastSocketのソケット。 27 静的のTextArea ta_1、ta_2。 28 パブリック 静的 ボイドメイン(文字列[]引数){ 29 のtry { 30 、IA = InetAddress.getByName( "228.9.6.7" )。 31 ソケットは= 新しい MulticastSocketのを(6770 )。 32 socket.joinGroup(IA)。 33 FX_UDPのfu = 新しいFX_UDP()。 34 Private_recive C = FU。新しいPrivate_recive(ソケット)。 35 c.start(); 36 } キャッチ(IOExceptionをE1){ 37 のSystem.out.println( "マルチキャストアドレスが失敗した結合" ); 38である } 39 Application.launch(); 40 } 41である @Override 42は 公共 ボイド(スタートステージS)スロー例外{ で43 // メソッドTODOが自動的に生成されたスタブ 44 / * メッセージレコード* / 45 ta_1 = 新しい新規のTextArea(); 46である ta_1.setPrefSize(400、200である); 47 = Pane_infoのScrollPane 新しい新規のScrollPane(ta_1); 48 TitledPane pane_01 = 新しい新 TitledPane( "伝言メモ" 、pane_info); 49 / * 透過窓* / 50 ta_2 = 新しい新規のTextArea(); 51である ta_2.setPrefSize(400、100 ); 52のIS =のScrollPane pane_send 新しい新規のScrollPane(ta_2)を、 53である TitledPane pane_02 = 新しい新 TitledPane( "透過窓" ;、pane_send) 54である / * 送信ボタンイベント* / 55 ボタンbtn_send = 新しい新しいボタン( "送信"); 56は、 btn_send.setOnAction(本:: btnSend); 57である / * 閉じるとボタンイベント* / 58 ボタンbtn_close = 新しい新しいボタン( "閉じる" ;) 59 btn_close.setOnAction(本:: btnClose); 60 / * ボタンのサイズは、* / 61である btn_send.setPrefSize(70、30 ); 62である btn_close.setPrefSize(70、30 ); 63である / * ボタンの位置* / 64 AnchorPane.setTopAnchor(btn_close、350.0 ); 65 AnchorPane.setLeftAnchor(btn_close、100.0 )。 66 AnchorPane.setTopAnchor(btn_send、350.0 )。 67 AnchorPane.setLeftAnchor(btn_send、200.0 ); 68 69 のVBox VB = 新規のVBox(pane_01、pane_02)。 70 71 AnchorPane apane = 新しいAnchorPane(VB、btn_send、btn_close)。 72 73 シーンのシーン= 新しいシーン(apane)。 74 s.setScene(シーン)。 75 s.setHeight(500 )。 76 s.setWidth(420 )。 77 s.show(); 78 } 79 / * 送信ボタンイベント* / 80 公共 ボイドbtnSend(のActionEvent enent){ 81 のtry { 82 列MSG = ta_2.getText(); 83 のDatagramPacket Pのは= 新しい新)(Msg.getBytes(のDatagramPacketのを、Msg.getBytes()長さ、IA、6770. ); 84 socket.send(P); 85 } キャッチ(IOExceptionをE){ 86 // TODO自動生成されたcatchブロック 87 e.printStackTrace(); 88 } 89 } 90 公共 ボイドbtnClose(のActionEventイベント){ 91 アラートアラート= 新しいアラート(Alert.AlertType.CONFIRMATION)。 92 alert.setTitle( "退出" )。 93 alert.setHeaderText( "你是否要退出" )。 94 オプションの<ButtonType>結果= alert.showAndWait()。 95 であれば(result.get()== ButtonType.OK){ 96 はSystem.exit(0 ); 97 } 他{ 98 event.consume()。 99 } 100 } 101 クラス Private_reciveは延びスレッド{ 102 MulticastSocketのソケット。 103 公衆Private_recive(MulticastSocketのS){ 104 この .socket = S。 105 } 106 @Override 107 公共 ボイドラン(){ 108 バイト [] BUF = 新しい バイト [100 ]。 109 のDatagramPacket RECV = 新規のDatagramPacket(BUF、buf.length)。 110 日の日= 新しい日付(); 111 SimpleDateFormat DF = 新しいてSimpleDateFormat( "YYYY-MM-DD HH:MM:SS" )。 112 のtry { 113 ながら(真){ 114 socket.receive(RECV)。 115 文字列str = 新しい文字列(recv.getData()、0 、recv.getLength())。 116 ta_1.appendText(df.format(日)+ "\ n"は); 117 ta_1.appendText(STR + "\ n" ); 118 } 119 } キャッチ(IOExceptionをE1){ 120 System.out.println( "受信に失敗しました" ); 121 } 122 } 123 } 124 }
結果は: