1

为什么 UDP Android 只发送一次 [请帮助]

名称类 MainActivity

public class MainActivity extends Activity implements
    android.view.View.OnClickListener {
public static final String SERVERIP = "192.168.5.255";
public static final int SERVERPORT = 4444;
public TextView text1;
public EditText input;
public Button btn;
public boolean start;
public Handler Handler;

与电脑连接

这个方法在创建

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    text1 = (TextView) findViewById(R.id.textView1);
    input = (EditText) findViewById(R.id.editText1);
    btn = (Button) findViewById(R.id.button1);
    btn.setOnClickListener(this);
    start = false;
    new Thread(new Server()).start();
    try {
        Thread.sleep(500);
    } catch (InterruptedException e) {

    }
    new Thread(new Client()).start();
    Handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            String text = (String) msg.obj;
            text1.append(text);
        }
    };
}

此类客户端

@SuppressLint("NewApi")
public class Client implements Runnable {
    @Override
    public void run() {
        while (start == false) {
        }
        try {
            Thread.sleep(500);
        } catch (InterruptedException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        try {
            InetAddress serverAddr = InetAddress.getByName(SERVERIP);
            updatetrack("Client: Start connecting\n");
            DatagramSocket socket = new DatagramSocket();
            byte[] buf;
            if (!input.getText().toString().isEmpty()) {
                buf = input.getText().toString().getBytes();
            } else {
                buf = ("Default message").getBytes();
            }
            DatagramPacket packet = new DatagramPacket(buf, buf.length,
                    serverAddr, SERVERPORT);
            updatetrack("Client: Sending ‘" + new String(buf) + "’\n");
            socket.send(packet);
            updatetrack("Client: Message sent\n");
            updatetrack("Client: Succeed!\n");
        } catch (Exception e) {
            updatetrack("Client: Error!\n");
        }
    }
}

此类客户端

public class Server implements Runnable {
    @Override
    public void run() {
        while (start = false) {

            try {
                InetAddress serverAddress = InetAddress.getByName(SERVERIP);
                updatetrack("nServer: Start connectingn");
                DatagramSocket socket = new DatagramSocket(SERVERPORT,
                        serverAddress);
                byte[] buffer = new byte[17];
                DatagramPacket packet = new DatagramPacket(buffer,
                        buffer.length);
                updatetrack("Server: Receivingn");
                socket.receive(packet);
                updatetrack("Server: Message received:"
                        + new String(packet.getData()) + "'n");
                updatetrack("Server : Succed!n");

            } catch (Exception e) {
                updatetrack("Server: Error!n" + e.getMessage());
            }

        }
    }
}

public void updatetrack(String s) {
    Message msg = new Message();
    String textTochange = s;
    msg.obj = textTochange;
    Handler.sendMessage(msg);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    if (v.getId() == R.id.button1)
        start = true;

}

}

如果我用我的班级服务器

    while (true){

应用程序错误

请帮帮我 ?为什么只发一次消息谢谢

4

1 回答 1

0

对于 Client 类,循环中没有任何内容:

while (start == false) {
}

然后在它之外,你只调用一次发送——这就是它只发送一次的原因。

socket.send(packet);

如果您想连续调用发送,那么一种方法是将其保持在循环中。当然,一旦任务完成,您将需要终止循环,但这将由您的应用程序逻辑驱动。

于 2013-09-18T05:51:09.310 回答