当按下按钮时,如何从Android应用程序向节点红色的UDP侦听器发送硬编码字符串?

当按下按钮时,如何从Android应用程序向节点红色的UDP侦听器发送硬编码字符串?,android,udp,Android,Udp,概述 我正在使用Android Studio制作一个应用程序,按下一个按钮,它会向我笔记本电脑上运行的Node Red中的UDP侦听器发送一个字符串,Node Red会过滤任何传入的内容,功能节点会执行它们的操作。此应用程序将在局域网内工作,而不是通过internet 到目前为止,我已经创建了一个带有空活动的新项目,而我的activity_main.xml有一个按钮。用户无需输入字符串/文本,因此按钮按下代码将具有“字符串”和节点红色侦听器IP和端口硬编码 也不需要从笔记本电脑/节点红色端收到回

概述

我正在使用Android Studio制作一个应用程序,按下一个按钮,它会向我笔记本电脑上运行的Node Red中的UDP侦听器发送一个字符串,Node Red会过滤任何传入的内容,功能节点会执行它们的操作。此应用程序将在局域网内工作,而不是通过internet

到目前为止,我已经创建了一个带有空活动的新项目,而我的activity_main.xml有一个按钮。用户无需输入字符串/文本,因此按钮按下代码将具有“字符串”和节点红色侦听器IP和端口硬编码

也不需要从笔记本电脑/节点红色端收到回复,因此按钮按下应该是一个火灾和忘记硬编码消息,因此是UDP,而不是TCP套接字

问题

当按下按钮到节点红色的UDP侦听器时,MainActivity需要什么代码来发送字符串


我花了很长时间在互联网上搜索答案,并尝试了许多代码示例,但它们都不起作用。我看到的很多研究都是关于UDP接收问题的人,但我无法理解他们发送UDP的代码

我终于通过大量的尝试和错误解决了这个问题。。。如果任何其他人遇到相同问题,请参阅下面的代码:

//On button press the message is sent via UDP
    findViewById(R.id.btSendMessage).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int txnumber = Integer.parseInt(((TextView) findViewById(R.id.transmitnumber)).getText().toString());
            String data = ((TextView) findViewById(R.id.texttosend)).getText().toString();
            int port = Integer.valueOf(((TextView) findViewById(R.id.serverport)).getText().toString());
            String address = ((TextView) findViewById(R.id.serverip)).getText().toString();
            SendData(txnumber, data, port, address);

        }
    });



private DatagramSocket UDPSocket;
private InetAddress address;
private int port;

public void Theaddress(InetAddress address) {
    try {
        this.UDPSocket = new DatagramSocket();
        this.address = address;
    } catch (SocketException e) {
        e.printStackTrace();
    }
}

public void SendInstruction(final byte[] data, final int port) {
    new Thread() {
        @Override
        public void run() {
            try {
                DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
                UDPSocket.send(packet);
                DatagramPacket packetreponse = null;
                UDPSocket.receive(packetreponse);
                DisplayData(packetreponse);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }.start();
}

public void SendData(final int nbRepet, final String Sdata , final int port, final String address) {
    new Thread() {
        @Override
        public void run() {
            try {
                Theaddress(InetAddress.getByName(address));
                for (int i = 0; i < nbRepet; i++) {
                    byte[] data = Sdata.getBytes();
                    SendInstruction(data,port);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }.start();
}

public void ReceiveData(final int portNum) {
    new Thread() {
        @Override
        public void run() {
            try {
                final int tally = 1024;
                final byte[] buffer = new byte[tally];
                DatagramSocket socketReceive = new DatagramSocket(portNum);
                while (true) {
                    DatagramPacket data = new DatagramPacket(buffer, buffer.length);
                    socketReceive.receive(data);
                    DisplayData(data);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }.start();
}

public void DisplayData(DatagramPacket data) {
    System.out.println(data);
}
//按下按钮时,消息通过UDP发送
findViewById(R.id.btSendMessage).setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
int txnumber=Integer.parseInt(((TextView)findViewById(R.id.transmitnumber)).getText().toString());
字符串数据=((TextView)findViewById(R.id.texttosend)).getText().toString();
int port=Integer.valueOf(((TextView)findViewById(R.id.serverport)).getText().toString());
字符串地址=((TextView)findViewById(R.id.serverip)).getText().toString();
SendData(TX编号、数据、端口、地址);
}
});
私有数据包UDPSocket;
私人地址;
专用int端口;
公共无效地址(InetAddress地址){
试一试{
this.UDPSocket=new DatagramSocket();
this.address=地址;
}捕获(SocketException e){
e、 printStackTrace();
}
}
公共无效发送指令(最终字节[]数据,最终整数端口){
新线程(){
@凌驾
公开募捐{
试一试{
DatagramPacket数据包=新的DatagramPacket(数据,数据.长度,地址,端口);
UDPSocket.send(数据包);
DatagramPacket PacketResponse=null;
UDPSocket.receive(packetreponse);
显示数据(PacketResponse);
}捕获(例外e){
e、 printStackTrace();
}
}
}.start();
}
public void SendData(final int nbRepet、final String Sdata、final int port、final String address){
新线程(){
@凌驾
公开募捐{
试一试{
地址(InetAddress.getByName(地址));
对于(int i=0;i