0

我是 Android 和 Java 编程的新手。我将来必须做一个更大的项目,包括一些 android 开发。所以我看了一些视频教程,现在我正在尝试做一些应用程序来训练自己。现在我想用 UDP 在两个 Android 设备(摩托罗拉 Defy 和三星 Galaxy Tab 2 7.0)之间建立一个聊天服务。

这是我的两种设备的代码:

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

 import android.app.Activity;
 import android.os.Bundle;
 import android.view.View;
 import android.widget.Button;
 import android.widget.EditText;
 import android.widget.TextView;

 public class udpserver extends Activity implements View.OnClickListener {

Button Send;
EditText IPAdresse;
EditText TEXT;
TextView RXtext,tstep,rstep;
private static final int TIMEOUT_MS = 1000;
private static final int server_port = 13011;
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.udpserver);

    IPAdresse = (EditText) findViewById(R.id.etIPAdresse);
    TEXT = (EditText) findViewById(R.id.etTEXT);
    Send = (Button) findViewById(R.id.bSendaa);
    RXtext = (TextView) findViewById(R.id.tvRXtext);
    tstep = (TextView) findViewById(R.id.tvTstep);
    rstep = (TextView) findViewById(R.id.tvRstep);
    Send.setOnClickListener(this);


    String text;
    byte[] message = new byte[1500];
    DatagramSocket s;


    //while(true){
    try {
        s= new DatagramSocket(server_port);
                                                    rstep.setText("1");
        s.setBroadcast(true);
                                                    rstep.setText("2");
        s.setSoTimeout(TIMEOUT_MS);
                                                    rstep.setText("3");
        while(true){
        DatagramPacket p = new DatagramPacket(message, message.length);
                                                    rstep.setText("4");
        //InetAddress test = InetAddress.getByName("192.168.1.101");
            //                                      rstep.setText("5");
        //s.connect(test,12345);
            //                                      rstep.setText("6");
        s.receive(p);
                                                    rstep.setText("xxx");

        text = new String(message, 0, p.getLength());
        RXtext.setText(text);
        }
    } catch (SocketException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        rstep.setText("fail socket create");
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        rstep.setText("fail receive");
    }

    }
//}






public void onClick(View arg0) {
    // TODO Auto-generated method stub
    switch(arg0.getId()){
    case R.id.bSendaa:
                                                                tstep.setText("1");
        String messageStr= TEXT.getText().toString();
                                                                tstep.setText("2");

        DatagramSocket s;
        try {
            s = new DatagramSocket();
                                                                tstep.setText("3");
            s.setBroadcast(true);
                                                                tstep.setText("4");
            s.setSoTimeout(TIMEOUT_MS);
                                                                tstep.setText("5");
            InetAddress local = InetAddress.getByName(IPAdresse.getText().toString());
                                                                tstep.setText("6");
            int msg_length=messageStr.length();
                                                                tstep.setText("7");
            byte[] message = messageStr.getBytes();
                                                                tstep.setText("8");
            DatagramPacket p = new DatagramPacket(message, msg_length,local,server_port);
                                                                tstep.setText("9");
            s.connect(local,server_port);
                                                                tstep.setText("10");
            s.send(p);
                                                                tstep.setText("sending complete");


        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            tstep.setText("sending failed");
        }



    }
}

}

我的用户界面看起来像这样(带翻译)

在此处输入图像描述

我现在的问题是:我只能在活动开始时收到 1 秒(1 秒 = TIMOUT_MS)。但我想收到整个时间。我尝试使用 while(true) 循环,但应用程序总是崩溃。

提前致谢!!!(对不起我的英语,我知道它不是最好的:))

4

1 回答 1

0

发生的事情是,当您执行 while(true) 时,您将陷入无限循环。这就是你的应用崩溃的原因。您需要做的是启动一个执行 s.receive(p) 的新线程。就像是:

new Thread(new Runnable() {
     public void run() {

       while(true){
        DatagramPacket p = new DatagramPacket(message, message.length);
                                                    rstep.setText("4");
        //InetAddress test = InetAddress.getByName("192.168.1.101");
            //                                      rstep.setText("5");
        //s.connect(test,12345);
            //                                      rstep.setText("6");
        s.receive(p);
                                                    rstep.setText("xxx");

        text = new String(message, 0, p.getLength());
        runOnUiThread(new Runnable() {

        @Override
        public void run() {
          RXtext.setText(text);
        }
    });

                }
}).start();
于 2012-07-25T13:04:40.450 回答