在Android中同时使用Datagramsocket发送和接收-仅发送?

 ANANREMEMBERO38_810 发布于 2023-01-02 15:56

我在一个线程中使用DatagramSocket来接收数据,在另一个线程中使用DatagramSocket将数据发送到PC(Java)。但它仅每1秒发送一次数据,但不会接收。但是当我在发送代码后将接收代码放在同一线程中时...它可以工作...但是我想每秒发送一次数据并同时等待任何数据...

编辑:我发现问题是我无法在两个不同的线程中打开端口。现在我的问题是,如何才能DatagramSocket.Receive()每1秒取消一次并发送数据,然后又返回接收呢?

public class MainActivity extends ActionBarActivity {

TextView status;
GPSTracker gps;
boolean started = false;
boolean waitting = false;
String mess = "Waiting ...";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    status = (TextView) findViewById(R.id.status);

    gps = new GPSTracker(MainActivity.this);

    Timer time = new Timer(); // Instantiate Timer Object
    ScheduledTask st = new ScheduledTask(); 
    time.schedule(st, 0, 1000); // Create Repetitively task for every 1 secs
}

public class SendThread implements Runnable {
    private DatagramSocket mySocket;

    public void run() {
        try {
            InetAddress receiverHost = InetAddress.getByName("192.168.0.1");
            int receiverPort = Integer.parseInt("8080");
            String message = "Lat:0-Long:0";
            if (gps.canGetLocation()) {
                double latitude = gps.getLatitude();
                double longitude = gps.getLongitude();
                message = "Lat:" + latitude + "-Long:" + longitude;
            } else {
                gps.showSettingsAlert();
            }
            mySocket = new DatagramSocket();
            byte[] sendBuffer = message.getBytes();
            DatagramPacket packet = new DatagramPacket(sendBuffer,
                    sendBuffer.length, receiverHost, receiverPort);
            mySocket.send(packet);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

public class RecieveThread implements Runnable {
    public void run() {
        try {
            Log.i("1", "1");
            DatagramSocket mySocket = new DatagramSocket(8080);
            waitting = true;
            // to receive a message
            int MESSAGE_LEN = 60;
            byte[] recvBuffer = new byte[MESSAGE_LEN];
            DatagramPacket datagram = new DatagramPacket(recvBuffer,
                    MESSAGE_LEN);
            Log.i("2", "2");
            mySocket.receive(datagram);
            Log.i("Recieved", "Recieved");
            String recvdString = new String(recvBuffer);
            mess = recvdString;
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    status.setText(mess);
                }
            });
            mySocket.close();
            waitting = false;
        } catch (Exception e) {
            waitting = false;
            e.printStackTrace();
        }
    }
}

public class ScheduledTask extends TimerTask {
    public void run() {
        if (!waitting) {
            Thread rThread = new Thread(new RecieveThread());
            rThread.start();
        }
        Thread sThread = new Thread(new SendThread());
        sThread.start();
    }
}
}

user3157047.. 5

我找到了答案:我使用了两个不同的套接字,一个用于通过端口发送数据,另一个用于从同一端口接收数据。(两个不同的线程),但是第一个应该连接到该端口,第二个应该绑定到该端口。一切都很好。

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有