android发送消息到多个udp套接字服务器

时间:2020-07-14 16:15:19

标签: android sockets udp

我正在开发一个Android应用,该应用可控制许多继电器板(每个板4个继电器)。 每个板都有一个IP和一个udp服务器,它们侦听同一端口(8888)。每个板均以相同的命令接收和响应。 我的问题是:当我将命令发送到一个板上并更改为另一块板(在应用程序UI上按按钮)时,会发送命令,但这些命令会继续到达前一个板上(我通过查看以太网LED知道了这一点),然后在10到15秒后开始到达新木板。为什么会这样?

这是我发送命令的课程:

package com.cvega.scjpolinox.comm;

import android.util.Log;
import android.os.Handler;
import android.widget.EditText;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketException;

public class PolyEtherSender implements Runnable {
    private DatagramSocket udpSocket;
    private String strCommand;
    private String ip;
    private Handler handler;
    private EditText etStatus;

    public PolyEtherSender(String ip, String command, Handler handler, EditText etStatus){
        this.strCommand = command;
        this.ip = ip;
        this.handler = handler;
        this.etStatus = etStatus;
    }

    @Override
    public void run() {
        try {
            // target board IP
            InetAddress serverAddr = InetAddress.getByName(this.ip);
            byte[] command = strCommand.getBytes();
            // local socket
            this.udpSocket = new DatagramSocket(null);
            this.udpSocket.setReuseAddress(true);
            this.udpSocket.bind(new InetSocketAddress(8881));
            // command sent to board
            DatagramPacket sendPacket = new DatagramPacket(command, command.length, serverAddr, 8888);
            this.udpSocket.send(sendPacket);

            byte[] response = new byte[4];
            // response
            DatagramPacket responsePacket = new DatagramPacket(response, response.length);
            this.udpSocket.receive(responsePacket);
            if (response[0] == 1) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        etStatus.setText("Open");
                    }
                });
            } else {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        etStatus.setText("Close");
                    }
                });
            }
            this.udpSocket.disconnect();
            this.udpSocket.close();
        } catch (SocketException e) {
            Log.e("Poly", "Socket Error:", e);
        } catch (IOException e) {
            Log.e("Poly", "IO Error:", e);
        }
    }
}

这是UI按钮上的代码(按钮是在While气泡中以编程方式绘制的,取决于用户需要控制多少个板):

            btStart.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String command = "Rele" + valve.getPort() + "ONT" + conf.getDuracionExtraccion();
                    new Thread(new PolyEtherSender(valve.getIp(), command, polyHandler, etStatus)).start();
                }
            });

            btStop.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String command = "Rele" + valve.getPort() + "OFF";
                    new Thread(new PolyEtherSender(valve.getIp(), command, polyHandler, etStatus)).start();
                }
            });

0 个答案:

没有答案