Socket实战——UDP连接

Socket实战系列:
Socket实战——UDP连接:https://blog.****.net/haoranhaoshi/article/details/86601468
Socket实战——TCP连接:https://blog.****.net/haoranhaoshi/article/details/86601522
Socket实战——查询数据库:https://blog.****.net/haoranhaoshi/article/details/86601566
Socket实战——监听数据库:https://blog.****.net/haoranhaoshi/article/details/86601584
Socket实战——聊天:https://blog.****.net/haoranhaoshi/article/details/86601771
Socket实战——文件上传:https://blog.****.net/haoranhaoshi/article/details/86601850 

项目下载地址(IDEA搭建):https://download.****.net/download/haoranhaoshi/10933044

一端监听绑定IP的端口,另一端将数据包发给那一端的IP端口。

Socket实战——UDP连接

package UDP;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.property.SimpleStringProperty;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;

import java.io.IOException;
import java.net.*;

/**
 * 一端监听绑定IP的端口,另端将数据包发给那一端的IP端口
 */
public class UDPReceive extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        Label label = new Label();
        SimpleStringProperty labelContent = new SimpleStringProperty("等待中!");
        label.textProperty().bind(labelContent);
        primaryStage.setTitle("ChatParticipant");
        Pane pane = new Pane(label);
        primaryStage.setScene(new Scene(pane,400, 200));
        primaryStage.setX(100);
        primaryStage.setY(100);
        primaryStage.show();
        new Thread(() -> {
            try {
                // 创建IP:127.0.0.1,端口:10002的Socket监听
                DatagramSocket datagramSocket = new DatagramSocket(10002, InetAddress.getByName("127.0.0.1"));
                while(true){
                    byte[] receivedData = new byte[1024];
                    DatagramPacket datagramPacket = new DatagramPacket(receivedData, receivedData.length);
                    datagramSocket.receive(datagramPacket);
                    // 未收到则后续不执行
                    Platform.runLater(() -> {
                        if(labelContent.get().equals("等待中!")){
                            labelContent.set("");
                        }

                        labelContent.set(labelContent.get() + new String(datagramPacket.getData(), 0 ,datagramPacket.getLength()));
                    });
                }
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (SocketException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }).start();

        primaryStage.addEventHandler(WindowEvent.WINDOW_CLOSE_REQUEST, event -> {
            Platform.exit();
            System.exit(0);
        });
    }
}
package UDP;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;

import java.io.IOException;
import java.net.*;


public class UDPSend extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        Button button = new Button("发送");
        button.setOnAction(event -> {
            byte[] message = "消息已发送!".getBytes();
            try {
                DatagramSocket datagramSocket = new DatagramSocket();
                // 数据包发往IP:127.0.0.1,端口:10002
                DatagramPacket datagramPacket = new DatagramPacket(message, message.length, InetAddress.getByName("127.0.0.1"), 10002);
                datagramSocket.send(datagramPacket);
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (SocketException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
        primaryStage.setTitle("AnotherChatParticipant");
        Pane pane = new Pane(button);
        primaryStage.setScene(new Scene(pane,400, 200));
        primaryStage.setX(500);
        primaryStage.setY(100);
        primaryStage.show();

        primaryStage.addEventHandler(WindowEvent.WINDOW_CLOSE_REQUEST, event -> {
            Platform.exit();
            System.exit(0);
        });
    }
}