Java 从android设备广播UDP消息的最有效方式是什么?

Java 从android设备广播UDP消息的最有效方式是什么?,java,android,networking,udp,Java,Android,Networking,Udp,} 这是我现在要向设备发送UDP数据包的代码片段,但是它只适用于部分设备。 我能做些什么来改进这段代码吗 最后,我可以做些什么调整来将我的消息广播到我的以太网网络上的每个设备? 我听说过广播地址,但我是否要用那个广播地址替换“服务器IP” 感谢广播使用广播IPv4地址(IPv6消除了广播,因为它效率低且存在安全风险),您只能在直接连接的网络上广播;您不能从网络广播到其他网络。现代的方法是使用多播,路由器可以配置为多播路由以允许您多播到不同的网络,但路径中的所有路由器都必须配置为多播路由,这与单播

}

这是我现在要向设备发送UDP数据包的代码片段,但是它只适用于部分设备。 我能做些什么来改进这段代码吗

最后,我可以做些什么调整来将我的消息广播到我的以太网网络上的每个设备? 我听说过广播地址,但我是否要用那个广播地址替换“服务器IP”


感谢

广播使用广播IPv4地址(IPv6消除了广播,因为它效率低且存在安全风险),您只能在直接连接的网络上广播;您不能从网络广播到其他网络。现代的方法是使用多播,路由器可以配置为多播路由以允许您多播到不同的网络,但路径中的所有路由器都必须配置为多播路由,这与单播路由非常不同。
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

public static final int SERVERPORT = 1111;
public static final String SERVER_IP = "111.111.1.111";

private LinearLayout msgList;
private EditText edMessage;
private int clientTextColor;

private ClientThread clientThread;
private Thread thread;
private Handler handler;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    msgList = findViewById(R.id.msgList);
    edMessage = findViewById(R.id.edMessage);
    clientTextColor = ContextCompat.getColor(this, R.color.colorAccent);
    handler = new Handler();
}

//////////////////////////////////////////////////////////////////////////////////
/// Just for displaying messages on device ///////////////////////////////////////
public TextView textView(String message, int color) { ... }

public void showMessage(final String message, final int color) {
    handler.post(new Runnable() {
        @Override
        public void run() {
            msgList.addView(textView(message, color));
        }
    });
}
//////////////////////////////////////////////////////////////////////////////////

// Implementation

@Override
public void onClick(View view) {

    if(view.getId() == R.id.clear) {
        msgList.removeAllViews();
    }

    if (view.getId() == R.id.send_data) {
        // Starting thread
        clientThread = new ClientThread();
        thread = new Thread(clientThread);
        thread.start();

        String clientMessage = edMessage.getText().toString().trim(); // Client's Message
        showMessage(clientMessage, Color.BLUE); // Just display
        if (null != clientThread) {
            clientThread.sendMessage(clientMessage + "\r\n");
        }
    }
}

class ClientThread implements Runnable {
    byte[] buffer = new byte[1024];

    @Override
    public void run() {
        try {
            while (true) {
                DatagramSocket ds = new DatagramSocket(SERVERPORT);
                DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
                ds.receive(dp);
                String serverMsg = new String(dp.getData(), 0, dp.getLength());

                if (null == serverMsg || "Disconnect".contentEquals(serverMsg)) {
                    showMessage("Server Disconnected", Color.RED);
                    break;
                }
                showMessage("Server: " + serverMsg, clientTextColor);
                ds.close();
            }
        } catch (UnknownHostException e1) {
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }

    void sendMessage(final String message) { // Called to "Send Data"
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    InetAddress ip = InetAddress.getByName(SERVER_IP);
                    DatagramSocket socket = new DatagramSocket();
                   
                    byte[] msg = message.getBytes();
                    
                    DatagramPacket packet = new DatagramPacket(msg, message.length(),
                            ip, SERVERPORT);
                    socket.send(packet);
                    
                } catch(Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}

@Override
protected void onDestroy() {
    super.onDestroy();
    if (null != clientThread) {
        clientThread.sendMessage("Disconnect");
        clientThread = null;
    }
}